搜索
您的当前位置:首页正文

CC2530单片机原理及应用实验指导书

来源:筏尚旅游网


实验一 通用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;ttfor(tt=0;ttfor(tt=0;ttfor(tt=0;ttfor(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;ifor(i=0;ifor(i=0;ifor(i=0;ifor(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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top