基于ZigBee的数据采集与无线传输实验.docx
《基于ZigBee的数据采集与无线传输实验.docx》由会员分享,可在线阅读,更多相关《基于ZigBee的数据采集与无线传输实验.docx(24页珍藏版)》请在冰点文库上搜索。
基于ZigBee的数据采集与无线传输实验
2016-2017学年第二学期
课程实验报告
课程名称:
无线传感网络
实验名称:
XX
班级
学号
同组同学
实验课表现
出勤、表现得分25%
25
实验报告
得分50%
实验总分
操作结果得分25%
实验目的
了解ZigBee的工作原理和技术特点,利用CC2530芯片开发一个简单的ZigBee组网通信实验。
实验内容
以小组为单位,利用CC2530芯片部署无线传感网络实验,分别设计采集节点、汇聚节点的程序,采集节点采集温度信息,并通过无线信道传输给汇聚节点。
汇聚节点再将温度数据通过串口传输给上位机(PC机)。
要求自己设计通信协议,实现上位机对监控区域的定时和实时温度数据采集。
实验过程中遇到的问题以与如何解决的?
(可以写多条,是否认真填写将影响实验成绩)
在实验过程中我遇到了
1、能接收后遇到很多的噪声干扰并且不能接收自己发送的信息
2、接收到自己的信息后仍然有很多的噪声干扰出现了很多的乱码
3、接收自己的信息也被转换成乱码
4、遇到了选择性接收上的技术问题
5、温度的acsii码转换错误
通过.......的方式,我解决了这个问题。
1、修改了接收代码并确认发送代码没毛病
2、尝试修改信道
3、检查到接收子程序有问题并修改了
4、老师建议我们使用选择性接收
5、通过组员合作研究讨论并上网查找解决
没有问题的情况下,是否有创新思路(或多做哪些工作)。
好像并没有
实验代码如下:
发送代码:
/****************************************************************************
*文件名:
main.c
*作者:
Andy
*修订:
2013-01-08
*版本:
1.0
*描述:
设置串口调试助手波特率:
115200bps8N1
*串口调试助手给CC2530发字符串时,开发板会返回接收到的字符串
****************************************************************************/
#include
//#defineDISABLE_ALL_INTERRUPTS()(IEN0=IEN1=IEN2=0x00)//三个
charrf_rx_buf[128];
voidrf_send(char*pbuf,intlen);
voidrf_receive_isr();
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineUART0_RX1
#defineUART0_TX2
#defineSIZE51
charRxBuf;
charUartState;
ucharcount;
charRxData[SIZE];//存储发送字符串
voidInitClock(void)
{
CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振
while(CLKCONSTA&0x40);//等待晶振稳定
CLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZ
}
*名称:
InitSensor()
*功能:
温度传感器初始化函数
*入口参数:
无
*出口参数:
voidInitSensor(void)
//DISABLE_ALL_INTERRUPTS();//关闭所有中断
InitClock();//设置系统主时钟为32M
TR0=0x01;//设置为1来连接温度传感器到SOC_ADC
ATEST=0x01;//使能温度传感
GetTemperature()
获取温度传感器AD值
通过计算返回实际的温度值
floatGetTemperature(void)
uintvalue;
ADCCON3=(0x3E);//选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1|=0x30;//选择ADC的启动模式为手动
ADCCON1|=0x40;//启动AD转化
while(!
(ADCCON1&0x80));//等待AD转换完成
value=ADCL>>4;//ADCL寄存器低2位无效
value|=(((uint)ADCH)<<4);
return(value-1367.5)/4.5-5;//根据AD值,计算出实际的温度,芯片手册有错,温度系数应该是4.5/℃
//进行温度校正,这里减去5℃(不同芯片根据具体情况校正)
DelayMS()
以毫秒为单位延时
msec延时参数,值越大,延时越久
voidDelayMS(uintmsec)
uinti,j;
for(i=0;ifor(j=0;j<1070;j++);}/*****************************************************************************名称:InitUart()*功能:串口初始化函数*入口参数:无*出口参数:无****************************************************************************/voidInitUart(void){PERCFG=0x00;//外设控制寄存器USART0的IO位置:0为P0口位置1P0SEL=0x0c;//P0_2,P0_3用作串口(外设功能)P2DIR&=~0xC0;//P0优先作为UART0U0CSR|=0x80;//设置为UART方式U0GCR|=11;U0BAUD|=216;//波特率设为115200UTX0IF=0;//UART0TX中断标志初始置位0U0CSR|=0x40;//允许接收IEN0|=0x84;//开总中断允许接收中断}/*****************************************************************************名称:UartSendString()*功能:串口发送函数*入口参数:Data:发送缓冲区len:发送长度*出口参数:无****************************************************************************/voidUartSendString(char*Data,intlen){uinti;for(i=0;i{U0DBUF=*Data++;while(UTX0IF==0);UTX0IF=0;}}//以下是RF初始化和发送与接收voidrf_init(){TXPOWER=0xD5;//发射功率为1dBm//FRMCTRL0|=(0x20|0x40);/*AUTO_ACK|AUTO_CRC*/CCACTRL0=0xF8;//推荐值smartRF软件生成FRMFILT0=0x0c;//静止接收过滤,即接收所有数据包FSCAL1=0x00;//推荐值smartRF软件生成TXFILTCFG=0x09;AGCCTRL1=0x15;//AGCCTRL2=0xFE;//TXFILTCFG=0x09;//推荐值smartRF软件生成FREQCTRL=0x09;//选择通道11RFIRQM0|=(1<<6);//使能RF数据包接收中断IEN2|=(1<<0);//使能RF中断RFST=0xED;//清除RF接收缓冲区ISFLUSHRXRFST=0xE3;//RF接收使能ISRXON}voidrf_send(char*pbuf,intlen){RFST=0xE3;//RF接收使能ISRXONwhile(FSMSTAT1&((1<<1)|(1<<5)));//等待发送状态不活跃并且没有接收到SFDRFIRQM0&=~(1<<6);//禁止接收数据包中断IEN2&=~(1<<0);//清除RF全局中断RFST=0xEE;//清除发送缓冲区ISFLUSHTXRFIRQF1=~(1<<1);//清除发送完成标志//填充缓冲区填充过程需要增加2字节,CRC校验自动填充RFD=len+2;for(inti=0;i{RFD=*pbuf++;}RFST=0xE9;//发送数据包ISTXONwhile(!(RFIRQF1&(1<<1)));//等待发送完成P0_0=~P0_0;RFIRQF1=~(1<<1);//清除发送完成标志位RFIRQM0|=(1<<6);//RX接收中断IEN2|=(1<<0);}/*****************************************************************************程序入口函数****************************************************************************/voidmain(void){//chari;//floatAvgTemp;//charstrTemp[6];CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振while(CLKCONSTA&0x40);//等待晶振稳定为32MCLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZInitUart();//调用串口初始化函数UartState=UART0_RX;//串口0默认处于接收模式memset(RxData,0,SIZE);InitSensor();rf_init();floatx=GetTemperature();chara[10];sprintf(a,"%g",x);charb[15]="AC1:";strcat(b,a);while(1){rf_send(b,20);DelayMS(20);}/*if(UartState==UART0_TX)//发送状态{U0CSR&=~0x40;//禁止接收AvgTemp=0;for(i=0;i<64;i++){AvgTemp+=GetTemperature();AvgTemp=AvgTemp/2;//每次累加后除2}memset(strTemp,0,6);sprintf(strTemp,"%.02f\n",AvgTemp);//将浮点数转成字符串UartSendString(strTemp,6);rf_send(strTemp,5);DelayMS(1000);//延时//UartSendString(RxData,count);//发送已记录的字符串。U0CSR|=0x40;//允许接收UartState=UART0_RX;//恢复到接收状态count=0;//计数清0memset(RxData,0,SIZE);//清空接收缓冲区}}*/}接收代码:/********************************************************************************文件名称:UART(ReceiveINT)_Ex.c*功能:CC253x系列片上系统基础实验---UART(接收数据中断方式)*描述:本实验使用CC253x系列片上系统的片内USART控制器,工作在UART模式下,通*过UART0接收数据,采用中断方式。*实验硬件:*用USB电缆连接SK-SmartRF05EB上的USB接口与用户PC的USB接口。**作者:POWER*日期:2010-04-18******************************************************************************//*包含头文件*//********************************************************************/#include"ioCC2530.h"//CC2530的头文件,包含对CC2530的寄存器、中断向量等的定义#include"LCD.h"//lcd驱动头文件#include"stdio.h"//C语言标准输入/输出库头文件/********************************************************************//*定义枚举类型*//********************************************************************/enumSYSCLK_SRC{XOSC_32MHz,RC_16MHz};//定义系统时钟源(主时钟源)枚举类型/********************************************************************//**********************************************************************函数名称:SystemClockSourceSelect*功能:选择系统时钟源(主时钟源)*入口参数:source*XOSC_32MHz32MHz晶体振荡器*RC_16MHz16MHzRC振荡器*出口参数:无*返回值:无********************************************************************/voidSystemClockSourceSelect(enumSYSCLK_SRCsource){unsignedcharosc32k_bm=CLKCONCMD&0x80;unsignedchar__clkconcmd,__clkconsta;/*系统时钟源(主时钟源)选择16MHzRC振荡器,定时器tick设置为16MHz,时钟速度设置为16MHzCLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置CLKCONCMD.OSC[b6]=1系统时钟源(主时钟源)选择16MHzRC振荡器CLKCONCMD.TICKSPD[b5..b3]=001定时器tick设置为16MHzCLKCONCMD.CLKSPD[b2..b0]=001时钟速度设置为16MHz*/if(source==RC_16MHz){/*CLKCONCMD.OSC32K[b7]*/CLKCONCMD=((osc32k_bm)|\/*CLKCONCMD.OSC[b6]=1*/(0x01<<6)|\/*CLKCONCMD.TICKSPD[b5..b3]=001*/(0x01<<3)|\/*CLKCONCMD.CLKSPD[b2..b0]=001*/(0x01<<0));}/*系统时钟源(主时钟源)选择32MHz晶体振荡器,定时器tick设置为32MHz,时钟速度设置为32MHzCLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置CLKCONCMD.OSC[b6]=0系统时钟源(主时钟源)选择32MHz晶体振荡器CLKCONCMD.TICKSPD[b5..b3]=000定时器tick设置为32MHzCLKCONCMD.CLKSPD[b2..b0]=000时钟速度设置为32MHz*/elseif(source==XOSC_32MHz){CLKCONCMD=(osc32k_bm/*|(0x00<<6)|(0x00<<3)|(0x00<<0)*/);}/*等待所选择的系统时钟源(主时钟源)稳定*/__clkconcmd=CLKCONCMD;//读取时钟控制寄存器CLKCONCMDdo{__clkconsta=CLKCONSTA;//读取时钟状态寄存器CLKCONSTA}while(__clkconsta!=__clkconcmd);//直到CLKCONSTA寄存器的值与CLKCONCMD寄存//器的值一致,说明所选择的系统时钟源(主//时钟源)已经稳定}/**********************************************************************函数名称:InitUART0*功能:UART0初始化*P0.2RX*P0.3TX*波特率:57600*数据位:8*停止位:1*奇偶校验:无*入口参数:无*出口参数:无*返回值:无********************************************************************/voidInitUART0(void){/*片内外设引脚位置采用上电复位默认值,即PERCFG寄存器采用默认值*//*P0.2RXP0.3TXP0.4CTP0.5RT*//*UART0相关引脚初始化*/P0SEL|=((0x01<<2)|(0x01<<3));//P0.2和P0.3作为片内外设I/O/*P0口外设优先级采用上电复位默认值,即P2DIR寄存器采用默认值*//*第一优先级:USART0第二优先级:USART1第三优先级:Timer1*//*UART0波特率设置*//*波特率:57600当使用32MHz晶体振荡器作为系统时钟时,要获得57600波特率需要如下设置:UxBAUD.BAUD_M=216UxGCR.BAUD_E=10该设置误差为0.03%*/U0BAUD=216;U0GCR=10;/*USART模式选择*/U0CSR|=0x80;//UART模式/*UART0配置*/U0UCR|=0x80;//进行USART清除/*以下配置参数采用上电复位默认值:硬件流控:无奇偶校验位(第9位):奇校验第9位数据使能:否奇偶校验使能:否停止位:1个停止位电平:高电平起始位电平:低电平*//*用於发送的位顺序采用上电复位默认值,即U0GCR寄存器采用上电复位默认值*//*LSB先发送*/URX0IF=0;//清零UART0RX中断标志U0CSR|=(0x01<<6);//使能接收器URX0IE=1;//使能UART0RX中断}charrf_rx_buf[16];charpbuf[16];/**********************************************************************函数名称:UART0SendByte*功能:UART0发送一个字节*入口参数:c*出口参数:无*返回值:无********************************************************************/voidUA
for(j=0;j<1070;j++);
InitUart()
串口初始化函数
voidInitUart(void)
PERCFG=0x00;//外设控制寄存器USART0的IO位置:
0为P0口位置1
P0SEL=0x0c;//P0_2,P0_3用作串口(外设功能)
P2DIR&=~0xC0;//P0优先作为UART0
U0CSR|=0x80;//设置为UART方式
U0GCR|=11;
U0BAUD|=216;//波特率设为115200
UTX0IF=0;//UART0TX中断标志初始置位0
U0CSR|=0x40;//允许接收
IEN0|=0x84;//开总中断允许接收中断
UartSendString()
串口发送函数
Data:
发送缓冲区len:
发送长度
voidUartSendString(char*Data,intlen)
uinti;
for(i=0;i{U0DBUF=*Data++;while(UTX0IF==0);UTX0IF=0;}}//以下是RF初始化和发送与接收voidrf_init(){TXPOWER=0xD5;//发射功率为1dBm//FRMCTRL0|=(0x20|0x40);/*AUTO_ACK|AUTO_CRC*/CCACTRL0=0xF8;//推荐值smartRF软件生成FRMFILT0=0x0c;//静止接收过滤,即接收所有数据包FSCAL1=0x00;//推荐值smartRF软件生成TXFILTCFG=0x09;AGCCTRL1=0x15;//AGCCTRL2=0xFE;//TXFILTCFG=0x09;//推荐值smartRF软件生成FREQCTRL=0x09;//选择通道11RFIRQM0|=(1<<6);//使能RF数据包接收中断IEN2|=(1<<0);//使能RF中断RFST=0xED;//清除RF接收缓冲区ISFLUSHRXRFST=0xE3;//RF接收使能ISRXON}voidrf_send(char*pbuf,intlen){RFST=0xE3;//RF接收使能ISRXONwhile(FSMSTAT1&((1<<1)|(1<<5)));//等待发送状态不活跃并且没有接收到SFDRFIRQM0&=~(1<<6);//禁止接收数据包中断IEN2&=~(1<<0);//清除RF全局中断RFST=0xEE;//清除发送缓冲区ISFLUSHTXRFIRQF1=~(1<<1);//清除发送完成标志//填充缓冲区填充过程需要增加2字节,CRC校验自动填充RFD=len+2;for(inti=0;i{RFD=*pbuf++;}RFST=0xE9;//发送数据包ISTXONwhile(!(RFIRQF1&(1<<1)));//等待发送完成P0_0=~P0_0;RFIRQF1=~(1<<1);//清除发送完成标志位RFIRQM0|=(1<<6);//RX接收中断IEN2|=(1<<0);}/*****************************************************************************程序入口函数****************************************************************************/voidmain(void){//chari;//floatAvgTemp;//charstrTemp[6];CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振while(CLKCONSTA&0x40);//等待晶振稳定为32MCLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZInitUart();//调用串口初始化函数UartState=UART0_RX;//串口0默认处于接收模式memset(RxData,0,SIZE);InitSensor();rf_init();floatx=GetTemperature();chara[10];sprintf(a,"%g",x);charb[15]="AC1:";strcat(b,a);while(1){rf_send(b,20);DelayMS(20);}/*if(UartState==UART0_TX)//发送状态{U0CSR&=~0x40;//禁止接收AvgTemp=0;for(i=0;i<64;i++){AvgTemp+=GetTemperature();AvgTemp=AvgTemp/2;//每次累加后除2}memset(strTemp,0,6);sprintf(strTemp,"%.02f\n",AvgTemp);//将浮点数转成字符串UartSendString(strTemp,6);rf_send(strTemp,5);DelayMS(1000);//延时//UartSendString(RxData,count);//发送已记录的字符串。U0CSR|=0x40;//允许接收UartState=UART0_RX;//恢复到接收状态count=0;//计数清0memset(RxData,0,SIZE);//清空接收缓冲区}}*/}接收代码:/********************************************************************************文件名称:UART(ReceiveINT)_Ex.c*功能:CC253x系列片上系统基础实验---UART(接收数据中断方式)*描述:本实验使用CC253x系列片上系统的片内USART控制器,工作在UART模式下,通*过UART0接收数据,采用中断方式。*实验硬件:*用USB电缆连接SK-SmartRF05EB上的USB接口与用户PC的USB接口。**作者:POWER*日期:2010-04-18******************************************************************************//*包含头文件*//********************************************************************/#include"ioCC2530.h"//CC2530的头文件,包含对CC2530的寄存器、中断向量等的定义#include"LCD.h"//lcd驱动头文件#include"stdio.h"//C语言标准输入/输出库头文件/********************************************************************//*定义枚举类型*//********************************************************************/enumSYSCLK_SRC{XOSC_32MHz,RC_16MHz};//定义系统时钟源(主时钟源)枚举类型/********************************************************************//**********************************************************************函数名称:SystemClockSourceSelect*功能:选择系统时钟源(主时钟源)*入口参数:source*XOSC_32MHz32MHz晶体振荡器*RC_16MHz16MHzRC振荡器*出口参数:无*返回值:无********************************************************************/voidSystemClockSourceSelect(enumSYSCLK_SRCsource){unsignedcharosc32k_bm=CLKCONCMD&0x80;unsignedchar__clkconcmd,__clkconsta;/*系统时钟源(主时钟源)选择16MHzRC振荡器,定时器tick设置为16MHz,时钟速度设置为16MHzCLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置CLKCONCMD.OSC[b6]=1系统时钟源(主时钟源)选择16MHzRC振荡器CLKCONCMD.TICKSPD[b5..b3]=001定时器tick设置为16MHzCLKCONCMD.CLKSPD[b2..b0]=001时钟速度设置为16MHz*/if(source==RC_16MHz){/*CLKCONCMD.OSC32K[b7]*/CLKCONCMD=((osc32k_bm)|\/*CLKCONCMD.OSC[b6]=1*/(0x01<<6)|\/*CLKCONCMD.TICKSPD[b5..b3]=001*/(0x01<<3)|\/*CLKCONCMD.CLKSPD[b2..b0]=001*/(0x01<<0));}/*系统时钟源(主时钟源)选择32MHz晶体振荡器,定时器tick设置为32MHz,时钟速度设置为32MHzCLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置CLKCONCMD.OSC[b6]=0系统时钟源(主时钟源)选择32MHz晶体振荡器CLKCONCMD.TICKSPD[b5..b3]=000定时器tick设置为32MHzCLKCONCMD.CLKSPD[b2..b0]=000时钟速度设置为32MHz*/elseif(source==XOSC_32MHz){CLKCONCMD=(osc32k_bm/*|(0x00<<6)|(0x00<<3)|(0x00<<0)*/);}/*等待所选择的系统时钟源(主时钟源)稳定*/__clkconcmd=CLKCONCMD;//读取时钟控制寄存器CLKCONCMDdo{__clkconsta=CLKCONSTA;//读取时钟状态寄存器CLKCONSTA}while(__clkconsta!=__clkconcmd);//直到CLKCONSTA寄存器的值与CLKCONCMD寄存//器的值一致,说明所选择的系统时钟源(主//时钟源)已经稳定}/**********************************************************************函数名称:InitUART0*功能:UART0初始化*P0.2RX*P0.3TX*波特率:57600*数据位:8*停止位:1*奇偶校验:无*入口参数:无*出口参数:无*返回值:无********************************************************************/voidInitUART0(void){/*片内外设引脚位置采用上电复位默认值,即PERCFG寄存器采用默认值*//*P0.2RXP0.3TXP0.4CTP0.5RT*//*UART0相关引脚初始化*/P0SEL|=((0x01<<2)|(0x01<<3));//P0.2和P0.3作为片内外设I/O/*P0口外设优先级采用上电复位默认值,即P2DIR寄存器采用默认值*//*第一优先级:USART0第二优先级:USART1第三优先级:Timer1*//*UART0波特率设置*//*波特率:57600当使用32MHz晶体振荡器作为系统时钟时,要获得57600波特率需要如下设置:UxBAUD.BAUD_M=216UxGCR.BAUD_E=10该设置误差为0.03%*/U0BAUD=216;U0GCR=10;/*USART模式选择*/U0CSR|=0x80;//UART模式/*UART0配置*/U0UCR|=0x80;//进行USART清除/*以下配置参数采用上电复位默认值:硬件流控:无奇偶校验位(第9位):奇校验第9位数据使能:否奇偶校验使能:否停止位:1个停止位电平:高电平起始位电平:低电平*//*用於发送的位顺序采用上电复位默认值,即U0GCR寄存器采用上电复位默认值*//*LSB先发送*/URX0IF=0;//清零UART0RX中断标志U0CSR|=(0x01<<6);//使能接收器URX0IE=1;//使能UART0RX中断}charrf_rx_buf[16];charpbuf[16];/**********************************************************************函数名称:UART0SendByte*功能:UART0发送一个字节*入口参数:c*出口参数:无*返回值:无********************************************************************/voidUA
U0DBUF=*Data++;
while(UTX0IF==0);
UTX0IF=0;
//以下是RF初始化和发送与接收
voidrf_init()
TXPOWER=0xD5;//发射功率为1dBm
//FRMCTRL0|=(0x20|0x40);/*AUTO_ACK|AUTO_CRC*/
CCACTRL0=0xF8;//推荐值smartRF软件生成
FRMFILT0=0x0c;//静止接收过滤,即接收所有数据包
FSCAL1=0x00;//推荐值smartRF软件生成
TXFILTCFG=0x09;
AGCCTRL1=0x15;
//AGCCTRL2=0xFE;
//TXFILTCFG=0x09;//推荐值smartRF软件生成
FREQCTRL=0x09;//选择通道11
RFIRQM0|=(1<<6);//使能RF数据包接收中断
IEN2|=(1<<0);//使能RF中断
RFST=0xED;//清除RF接收缓冲区ISFLUSHRX
RFST=0xE3;//RF接收使能ISRXON
voidrf_send(char*pbuf,intlen)
while(FSMSTAT1&((1<<1)|(1<<5)));//等待发送状态不活跃并且没有接收到SFD
RFIRQM0&=~(1<<6);//禁止接收数据包中断
IEN2&=~(1<<0);//清除RF全局中断
RFST=0xEE;//清除发送缓冲区ISFLUSHTX
RFIRQF1=~(1<<1);//清除发送完成标志
//填充缓冲区填充过程需要增加2字节,CRC校验自动填充
RFD=len+2;
for(inti=0;i{RFD=*pbuf++;}RFST=0xE9;//发送数据包ISTXONwhile(!(RFIRQF1&(1<<1)));//等待发送完成P0_0=~P0_0;RFIRQF1=~(1<<1);//清除发送完成标志位RFIRQM0|=(1<<6);//RX接收中断IEN2|=(1<<0);}/*****************************************************************************程序入口函数****************************************************************************/voidmain(void){//chari;//floatAvgTemp;//charstrTemp[6];CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振while(CLKCONSTA&0x40);//等待晶振稳定为32MCLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZInitUart();//调用串口初始化函数UartState=UART0_RX;//串口0默认处于接收模式memset(RxData,0,SIZE);InitSensor();rf_init();floatx=GetTemperature();chara[10];sprintf(a,"%g",x);charb[15]="AC1:";strcat(b,a);while(1){rf_send(b,20);DelayMS(20);}/*if(UartState==UART0_TX)//发送状态{U0CSR&=~0x40;//禁止接收AvgTemp=0;for(i=0;i<64;i++){AvgTemp+=GetTemperature();AvgTemp=AvgTemp/2;//每次累加后除2}memset(strTemp,0,6);sprintf(strTemp,"%.02f\n",AvgTemp);//将浮点数转成字符串UartSendString(strTemp,6);rf_send(strTemp,5);DelayMS(1000);//延时//UartSendString(RxData,count);//发送已记录的字符串。U0CSR|=0x40;//允许接收UartState=UART0_RX;//恢复到接收状态count=0;//计数清0memset(RxData,0,SIZE);//清空接收缓冲区}}*/}接收代码:/********************************************************************************文件名称:UART(ReceiveINT)_Ex.c*功能:CC253x系列片上系统基础实验---UART(接收数据中断方式)*描述:本实验使用CC253x系列片上系统的片内USART控制器,工作在UART模式下,通*过UART0接收数据,采用中断方式。*实验硬件:*用USB电缆连接SK-SmartRF05EB上的USB接口与用户PC的USB接口。**作者:POWER*日期:2010-04-18******************************************************************************//*包含头文件*//********************************************************************/#include"ioCC2530.h"//CC2530的头文件,包含对CC2530的寄存器、中断向量等的定义#include"LCD.h"//lcd驱动头文件#include"stdio.h"//C语言标准输入/输出库头文件/********************************************************************//*定义枚举类型*//********************************************************************/enumSYSCLK_SRC{XOSC_32MHz,RC_16MHz};//定义系统时钟源(主时钟源)枚举类型/********************************************************************//**********************************************************************函数名称:SystemClockSourceSelect*功能:选择系统时钟源(主时钟源)*入口参数:source*XOSC_32MHz32MHz晶体振荡器*RC_16MHz16MHzRC振荡器*出口参数:无*返回值:无********************************************************************/voidSystemClockSourceSelect(enumSYSCLK_SRCsource){unsignedcharosc32k_bm=CLKCONCMD&0x80;unsignedchar__clkconcmd,__clkconsta;/*系统时钟源(主时钟源)选择16MHzRC振荡器,定时器tick设置为16MHz,时钟速度设置为16MHzCLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置CLKCONCMD.OSC[b6]=1系统时钟源(主时钟源)选择16MHzRC振荡器CLKCONCMD.TICKSPD[b5..b3]=001定时器tick设置为16MHzCLKCONCMD.CLKSPD[b2..b0]=001时钟速度设置为16MHz*/if(source==RC_16MHz){/*CLKCONCMD.OSC32K[b7]*/CLKCONCMD=((osc32k_bm)|\/*CLKCONCMD.OSC[b6]=1*/(0x01<<6)|\/*CLKCONCMD.TICKSPD[b5..b3]=001*/(0x01<<3)|\/*CLKCONCMD.CLKSPD[b2..b0]=001*/(0x01<<0));}/*系统时钟源(主时钟源)选择32MHz晶体振荡器,定时器tick设置为32MHz,时钟速度设置为32MHzCLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置CLKCONCMD.OSC[b6]=0系统时钟源(主时钟源)选择32MHz晶体振荡器CLKCONCMD.TICKSPD[b5..b3]=000定时器tick设置为32MHzCLKCONCMD.CLKSPD[b2..b0]=000时钟速度设置为32MHz*/elseif(source==XOSC_32MHz){CLKCONCMD=(osc32k_bm/*|(0x00<<6)|(0x00<<3)|(0x00<<0)*/);}/*等待所选择的系统时钟源(主时钟源)稳定*/__clkconcmd=CLKCONCMD;//读取时钟控制寄存器CLKCONCMDdo{__clkconsta=CLKCONSTA;//读取时钟状态寄存器CLKCONSTA}while(__clkconsta!=__clkconcmd);//直到CLKCONSTA寄存器的值与CLKCONCMD寄存//器的值一致,说明所选择的系统时钟源(主//时钟源)已经稳定}/**********************************************************************函数名称:InitUART0*功能:UART0初始化*P0.2RX*P0.3TX*波特率:57600*数据位:8*停止位:1*奇偶校验:无*入口参数:无*出口参数:无*返回值:无********************************************************************/voidInitUART0(void){/*片内外设引脚位置采用上电复位默认值,即PERCFG寄存器采用默认值*//*P0.2RXP0.3TXP0.4CTP0.5RT*//*UART0相关引脚初始化*/P0SEL|=((0x01<<2)|(0x01<<3));//P0.2和P0.3作为片内外设I/O/*P0口外设优先级采用上电复位默认值,即P2DIR寄存器采用默认值*//*第一优先级:USART0第二优先级:USART1第三优先级:Timer1*//*UART0波特率设置*//*波特率:57600当使用32MHz晶体振荡器作为系统时钟时,要获得57600波特率需要如下设置:UxBAUD.BAUD_M=216UxGCR.BAUD_E=10该设置误差为0.03%*/U0BAUD=216;U0GCR=10;/*USART模式选择*/U0CSR|=0x80;//UART模式/*UART0配置*/U0UCR|=0x80;//进行USART清除/*以下配置参数采用上电复位默认值:硬件流控:无奇偶校验位(第9位):奇校验第9位数据使能:否奇偶校验使能:否停止位:1个停止位电平:高电平起始位电平:低电平*//*用於发送的位顺序采用上电复位默认值,即U0GCR寄存器采用上电复位默认值*//*LSB先发送*/URX0IF=0;//清零UART0RX中断标志U0CSR|=(0x01<<6);//使能接收器URX0IE=1;//使能UART0RX中断}charrf_rx_buf[16];charpbuf[16];/**********************************************************************函数名称:UART0SendByte*功能:UART0发送一个字节*入口参数:c*出口参数:无*返回值:无********************************************************************/voidUA
RFD=*pbuf++;
RFST=0xE9;//发送数据包ISTXON
(RFIRQF1&(1<<1)));//等待发送完成
P0_0=~P0_0;
RFIRQF1=~(1<<1);//清除发送完成标志位
RFIRQM0|=(1<<6);//RX接收中断
IEN2|=(1<<0);
*程序入口函数
voidmain(void)
//chari;
//floatAvgTemp;
//charstrTemp[6];
while(CLKCONSTA&0x40);//等待晶振稳定为32M
InitUart();//调用串口初始化函数
UartState=UART0_RX;//串口0默认处于接收模式
memset(RxData,0,SIZE);
InitSensor();
rf_init();
floatx=GetTemperature();
chara[10];
sprintf(a,"%g",x);
charb[15]="AC1:
";
strcat(b,a);
while
(1)
rf_send(b,20);
DelayMS(20);
/*if(UartState==UART0_TX)//发送状态
U0CSR&=~0x40;//禁止接收
AvgTemp=0;
for(i=0;i<64;i++)
AvgTemp+=GetTemperature();
AvgTemp=AvgTemp/2;//每次累加后除2
memset(strTemp,0,6);
sprintf(strTemp,"%.02f\n",AvgTemp);//将浮点数转成字符串
UartSendString(strTemp,6);
rf_send(strTemp,5);
DelayMS(1000);//延时
//UartSendString(RxData,count);//发送已记录的字符串。
UartState=UART0_RX;//恢复到接收状态
count=0;//计数清0
memset(RxData,0,SIZE);//清空接收缓冲区
*/
接收代码:
/*******************************************************************************
*文件名称:
UART(ReceiveINT)_Ex.c
*功能:
CC253x系列片上系统基础实验---UART(接收数据中断方式)
*描述:
本实验使用CC253x系列片上系统的片内USART控制器,工作在UART模式下,通
*过UART0接收数据,采用中断方式。
*实验硬件:
*用USB电缆连接SK-SmartRF05EB上的USB接口与用户PC的USB接口。
*
*作者:
POWER
*日期:
2010-04-18
******************************************************************************/
/*包含头文件*/
/********************************************************************/
#include"ioCC2530.h"//CC2530的头文件,包含对CC2530的寄存器、中断向量等的定义
#include"LCD.h"//lcd驱动头文件
#include"stdio.h"//C语言标准输入/输出库头文件
/*定义枚举类型*/
enumSYSCLK_SRC{XOSC_32MHz,RC_16MHz};//定义系统时钟源(主时钟源)枚举类型
/*********************************************************************
*函数名称:
SystemClockSourceSelect
选择系统时钟源(主时钟源)
*入口参数:
source
*XOSC_32MHz32MHz晶体振荡器
*RC_16MHz16MHzRC振荡器
*出口参数:
*返回值:
********************************************************************/
voidSystemClockSourceSelect(enumSYSCLK_SRCsource)
unsignedcharosc32k_bm=CLKCONCMD&0x80;
unsignedchar__clkconcmd,__clkconsta;
/*
系统时钟源(主时钟源)选择16MHzRC振荡器,定时器tick设置为16MHz,时钟速度设置为16MHz
CLKCONCMD.OSC32K[b7]不改变32KHz时钟源选择保持先前设置
CLKCONCMD.OSC[b6]=1系统时钟源(主时钟源)选择16MHzRC振荡器
CLKCONCMD.TICKSPD[b5..b3]=001定时器tick设置为16MHz
CLKCONCMD.CLKSPD[b2..b0]=001时钟速度设置为16MHz
if(source==RC_16MHz)
{/*CLKCONCMD.OSC32K[b7]*/
CLKCONCMD=((osc32k_bm)|\
/*CLKCONCMD.OSC[b6]=1*/
(0x01<<6)|\
/*CLKCONCMD.TICKSPD[b5..b3]=001*/
(0x01<<3)|\
/*CLKCONCMD.CLKSPD[b2..b0]=001*/
(0x01<<0));
系统时钟源(主时钟源)选择32MHz晶体振荡器,定时器tick设置为32MHz,时钟速度设置为32MHz
CLKCONCMD.OSC[b6]=0系统时钟源(主时钟源)选择32MHz晶体振荡器
CLKCONCMD.TICKSPD[b5..b3]=000定时器tick设置为32MHz
CLKCONCMD.CLKSPD[b2..b0]=000时钟速度设置为32MHz
elseif(source==XOSC_32MHz)
CLKCONCMD=(osc32k_bm/*|(0x00<<6)|(0x00<<3)|(0x00<<0)*/);
/*等待所选择的系统时钟源(主时钟源)稳定*/
__clkconcmd=CLKCONCMD;//读取时钟控制寄存器CLKCONCMD
do
__clkconsta=CLKCONSTA;//读取时钟状态寄存器CLKCONSTA
}while(__clkconsta!
=__clkconcmd);//直到CLKCONSTA寄存器的值与CLKCONCMD寄存
//器的值一致,说明所选择的系统时钟源(主
//时钟源)已经稳定
InitUART0
UART0初始化
*P0.2RX
*P0.3TX
*波特率:
57600
*数据位:
8
*停止位:
1
*奇偶校验:
voidInitUART0(void)
/*片内外设引脚位置采用上电复位默认值,即PERCFG寄存器采用默认值*/
P0.2RX
P0.3TX
P0.4CT
P0.5RT
/*UART0相关引脚初始化*/
P0SEL|=((0x01<<2)|(0x01<<3));//P0.2和P0.3作为片内外设I/O
/*P0口外设优先级采用上电复位默认值,即P2DIR寄存器采用默认值*/
第一优先级:
USART0
第二优先级:
USART1
第三优先级:
Timer1
/*UART0波特率设置*/
/*波特率:
当使用32MHz晶体振荡器作为系统时钟时,要获得57600波特率需要如下设置:
UxBAUD.BAUD_M=216
UxGCR.BAUD_E=10
该设置误差为0.03%
U0BAUD=216;
U0GCR=10;
/*USART模式选择*/
U0CSR|=0x80;//UART模式
/*UART0配置*/
U0UCR|=0x80;//进行USART清除
以下配置参数采用上电复位默认值:
硬件流控:
奇偶校验位(第9位):
奇校验
第9位数据使能:
否
奇偶校验使能:
停止位:
1个
停止位电平:
高电平
起始位电平:
低电平
/*用於发送的位顺序采用上电复位默认值,即U0GCR寄存器采用上电复位默认值*/
/*LSB先发送*/
URX0IF=0;//清零UART0RX中断标志
U0CSR|=(0x01<<6);//使能接收器
URX0IE=1;//使能UART0RX中断
charrf_rx_buf[16];
charpbuf[16];
UART0SendByte
UART0发送一个字节
c
voidUA
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2