zigbee的cc2530超声波测距
(一)ZigBee通过超声波传感器水深采集
本模块主要实现通过单个zigbee终端节点驱动超声波模块采集液位深度信息回传到PC机上显示。
1.CC2530介绍
本创新项目使用的Zigbee芯片为CC2530,它集成了业界领先的高性能RF收发器、增强型工业标准的8051微控制器,具有接收灵敏度高和抗干扰性强的特点。CC2530根据需要有四种不同FLash版本:CC2530F32/64/128/256,本次选择Flash为256K的片子。它具有多种运行模式以及短的模式切换时间,保证了其超低功耗的特点。CC2530的结构大致可以分为三块:CPU和存储模块、电源时钟及外部设备模块、无线模块(图1-1为CC2530最小系统)。主要特点如下:
(1).高性能、低功耗的8051微控制器内核;
(2).适应2.4 GHz IEEE 802.15.4的RF收发器;
(3).电源电压范围宽(2.0~3.6 V);
(4).看门狗、电池监视器和温度传感器;
(5).具有8路输入 8~14位ADC;
(6).2个支持多种串行通信协议的 USART, 1个红外发生电路;
(7).个通用的16位和2个8位定时器;
(8).高级加 密标准(AES)协处理器;
(9).1个通用 I/O 引脚,2个具有20 mA的电流吸收或电流
供给能力;
(10).小尺寸QLP-40封装,6 mm×6 mm。
图2-1CC2530最小系统 2超声波测距模块简介
超声波模块使用的是US-100,本模块可实现2cm~4.5m的非接触测距功能,拥有2.4~5.5V的宽电压输入范围,静态功耗低于2mA,自带温度传感器对测距结果进行校正,同时具有GPIO,串口等多种通信方式,内带看门狗,工作稳定可靠。
主要技术参数:
超声波测距系统通过zigbee模块的cc2530芯片向通过串口超声波探头的引脚TX发送一个0x55的指令,超声波探头发射超声波,超声波向前传播。当超声
波遇到障碍物时会反射回来,进行相关数据处理,RX引脚输出,将测得的距离的数据发送给zigbee模块。
为了验证测得数据是否准确,我们通过串口将RX输出的数据进行显示(图2-1为实测图)。
图2-1串口测试超声波模块
本模块有两种测距方式:电平触发测距,串口触发测距。我们选择的是串口触发测距方式。
在模块上电前,首先插上模式选择跳线上的跳线帽,使模块处于串口触发模式。在此模式下只需要在Trig/TX管脚输入0X55(波特率9600),系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX管脚输出。 输出的距离值共两个字节,第一个字节是距离的高8位(HDate),第二个字节为距离的低8位(LData),单位为毫米。即距离值为
(HData*256 +LData)mm(图2-1为US-100超声波模块时序图,图2-2为超声波模块实物图)
图2-1 US-100超声波模块时序图
图2-2 超声波测距模块实物图
系统的设计思路 :
图2-3系统框图
3.实验测试代码程序
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define RX0 P0_2
#define TX0 P0_3
//函数声明
void Delayms(uint xms); //延时函数
void InitUart(); //初始化串口
void UartSend_String(char *Data,int len);
char temp;
char flag=0;
int data1,data2,data;
char Txdata[5]; //存放数据
char str[5];
/****************************
延时函数
*****************************/
void Delayms(uint xms) //i=xms 即延时i毫秒 (16M晶振时候大约数,32M需要修改,系统不修改默认使用内部16M)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/**************************************************************** 串口初始化函数
***********************************************************/ void InitUart()
{
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定 CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口,第二功能 P2DIR &= ~0XC0; //P0 优先作为UART0 ,优先级
U0CSR |= 0x80; //UART 方式
U0GCR |= 8; //U0GCR与U0BAUD配合
U0BAUD |= 59; // 波特率设为115200
UTX0IF = 0; //UART0 TX 中断标志初始置位1 (收发时候) U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; // 开总中断,接收中断
}
/***************************
//主函数
***************************/
void main(void)
{
InitUart();
while(1)
{
U0CSR &= ~0x40; //禁止接收
U0DBUF = 0x55;
while(UTX0IF == 0); //发送完成标志位
UTX0IF = 0;
U0CSR |= 0x40; //允许接收
while(!flag);
flag=0;
// U0DBUF=temp;
data1=temp*256;
// while(UTX0IF == 0); //发送完成标志位
// UTX0IF = 0;
while(!flag);
flag=0;
// U0DBUF=temp;
data2=data1+temp;
// while(UTX0IF == 0); //发送完成标志位
// UTX0IF = 0;
data=(int)data2;
str[0]=(char)(data/1000)+0x30;//十进制显示
str[1]=(char)(data/100%10)+0x30;
str[2]=(char)(data/10%10)+0x30;
str[3]=(char)(data%10)+0x30;
str[4]=32;
strcpy(Txdata,str); //将发送内容copy到Txdata;
UartSend_String(Txdata,5);//串口发送数据
Delayms(1000);
}
}
/**************************************************************** 串口接收一个字符: 一旦有数据从串口传至CC2530, 则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/ #pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
temp = U0DBUF;
flag=1;
}
/**************************************************************** 串口发送字符串函数
****************************************************************/ void UartSend_String(char *Data,int len)
{
int j;
for(j=0;j
U0DBUF = *Data++; while(UTX0IF == 0); UTX0IF = 0; }
}
下图最终的测试实物图