实验一 通用I/O
课时安排:2学时
一、教学目标
(1)知识目标:理解CC2530的通用I/O相关寄存器的设置方法,应用设计方法;
(2)能力目标:提高学生的动手能力,解决将CC2530通用I/O在实际应用过程中出现的问题;
(3)情感目标:激发学生的学习兴趣,培养学生积极探索、勇于创新的精神。
二、实验环境
(1)硬件:PC机
(2)软件:IAR for 8051软件
三、实验准备
(1)掌握CC2530通用I/O相关知识。
(2)安装IAR for 8051软件,并熟悉该软件的使用方法。
四、实验原理
1
如图1所示,K1键按下,P0_3引脚输入低电平,否则高电平,K2键按下,P0_4引脚输入低电平,否则高电平。P1_1引脚输出低电平,D2点亮,否则D2熄灭,P1_0引脚输出低电平,D3点亮,否则D3熄灭。
3.3VRs110KΩRs210KΩP0_3Rs33.3VK1220ΩRs4P1_0K2D2P1_1P0_4220ΩD3
图1 通用I/O实验的硬件设计原理
五、实验内容及要求
(1)任务一:控制LED自动闪烁
编写程序,设置P1_0和P1_1的相关寄存器,实现D2和D3一直闪烁。然后对编写的程序在IAR环境中编辑、编译、调试,最终实现实验要求。
注意:点亮和熄灭灯后,要延时一段时间,否则观察不到。
(2)任务二:按键控制LED亮灭
使用两个按键开关分别控制两个LED 灯的亮灭,即编程设置相关寄存器,按下K1键,D2 灯点亮,按下K2键,D3灯点亮。然后对编写的程序在IAR环境中编辑、编译、调试,最终实现实验要求。
2
注意:①K1、K2是机械触点,需要去抖动。②是点亮和熄灭灯后,要延时一段时间,否则观察不到。
六、实验步骤及指导
任务一:控制LED自动闪烁
(1)实验原理分析
如图1所示,发光二极管的D2的阴极与CC2530的P1_1连接,发光二极管的D3的阴极与CC2530的P1_0连接。因此,P1_1和P1_0的输出电压为低电平,发光二极管就会点亮,反之则会熄灭。
(2)启动IAR for 8051软件,新建工程,设计并编辑、编译程序。
(3)程序设计分析
1)确定引脚用作输入还是输出
当P1_0为低电平时,D3中有从左向右的电流流过,所以,D3可以点亮,否则没有电流流过,LED1是熄灭的。所以,P1_0引脚的值是需要设置的,它用作通用的输出功能,以此类推,P1_1引脚也用作通用的输出功能。
2)寄存器设置
设置寄存器P1SEL、P1DIR,使P1_0和P1_1用作通用的输出功能。即:
3
P1SEL&=~0x03
P1DIR|=0x03;
3)程序初始状态设置
初始时,设置D2、D3为熄灭状态。
4)延时程序
当LED点亮和熄灭的频率低于70Hz,人眼就会感受到闪烁。通常LED闪烁一次,就是控制它们点亮一次,延时一段时间,再控制它们熄灭一次,延时时间一般设置为0.3秒左右。假设执行3条asm(“NOP”);指令的时间为1微秒,则重复执行300000次,可以延时0.3秒。
5)参考程序
#include #define D3 P1_0 #define D2 P1_1 void Delay(void); void main(void) 4 { P1SEL&=~0x03; P1DIR|=0x03; while(1) { D2=0; D3=0; Delay(); D2=1; D3=1; Delay(); } } 5 void Delay(void) { unsigned int i,j; for(i=0;i<1000;i++) { for(j=0;j<300;j++) { asm(“NOP”); asm(“NOP”); asm(“NOP”); } } } 6 (4)对设计的程序在IAR for 8051环境中编译、调试、运行,即编译成功后,进入调试界面,打开watch窗口,输入D2、D3等变量,单步执行程序,运行结果如图2所示,可以观察到D2、D3值的变化。 图2 任务一调试、运行结果 任务二:按键控制LED亮灭 (1)实验原理分析 如图1所示,P0_3为上拉,按键K1接P0_3。由于P0_3为上拉,按键不按下时,输入电平为高电平,当按键K1按下时,P0_3输入电平被拉低。通过检测P0_3的输入电平, 控制D2亮灭。按键K2控制D3亮灭的原理与K1类似。 (2)再新建工程,设计并编辑、编译程序。 7 (3)程序设计分析 1)检测按键K1、K2是否按下 K1键按下,P0_3引脚输入的是低电平,否则P0_3引脚输入的是高电平,所以,通过判断P0_3引脚的状态,可以检测出K1按键是否按下。同理,可以通过判断P0_4引脚的状态可以检测出K2按键是否按下。 2)检测按键K1、K2是否被释放 在确定K1键按下的情况下,如果P0_3引脚为高电平,则K1按键被释放,K2键也如此。 3)确定引脚用作输入还是输出 P1_0、P1_1控制D2、D3原理同任务一,所以,P1_0、P1_1引脚用作通用的输出功能。P0_3、P0_4的值随按键K1、K2的状态而不同,用作通用的输入功能。 4)寄存器设置 ①P1_0和P1_1用作通用的输出功能,即: P1SEL&=~0x03 P1DIR|=0x03; 8 ②P0_3、P0_4用作通用的输出功能。即: P0DIR&=~0x18; P0INP|=0x18; 5)程序初始状态设置 初始时,设置D2、D3为熄灭状态。 6)延时程序 空计数程序用作延时,本任务的延时程序一方面用于LED点亮或熄灭的延时,与任务一类似;另一方面用于消除按键的抖动。 7)参考程序 #include #define D3 P1_0 #define D2 P1_1 #define K1 P0_3 #define K2 P0_4 9 #define uint unsigned char void Delay(uint); void Initial(void); void InitKey(void); void main(void) { Delay(10); Initial(); InitKey(); while(1) { if(K1==0) { 10 Delay(100); if (K1==0) D2=0; } Delay(20); while(!K1); if (K2==0) { Delay(100); if (K2==0) D3=0; } Delay(20); 11 while(!K2); } } void Delay(uint n) { uint tt; for(tt=0;tt void InitKey(void) 12 { P0SEL&=~0x18; P0DIR&=~0x18; P0INP|=0x18; } void Initial(void) { P1DIR|=0x03; D2=1; D3=1; } (4)对设计的程序在IAR for 8051环境中编译、调试、运行,运行结果如图3所示。 13 图3 任务二调试、运行结果 先设置K1=0或K2=0,再编译,编译成功后,进入调试界面,打开watch窗口,输入D2、D3、K1、K2等变量,单步执行程序,观察运行结果。 七、实验报告要求 (1)正确书写实验目的,内容,要求。 (2)完成实验步骤的要求,记录使用IAR for 8051软件设计、编译程序过程出现的实验现象,将调试结果写在实验结果处理的部分。 八、思考题 如何实现D2和D3的循环依次点亮? 14 实验二 多点温度采集 授课安排:2学时 一、教学目标 (1)知识目标:理解DS18B20的主要功能和特点,DS18B20的工作原理,DS18B20的读写操作命令功能,DS18B20的读写时序,DS18B20的初始化、读写、温度获取及转换程序设计。 (2)能力目标:提高学生的动手能力,解决CC2530采集温度过程中出现的问题; (3)情感目标:激发学生的学习兴趣,培养学生积极探索、勇于创新的精神。 二、实验环境 (1)硬件:PC机 (2)软件:IAR for 8051软件 三、实验准备 (1)掌握使用DS18B20进行温度信息采集的相关知识。 (2)熟悉IAR for 8051软件的使用。 15 四、实验原理 如图4所示,CC2530的P1_1引脚与3片DS18B20的信号线连接,3片DS18B20都采用外部供电。 DS18B20-1GNDDQVDDGNDDS18B20-2DS18B20-3DQVDDGNDDQVDD+5V+5V+5VP1_1 图4 多点温度采集实验原理 五、实验内容及要求 通过CC2530控制采集3片DS28B20的温度,并将采集的温度以十进制字符串(保留一位小数)的形式显示出来。 六、实验步骤及指导 (1)实验原理分析 设3片DS18B20的ROM序列号分别为0x1111111111111110、2111111111111110、3311111111111110,由于ROM序列号不同,CC2530可以区分3片DS18B20,并分别读取它们的温度。 (2)启动IAR for 8051软件,设计并编辑、编译程序。 16 (3)程序设计分析 编写程序,使CC2530从P1_1分别读取DS18B20采集的温度,将温度转换成具有1位小数的十进制数,并转换为字符,存储到变量中。编程时需要注意4点: 1)参考教材中给出的多片DS18B20温度采集流程,进行温度采集程序设计。 2)按温度的存储格式,将转换为温度用原码表示,并区分出整数和小数。 3)为了方便处理小数,设计程序时,把温度对应的小数事先算好,保存到数组中。处理思路如下:如小数用4位二进制数存储,有0000~1111种小数值,0000对应的小数值是0,将其作为数组的第0个元素存储,0001对应的 小数值是2-4,即0.0625,保留1位小数为0.1,将1作为数组的第1个元素存储,依次类推。 4)将十进制数的每一位分离出来,每一位的值加上48,就转成了对应的字符,将每个字符作为字符数组的一个元素,字符数组的内容就是最后转换的结果。 5)参考程序 #include #include #include #define SEARCH_ROM 0xF0 17 #define READ_ROM 0x33 #define MATCH_ROM 0x55 #define SKIP_ROM 0xCC #define ALARM_SEARCH 0xEC #define CONVERT_T 0x44 #define WR_SCRATCHPAD 0x4E #define RD_SCRATCHPAD 0xBE #define CPY_CCTATCHPAD 0x48 #define RECALL_EE 0xB8 #define RD_PWR_SUPPLY 0x84 #define HIGH 1 #define LOW 0 #define DQ P1_1 18 #define CL_DQ() DQ=LOW #define SET_DQ() DQ=HIGH #define DQ_DIR_OUT 0x02 #define SET_OUT() P1DIR|=DQ_DIR_OUT #define SET_IN() P1DIR&=~DQ_DIR_OUT #define uint16 unsigned short void delay_nus(uint16 timeout); void DS18B20_Write(unsigned char x); /* DS18B20写程序 */ unsigned char DS18B20_Read(void); /* DS18B20读程序 */ void DS18B20_Init(void); /* DS18B20复位程序 */ void DS18B20_SendConvert(void); unsigned char * DS18B20_GetTem(void); /*读取的温度转换成原码,并区分整数和小数*/ unsigned char temh,teml; 19 unsigned char *getTemStr(void); /* 将十进制温度转换成字符串 */ unsigned char sensor_data_value[2]; unsigned char FRACTION_INDEX[16]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; /*1位小数*/ unsigned char ch[10]={\"\\0\unsigned char rc[8]={\"\\0\号 */ void main() { unsigned char i; unsigned char *send_buf; unsigned char counter=0; while(1) { /* 存放转换后的温度字符串 */ /* 存放当前要读取温度的DS18B20的ROM序列 20 DS18B20_SendConvert(); for(i=20;i>0;i--) delay_nus(50000); switch (counter) { case 0: { rc[0]=0x10; rc[1]=0x11; rc[2]=0x11; rc[3]=0x11; rc[4]=0x11; rc[5]=0x11; 21 rc[6]=0x11; rc[7]=0x11; break; } case 1: rc[7]=0x21;break; case 2: rc[7]=0x33;break; } DS18B20_GetTem(); send_buf = getTemStr(); if ((counter++)==3) counter=0; } } void DS18B20_Init(void) 22 { SET_OUT(); SET_DQ(); CL_DQ(); delay_nus(550); SET_DQ(); delay_nus(40); SET_IN(); while (DQ) { ; } delay_nus(100); 23 SET_OUT(); SET_DQ(); } void DS18B20_Write(unsigned char cmd) { unsigned char i; SET_OUT(); SET_DQ(); for(i=0;i<8;i++) { CL_DQ(); if(cmd&(1<{ 24 SET_DQ(); } else { CL_DQ(); } delay_nus(40); SET_DQ(); } SET_DQ(); } unsigned char DS18B20_Read(void) { 25 unsigned char rdData; unsigned char i,dat; rdData=0; for(i=0;i<8;i++) { SET_OUT(); CL_DQ(); SET_DQ(); SET_IN(); dat=DQ; if(dat) { rdData |=(1<26 } else { rdData&=~(1<} delay_nus(70); SET_OUT(); } return(rdData); } unsigned char * DS18B20_GetTem(void) { unsigned char tem_h,tem_l; 27 uint16 a; unsigned char b,j; unsigned char flag; DS18B20_Write(MATCH_ROM); for (j=0;j<8;j++) DS18B20_Write(rc[j]); tem_l=DS18B20_Read(); tem_h=DS18B20_Read(); if (tem_h & 0x80) { flag=1; a=tem_h; a=(a<<8) | tem_l; 28 a=~a+1; tem_l=a&0x0f; tem_h=a>>4; } else { flag=0; b=tem_h<<4; b |=(tem_l & 0xf0)>>4; tem_h=b; tem_l= tem_l & 0x0f; } sensor_data_value[0]=FRACTION_INDEX[tem_l]; 29 sensor_data_value[1]=tem_h|(flag<<7); return(sensor_data_value); } void DS18B20_SendConvert(void) { DS18B20_Init(); DS18B20_Write(SKIP_ROM); DS18B20_Write(CONVERT_T); } void delay_nus(uint16 timeout) { while(timeout--) { 30 asm(\"NOP\"); asm(\"NOP\"); asm(\"NOP\"); } } unsigned char *getTemStr(void) { unsigned char *TEMP; TEMP=DS18B20_GetTem(); teml=TEMP[0]; temh=TEMP[1]; ch[0]=' '; ch[1]=' '; 31 if(temh&0x80) { ch[2]='-'; } else ch[2]='+'; temh=temh&0x7f; if (temh/100==0) ch[3]='-'; else ch[3]=temh/100+0x30; if((temh/10%10==0)&&(temh/100==0)) ch[4]='-'; else ch[4]=temh/10%10+0x30; 32 ch[5]=temh%10+0x30; ch[6]='.'; ch[7]=teml+0x30; ch[8]='\\0'; return(ch); } (4)对设计的程序在IAR环境中编译、调试、运行,最终实现实验要求。 以DS18B20-1为例来说明调试、运行结果。 1)将函数DS18B20_GetTem()的tem_l=DS18B20_Read(); tem_h=DS18B20_Read();修改为:tem_l=0x99;tem_h=0x01; 2)分析:0x99是整数部分,最高位表示符号位,表明温度是负数,将最高位清零的到0x19,转换成十进制数为25,小数部分为1,所以对应的温度为-25.1。 3)编译成功后,进入调试界面,打开watch窗口,输入tem_h、tem_l、ch等变量,单步执行getTemStr()函数,运行结果如图的运行结果一致,如图5所示,右侧ch字符数组的值。 33 图5 案例运行结果 七、实验报告要求 (1)正确书写实验目的,内容,要求。 (2)完成实验步骤的要求,记录使用IAR for 8051软件设计、编译程序过程出现的实验现象,将调试结果写在实验结果处理的部分。 八、思考题 如果将温度转换成具有2位小数的十进制数,如何修程序? 34 实验三 UART串口通信 课时安排:2学时 一、教学目标 (1)知识目标:掌握串口中断方式接收数据的原理,熟悉串口中断程序的设计方法; (2)能力目标:提高学生的动手能力,解决CC2530串口中断接收数据过程中出现的问题; (3)情感目标:激发学生的学习兴趣,培养学生积极探索、勇于创新的精神。 二、实验仪器 (1)硬件:PC机 (2)软件:IAR for 8051软件 三、实验准备 (1)掌握串口发送、接收数据的原理。 (2)熟悉IAR for 8051软件的使用。 四、实验原理 35 基于CC2530最小系统设计实验的硬件电路,如图6所示,CC2530串口通过PL2303芯片与PC的USB口连接,CC2530通过P1_0、P1_1控制LED1、LED2。 220ΩP1_1LED2R3220Ω3.3V12MHz晶振20pFP1_0LED1R220pFP0_2P0_4P0_3TXDDTR_NRTS_NVDD_RSRXDRI_NGNDNCDSR_NDCD_NCTS_NSHTD_NEE_CLKEE_DATAOSC2OSC1PLL_TESTGND_ANCGP1GP0GNDVDD_5NCGNDVO_33DMDP+5V1KΩR1P0_5PL2303VCCD-D+GNDUSB接口 图6 UART串口通信实验原理 五、实验内容及要求 依据实验原理图,设计程序,使CC2530从串口0以115200波特率接收PC发过来的命令,该命令可控制LED 灯的亮灭,控制数据的格式为“灯编号开|关#”,灯的编号为1,2,0 控制关灯,1控制开灯,如打开LED1的命令是“11#”,打开LED2的命令是“21#”。 六、实验步骤及指导 (1)实验原理分析 36 如图6所示,CC2530使用P0_2、P0_3、P0_4充当UART功能。发光二极管的LED1阴极与CC2530的P1_0连接,发光二极管的LED2的阴极与CC2530的P1_1连接。因此,P1_1和P1_0的输出电压为低电平,发光二极管就会点亮,反之则会熄灭。 (2)启动IAR for 8051软件,设计并编辑、编译程序。 (3)程序设计分析 1)CC2530使用串口0以中断方式,接收PC发过来的数据,实现该任务需要设计主函数、串口0初始化函数、LED初始化函数、中断服务程序以及头文件引用、函数、变量声明等程序代码。 2)考虑到没有硬件调试程序,中断服务程序无法执行,设计了recUART()函数,来代替中断服务程序,模拟串口0接收数据,即设置初始变量i、j分别为1、0,编程实现第1次接收‘i’、第2次接收’j’、第3次接收’#’,接收3次称为1轮接收,即”10#”;第2轮接收“11#”;第3轮接收“21#”,第4轮接收“20#”第5轮又开始接收“10#”,以此类推。 3)参考程序 #include #define uint unsigned int #define uchar unsigned char 37 #define LED1 P1_0 #define LED2 P1_1 void Delay(uint); void initUART (void); void Init_LED_IO(void); void recUART(void); uchar Recdata[3]=\"00\"; /*字符型数组,存放接收的字符*/ uchar RTflag = 1; /*字符型变量,接收数据标志*/ uchar temp; uint datanumber = 0,i=1,counter=0,j=0,k=0; void main(void) { uchar ii; 38 Init_LED_IO(); initUART(); while(1) { while (URX0IF==0); recUART(); if(RTflag == 1) { if( temp != 0) { if((temp!='#')&&(datanumber<3)) /*'#'被定义为结束字符*/ { Recdata[datanumber++] = (uchar)temp; /*最多能接收3个字符 */ 39 } else { RTflag = 3; /*如果字符接收完毕将进入LED状态改变程序*/ } if(datanumber == 3) /*接收3个字符后进入LED灯控制*/ { RTflag = 3; temp = 0; } } } /*LED控制程序*/ 40 if(RTflag == 3) { if(Recdata[0]=='1') /*判断接收的第一个字符是否为\"1\"*/ { if(Recdata[1]=='1') /*判断接收的第二个字符是否为\"1\"*/ { LED1=0; } else /*如果为\"0\"LED1关闭*/ { LED1=1; } } 41 /*LED2控制程序*/ if(Recdata[0]=='2') /*判断接收的第1个字符是否为\"2\"*/ { if(Recdata[1]=='1') /*判断接收的第2个字符是否为\"1\"*/ { LED2=0; } else /*如果为\"0\"则关闭LED2*/ { LED2=1; } } RTflag = 1; 42 for(ii=0;ii<3;ii++)Recdata[ii]=' '; /*清除接收到的数据*/ datanumber = 0; /*指针归位*/ } URX0IF=1; } } void initUART(void) { CLKCONCMD &= ~0x40; //while(!(SLEEPSTA & 0x40)); SLEEPSTA|= 0x40; CLKCONCMD|=0x38; CLKCONCMD&=~0x07; 43 SLEEPCMD |= 0x04; PERCFG &= ~0x01; P0SEL |= 0x3c; P2DIR &= ~0XC0; U0CSR |= 0x80; U0GCR |= 10; U0BAUD |= 216; URX0IF = 1; U0CSR |= 0X40; IEN0 |= 0x84; } void Init_LED_IO(void) { 44 P1SEL&=~0x03; P1DIR |= 0x03; /*P1.0、P1.1控制LED*/ LED1= 1; /*关LED2*/ LED2 = 1; /*关LED2*/ } void recUART(void) { URX0IF = 0; counter++; switch (counter) { case 1: U0DBUF='0'+i; 45 break; case 2: U0DBUF='0'+j; break; case 3: U0DBUF='#'; break; } temp = U0DBUF; if (counter==3) { counter=0; k++; 46 if (k%2) j=!j; else { i++; j=!j; if (i==3) i=1; } } } (4)对编写的程序在IAR for 8051环境中编辑、编译、调试,最终实现实验要求。实验调试、运行结果如图7所示,recUART()函数接收的数据是“20”,则LED2=1,即关闭LED2。 47 图7 实验调试运行结果 七、实验报告要求 (1)正确书写实验目的,内容,要求。 (2)使用的命令完成实验步骤的要求,并将实验的现象和结果写在实验结果处理的部分。 八、思考题 (1)CC2530要通过UART向PC机发送5个字节的数据,如何实现? 48 实验四 点对点无线通信 授课安排:2学时 一、教学目标 (1)掌握CC2530无线射频RF内核的组成及功能; (2)掌握RF帧处理原理、RF寄存器的操作方法; (3)熟悉CC2530的RF模块发送和接收数据的编程方法。 二、实验仪器 (1)硬件:PC机 (2)软件:IAR for 8051软件 三、实验准备 (1)掌握CC2530的RF模块发送和接收数据原理。 (2)熟悉IAR for 8051软件的使用。 四、实验原理 49 基于CC2530设计的2个节点,一个称为发送节点,另一个称为接收节点。发送节点的电路设计采用CC2530最小系统,接收节点电路原理如图8所示,它与PC通过串口连接。发送节点通过RF模块向接收节点发送数据,接收节点接收数据,然后通过串口发送给PC机, PC机上可以显示接收的数据。 20pF12MHz晶振20pFP0_2P0_4P0_3TXDDTR_NRTS_NVDD_RSRXDRI_NGNDNCDSR_NDCD_NCTS_NSHTD_NEE_CLKEE_DATAOSC2OSC1PLL_TESTGND_ANCGP1GP0GNDVDD_5NCGNDVO_33DMDP+5V1KΩR1P0_5PL2303VCCD-D+GNDUSB接口 图8 接收节点电路 五、实验内容及要求 依据原理图,编写程序,使发送CC2530通过RF模块将字符串“Hello!QST”发送出去,接收CC2530通过RF模块接收字符串,且接收后可以自动确认,然后将收到的字符串通过串口1发送到PC机,串口的发送原理和要求参考UART实验的实验原理的发送要求。 六、实验步骤及指导 50 (1)启动IAR for 8051软件,设计并编辑、编译程序。 (2)程序设计分析 1)发送节点程序设计 主要进行RF初始化程序、RF发送程序的设计。 ①RF初始化程序设计 初始化程序为发送节点和接收节点共用,所以实现的功能如下: 使能帧过滤; 使能AUTOCRC和AUTOACK; 寄存器更新设置; 设置数据传输信道,已知使用编号11的通道。 中断使能,允许接收方以中断的方式接收数据; 设置接收数据节点的地址; CSMA-CA选通器设置:清除RXFIFO缓冲区并复位解调器,为RX使能并校准频率。 51 ②RF发送程序设计 CC2530将需要发送的数据送到RFD寄存器,由它送到TXFIFO缓冲区中,这里注意,RFD只能存放一个字节,所以,如果要发送一串字符,需要按顺序依次送入到RFD中。 2)接收节点程序设计 主要设计RF接收程序、串口初始化及发送程序。串口相关程序参考串口部分设计。RF接收程序设计时注意:RXFIFO接收缓冲区接收若干字节的数据(一帧数据),CC2530首次读RFD寄存器,读出的是这帧数据的长度(帧长度),然后整帧数据左移一个字节,以此类推,读出整帧数据,RF初始化时使能了RF接收中断,当RXFIFO中接收到一个完整的帧时,置标志位RFIRQF0为1。 3)参考程序 #include\"iocc2530.h\" #include\"string.h\" #define uint unsigned int #define LED1 P1_0 #define LED2 P1_1 uint RX=0; 52 unsigned char buf[10]; unsigned char mac[]=\"Hello!QST\"; uint len=0; void rf_init(void); void tx(void); void UartTx_Send_String(unsigned char *Data,uint len1); void initUART(void); void Delay(uint); void main(void) { initUART(); P1SEL&=~(1<<0); P1DIR|=0x03; 53 LED1=0; LED2=0; EA=0; SLEEPCMD&=~0x04; while(!(SLEEPSTA&0x40)); CLKCONCMD =CLKCONCMD |0x38; CLKCONCMD =CLKCONCMD&(~0x07); SLEEPCMD|=0x04; rf_init(); EA=1; while(1) { tx(); 54 Delay(200); } } void rf_init() { FRMCTRL0|=(0x20|0x40); TXFILTCFG=0x09; AGCCTRL1=0x15; FSCAL1=0x00; RFIRQM0|=(1<<6); IEN2|=(1<<0); EA=1; FREQCTRL=0x0b; 55 SHORT_ADDR0=0x05; SHORT_ADDR1=0x00; PAN_ID0=0x22; PAN_ID1=0x00; RFST=0xed; RFST=0xe3; FRMFILT0=~(1<<0); } void tx() { unsigned char i; RFST=0xe3; while (FSMSTAT1&((1<<1)|(1<<5))); 56 RFIRQM0&=~(1<<6); IEN2&=~(1<<0); RFST=0xee; RFIRQF1=~(1<<1); RFD=12; for(i=0;i<4;i++) { RFD=mac[i]; } RFIRQM0|=(1<<6); IEN2&=(1<<0); RFST=0xe9; RFIRQF1|=0x01; 57 while (!(RFIRQF1&(1<<1))); RFIRQF1=~(1<<1); LED1=~LED1; Delay(200); } #pragma vector=RF_VECTOR __interrupt void rf_isr(void) { unsigned char i; EA=0; RFIRQF0|=(1<<6); if (RFIRQF0&(1<<6)) { 58 len=RFD-2; len&=0x7f; for(i=0;i RFD=mac[i]; buf[i]=RFD; Delay(200); } S1CON=0; RFIRQF0&=~(1<<6); LED2=~LED2; UartTx_Send_String(buf,len); memset(buf,0,sizeof(buf)); 59 len=0; } EA=1; } void UartTx_Send_String(unsigned char *Data,uint len1) { int j; for(j=0;j U1DBUF = *Data++; UTX1IF =1; while(UTX1IF == 0); UTX1IF = 0; 60 } } void Delay(uint n) { uint i; for(i=0;i void initUART(void) { 61 CLKCONCMD &= ~0x40; while(!(SLEEPSTA & 0x40)); SLEEPSTA|= 0x40; CLKCONCMD|=0x38; CLKCONCMD&=~0x07; SLEEPCMD |= 0x04; PERCFG &= ~0x02; P0SEL |= 0x3c; P2DIR &=0x7f; P2DIR |=0x40; U1CSR |= 0x80; U1GCR |= 10; U1BAUD |= 216; 62 URX1IF = 1; U1CSR |= 0X40; IEN0 |= 0x88; } (3)对编写的程序在IAR环境中编辑、编译、调试,最终实现实验要求。 七、实验报告要求 (1)正确书写实验目的,内容,要求。 (2)使用命令完成实验步骤的要求,并将实验现象和结果写在实验结果处理的部分。 八、思考题 CC2530的RF模块处理数据帧的原理是什么? 63 因篇幅问题不能全部显示,请点此查看更多更全内容