项目5串口控制
5.1项目任务和指标
本项目将完成串口收发数据和串口控制LED灯等任务。
通过本项目的实施,读者应掌握串行通信接口的概念、串行通信接口寄存器的相关概念和方法,设置串行通信接口寄存器波特率的方法,重点是掌握UART接收的具体应用。
5.2项目的预备知识
5.2.1串行通信接口

CC2530有两个串行通信接口USART0和USART1,它们能够分别运行于异步模式(UART)或者同步模式(SPI)。当寄存器位UxCSR.MODE设置为1时,就选择了UART模式,这里x是USART的编号,数值为0或者1。当两个USART具有同样的功能,可以设置单独的I/O引脚,一旦硬件电路确定下来,再进行程序设计时,需要按照硬件电路来设置USART的I/O引脚。寄存器位PERCFGU0CFG选择是否使用备用位置1或备用位置2。在UART模式中,可以使用双线连接方式(含有引脚RXD、TXD)或者四线连接方式(含有引脚PXD、TXD、RTS和CTS),其中RTS和CTS引脚用于硬件流量控制。UART模式的操作具有以下特点: 
(1)  8位或者9位负载数据。
(2) 奇校验、偶校验或者无奇偶校验。
(3) 配置起始位和停止位电平。
(4) 配置LSB或者MSB首先传送。
(5) 独立收发中断。
(6) 独立收发DMA触发。
(7) 奇偶校验和帧校验出错状态。
UART模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART字节包含1个起始位、8个数据位、1个作为可选项的第9位数据或者奇偶校验位再加上1个或2个停止位。注意,虽然真实的数据包含8位或者9位,但是,数据传送只涉及1字节。






5.2.2串行通信接口寄存器
UART操作由USART控制和状态寄存器UxCSR以及UART控制寄存器UxUCR来控制。寄存器UxBAUD用于设置波特率,寄存器UxBUF是USART接收/传送数据缓存,这里的x是USART的编号,其数值为0或者1。表5.1~表5.5为USART0的相关寄存器。




表5.1U0CSR——USART0控制和状态寄存器



位
名称
复位
R/W
描述
7
MODE
0
R/W
USART模式选择

0: SPI模式

1: UART模式
6
RE
0
R/W
UART接收器使能。注意在UART完全配置之前不使能接收

0: 禁用接收器

1: 接收器使能
5
SLAVE
0
R/W
SPI主或者从模式选择

0: SPI主模式

1: SPI从模式
4
FE
0
R/W0
USART帧错误状态

0: 无帧错误检测

1: 字节收到不正确停止位级别
3
ERR
0
R/W0
UART奇偶错误状态

0: 无奇偶错误检测

1: 字节收到奇偶错误
2
RX_BYTE
0
R/W0
接收字节状态。UART模式和SPI从模式。当读U0DBUF该位自动清除,通过写0清除它,这样能有效丢弃U0DBUF中的数据

0: 没有收到字节

1: 准备好接收字节

续表


位
名称
复位
R/W
描述
1
TX_BYTE
0
R/W0
传送字节状态。UART模式和SPI主模式

0: 字节没有被传送

1: 写到数据缓存寄存器的最后字节被传送
0
ACTIVE
0
R
USART传送/接收主动状态。在SPI从模式下该位等于从模式选择

0: USART空闲

1: 在传送或者接收模式USART忙碌



表5.2U0UCR——USART0 UART控制寄存器



位
名称
复位
R/W
描述
7
FLUSH
0
RO/W1
清除单元。当设置时,该事件将会立即停止当前操作并且返回单元的空闲状态
6
FLOW
0
R/W
UART硬件流使能。用RTS和CTS引脚选择硬件流控制的使用

0: 流控制禁止

1: 流控制使能
5
D9
0
R/W
UART奇偶校验位。当使能奇偶检验,写入D9的值决定发送的第9位的值,如果收到的第9位不匹配收到字节的奇偶校验,接收时报告ERR。
如果奇偶校验使能,那么该位设置以下奇偶校验级别

0: 奇校验

1: 偶校验
4
BIT9
0
R/W
UART9位数据使能。当该位是1时,使能奇偶校验位传输(即第9位)。如果通过PARITY使能奇偶校验,第9位的内容是通过D9给出的

0: 8位传送

1: 9位传送
3
PARITY
0
R/W
UART奇偶校验使能。除了为奇偶校验设置该位用于计算,必须使能9位模式

0: 禁用奇偶校验

1: 奇偶校验使能
2
SPB
0
R/W
UART停止位的位数。选择要传送的停止位的位数

0: 1位停止位

1: 2位停止位

续表


位
名称
复位
R/W
描述
1
STOP
1
R/W
UART停止位的电平必须不同于开始位的电平

0: 停止位低电平

1: 停止位高电平
0
START
0
R/W
UART起始位电平。闲置线的极性采用选择的起始位级别的电平的相反的电平

0: 起始位低电平

1: 起始位高电平



表5.3U0GCR(0xC5)——USART0通用控制寄存器



位
名称
复位
R/W
描述

7
CPOL
0
R/W
SPI的时钟极性

0: 负时钟极性

1: 正时钟极性

6
CPHA
0
R/W
SPI的时钟极性

0: CPOL颠倒后传送CPOL

1: CPOL到CPOL后颠倒
5
ORDER
0
R/W
传送位顺序

0: LSB先传送

1: MSB先传送
4∶0
BAUD_E[4∶0]
0 0000
R/W
波特率指数值。BAUD_E和BAUD_M决定了UART波特率和SPI的主SCK时钟频率



表5.4U0BUF——USART0接收/传送数据缓存寄存器



位
名称
复位
R/W
描述
7∶0
DATA[7∶0]
0x00
R/W
USART接收和传送数据。当写这个寄存器的时候数据被写到内部,传送数据寄存器。当读取该寄存器的时候,数据来自内部读取的数据寄存器




表5.5U0BAUD——USART0波特率控制寄存器



位
名称
复位
R/W
描述
7∶0
BAUD_M[7∶0]
0x00
R/W
波特率小数部分的值。BAUD_E和BAUD_M决定了UART的波特率和SPI的主SCK时钟频率

5.2.3设置串行通信接口寄存器波特率
当运行状态UART模式时,内部的波特率发生器设置UART波特率,由寄存器UxBAUD.BAUD_M[7∶0]和UxGCR.BAUD_E[4∶0]定义波特率,如表5.6所示。



表5.632MHz系统时钟常用的波特率设置



波特率/bps
UxBAUD.BAUD_M
UxGCR.BAUD_E
误差/%
2400
59
6
0.14
4800
59
7
0.14
9600
59
8
0.14
14400
216
8
0.03
19200
59
9
0.14
28800
216
9
0.03
38400
59
10
0.14
57600
216
10
0.03
76800
59
11
0.14
115200
216
11
0.03
230400
216
12
0.03


5.2.4UART接收
当1写入UxCSR.RE位时,在UART上数据接收就开始了。然后UART会在输入引脚RXDx中寻找有效起始位,并且设置UxCSR.ACTIVE位为1。当检测出有效起始位时,收到的字节就传入到接收寄存器,通过寄存器UxBUF提供收到的数据字节。当UxBUF读出时,xCSR.RX_BYTE位由硬件清0。
5.3项目实施
5.3.1任务1: 串口收发数据
1. 项目环境


(1) 硬件: ZigBee(CC2530)模块、ZigBee下载调试板、USB仿真器和PC。
(2) 软件: IAR Embedded Workbench for MCS51。
2. 项目原理
1) 硬件接口原理
ZigBee(CC2530)模块LED硬件接口如图5.1所示。 


图5.1LED硬件接口

ZigBee(CC2530)模块硬件上设计有两个LED灯,用来编程调试使用。分别连接CC2530的P1_0、P1_1两个I/O引脚。从原理图上可以看出,两个LED灯共阳极,当P1_0、P1_1引脚为低电平时,LED灯点亮。
2)  CC2530 I/O相关寄存器
P1寄存器的相关信息如表5.7所示,P1DIR寄存器的相关信息如表5.8所示。



表5.7P1寄存器



位
名称
复位
R/W
描述
7∶0
P1_[7∶0]
0xFF
R/W
端口1是通用I/O端口。位寻址从SFR开始。CPU内部寄存器是可读的,但是不可写,从XDATA(0x7090)开始




表5.8寄存器P1DIR



位
名称
复位
R/W
描述

7∶0
DIRP1_[7∶0]
0x00
R/W
P1_7~P1_0的I/O方向

0: 输入

1: 输出


表5.7和表5.8中列出了关于CC2530处理器的P1 I/O相关寄存器,其中只用到了P1和P1DIR两个寄存器的设置,P1寄存器为可读写的数据寄存器,P1DIR为I/O选择寄存器,其他I/O寄存器的功能,使用默认配置。
CLKCONCMD和CLKCONSTA寄存器的相关信息如表5.9和表5.10所示。




表5.9CLKCONCMD时钟控制寄存器



位
名称
复位
R/W
描述

7
OSC32K
1
W
32kHz时钟源选择

0: 32kHz晶振

1: 32kHz RC振荡

6
OSC
1
W
主时钟源选择

0: 32MHz晶振

1: 16MHz RC振荡

5∶3
TICKSPD[2∶0]
001
W
定时器计数时钟分频(该时钟频不大于OSC决定频率)

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 0.5MHz

111: 0.25MHz

续表


位
名称
复位
R/W
描述
2∶0
CLKSPD
001
W
时钟速率,不能高于系统时钟

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 500kHz

111: 250kHz




表5.10CLKCONSTA时钟状态寄存器



位
名称
复位
R/W
描述

7
OSC32K
1
R
32kHz时钟源选择

0: 32kHz晶振

1: 32kHz RC振荡

6
OSC
1
R
主时钟源选择

0: 32MHz晶振

1: 16MHz RC振荡

5∶3
TICKSPD[2∶0]
001
R
定时器计数时钟分频(该时钟频不大于OSC决定频率)

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 0.5MHz

111: 0.25MHz

2∶0
CLKSPD
001
R
时钟速率,不能高于系统时钟

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 500kHz

111: 250kHz

SLEEPCMD控制寄存器的相关信息如表5.11所示,PERCFG寄存器的相关信息如表5.12所示。




表5.11SLEEPCMD睡眠模式控制寄存器



位
名称
复位
R/W
描述
7
—
0
R
预留
6
XOSC_STB
0
W
低速时钟状态

0: 没有打开或者不稳定

1: 打开且稳定
5
HFRC_STB
0
W
主时钟状态

0: 没有打开或者不稳定

1: 打开且稳定
4∶3
RST[1∶0]
xx
W
最后一次复位指示

00: 上电复位

01: 外部复位

10: 看门狗复位

2
OSC_PD
0
W
节能控制,OSC状态改变的时候硬件清0

0: 不关闭无用时钟

1: 关闭无用时钟
1∶0
MODE[1∶0]
0
W
功能模式选择

00: PM0

01: PM1

10: PM2

11: PM3



表5.12PERCFG外设控制寄存器



位
名称
复位
R/W
描述

7
—
0
R
预留
6
T1CFG
0
R/W
T1 I/O位置选择

0: 位置1

1: 位置2
5
T3CFG
0
R/W
T3 I/O位置选择

0: 位置1

1: 位置2
4
T4CFG
0
R/W
T4 I/O位置选择

0: 位置1

1: 位置2
3∶2
—
00
RO
预留
1
U1CFG
0
R/W
串口1位置选择

0: 位置1

1: 位置2
0
U0CFG
0
R/W
串口0位置选择

0: 位置1

1: 位置2

U0CSR寄存器的相关信息如表5.13所示,U0GCR寄存器的相关信息如表5.14所示,U0BUF寄存器的相关信息如表5.15所示,U0BAUD寄存器的相关信息如表5.16所示。



表5.13U0CSR(串口0控制和状态寄存器)



位
名称
复位
R/W
描述

7
MODE
0
R/W
串口模式选择

0: SPI模式

1: UART模式
6
RE
0
R/W
接收使能

0: 关闭接收

1: 允许接收

5
SLAVE
0
R/W
SPI主从选择

0: SPI主

1: SPI从
4
FE
0
R/W
串口帧错误状态

0: 没有帧错误

1: 出现帧错误
3
ERR
0
R/W
串口校验结果

0: 没有校验错误

1: 字节校验出错
2
RX_BYTE
0
R/W
接收状态

0: 没有接收到数据

1: 接收到1字节数据
1
TX_BYTE
0
R/W
发送状态

0: 没有发送

1: 最后一次写入U0BUF的数据已经发送
0
ACTIVE
0
R
串口忙标志

0: 串口闲

1: 串口忙



表5.14U0GCR(串口0常规控制寄存器)



位
名称
复位
R/W
描述

7
CPOL
0
R/W
SPI时钟极性

0: 低电平空闲

1: 高电平空闲
6
CPHA
0
R/W
SPI时钟相位

0: 由CPOL跳向非CPOL时采样,由非CPOL跳向CPOL时输出

1: 由非CPOL跳向CPOL时采样,由CPOL跳向非CPOL时输出

续表


位
名称
复位
R/W
描述
5
ORDER
0
R/W
传输位序

0: 低位在先

1: 高位在先
4∶0
BAUD_E[4∶0]
0x00
R/W
波特率指数值,BAUD_M决定波特率



表5.15U0BUF(串口0收发缓冲器)



位
名称
复位
R/W
描述
7∶0
DATA[7∶0]
0x00
R/W
UART0收发寄存器



表5.16U0BAUD(串口0波特率控制器)



位
名称
复位
R/W
描述
7∶0
BAUD_M[7∶0]
0x00
R/W
波特率尾数,与BAUD_E决定波特率

表5.9~表5.16中列举了和CC2530处理器串口操作相关的寄存器,其中包括: CLKCONCMD控制寄存器,用来控制系统时钟源; SLEEPCMD和SLEEPSTA寄存器,用来控制各种时钟源的开关和状态; PERCFG寄存器为外设功能控制寄存器,用来控制外设功能模式; U0CSR、U0GCR、U0BUF、U0BAUD等为串口相关寄存器。
3. 软件设计


#include <iocc2530.h>

#include <stdio.h>

#include "./uart/hal_uart.h"

#define uchar unsigned char

#define uint unsigned int 

#define uint8 uchar

#define uint16 uint

#define TRUE 1

#define FALSE 0

//定义控制LED灯的端口

#define LED1 P1_0  //定义LED1为P1_0端口控制

#define LED2 P1_1  //定义LED2为P1_1端口控制

uchar temp;

/****************************

//延时函数

*****************************/

void Delay(uint n)

{

uint i,t;

for(i = 0;i<5;i++)

for(t = 0;t<n;t++);

}


void InitLed(void)

{

P1DIR |= 0x03;   //P1_0、P1_1定义为输出

LED1 = 1;       //LED1灯熄灭

LED2 = 1;	    //LED2灯熄灭

}

void main(void)

{

char receive_buf[30];

uchar counter =0;

uchar RT_flag=1;   

InitUart();    // 波特率为57600bps

InitLed();

while(1)

{

if(RT_flag == 1)		  //接收

{

LED2=0;			  //接收状态指示

if( temp != 0)

{

if((temp!='\r')&&(counter<30)) //'\r‘回车键为结束字符
//最多能接收30个字符

{                       

receive_buf[counter++] = temp;

}

else

{

RT_flag = 3;                   //进入发送状态

}

if(counter == 30)  RT_flag = 3;

temp  = 0;

}

}   

if(RT_flag == 3)			     //发送

{

LED2 = 1;                          //关LED2

LED1 = 0;			     //发送状态指示

U0CSR &= ~0x40;		     //禁止接收

receive_buf[counter] = '\0';

prints(receive_buf);

prints("\r\n");

U0CSR |= 0x40;	  //允许接收

RT_flag = 1;		        //恢复到接收状态

counter = 0;		  //指针归0

LED1 = 1;		  //关发送指示

}

}

}

/****************************************************************

*函数功能 : 串口接收一个字符					

*入口参数 : 无						

*返 回 值 : 无				

*说    明 : 接收完成后打开接收				

****************************************************************/

#pragma vector = URX0_VECTOR

 __interrupt void UART0_ISR(void)

{

URX0IF = 0;			  //清中断标志

temp = U0DBUF;

}

程序通过配置CC2530处理器的串口相关控制寄存器来设置串口0的工作模式为串口模式,波特率为57600bps,使用中断方式接收串口数据并向串口输出。
4. 实施步骤
(1) 使用ZigBee Debuger USB仿真器连接PC和ZigBee(CC2530)模块,打开ZigBee模块开关供电。将系统配套串口线一端连接PC,另一端连接ZigBee调试板的串口上。
(2) 启动IAR开发环境,新建工程。
(3) 在IAR开发环境中编译、运行、调试程序。
(4) 使用PC自带的超级终端(注意: 字符串必须以回车键结束或输入字符串长度超过30个字符,才会显示)。连接串口,将超级终端设置为串口波特率57600bps、8位、无奇偶校验,无硬件流模式,当向串口终端输入数据并按回车结束时,将在超级终端看到串口输入的数据。
5.3.2任务2: 串口控制LED
1. 项目环境

(1) 硬件: ZigBee(CC2530)模块、ZigBee下载调试板、USB仿真器和PC。
(2) 软件: IAR Embedded Workbench for MCS51。
2. 项目原理
1) 硬件接口原理
ZigBee(CC2530)模块LED硬件接口如图5.2所示。


图5.2LED硬件接口

ZigBee(CC2530)模块硬件上设计有两个LED灯,用来编程调试使用。分别连接CC2530的P1_0、P1_1两个I/O引脚。从原理图上可以看出,两个LED灯共阳极,当P1_0、P1_1引脚为低电平时,LED灯点亮。
2)  CC2530 I/O相关寄存器
P1寄存器的相关信息如表5.17所示,P1DIR寄存器的相关信息如表5.18所示。



表5.17P1寄存器



位
名称
复位
R/W
描述

7∶0
P1_[7∶0]
0xFF
R/W
端口1是通用I/O端口。位寻址从SFR开始。CPU内部寄存器是可读的,但是不可写,从XDATA(0x7090)开始



表5.18寄存器P1DIR



位
名称
复位
R/W
描述

7∶0
DIRP1_[7∶0]
0x00
R/W
P1_7~P1_0的I/O方向

0: 输入

1: 输出


表5.17和表5.18中列出了关于CC2530处理器的P1 I/O相关寄存器,其中只用到了P1和P1DIR两个寄存器的设置,P1寄存器为可读写的数据寄存器,P1DIR为I/O选择寄存器,其他I/O寄存器的功能使用默认配置。
CLKCONCMD和CLKCONSTA寄存器的相关信息如表5.19和表5.20所示。



表5.19CLKCONCMD时钟控制寄存器



位
名称
复位
R/W
描述

7
OSC32K
1
W
32kHz时钟源选择

0: 32kHz晶振

1: 32kHz RC振荡
6
OSC
1
W
主时钟源选择

0: 32MHz晶振

1: 16MHz RC振荡
5∶3
TICKSPD[2∶0]
001
W
定时器计数时钟分频(该时钟频不大于OSC决定频率)

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 0.5MHz

111: 0.25MHz

续表


位
名称
复位
R/W
描述
2∶0
CLKSPD
001
W
时钟速率,不能高于系统时钟

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 500kHz

111: 250kHz



表5.20CLKCONSTA时钟状态寄存器



位
名称
复位
R/W
描述

7
OSC32K
1
R
32kHz时钟源选择

0: 32kHz晶振

1: 32kHz RC振荡
6
OSC
1
R
主时钟源选择

0: 32MHz晶振

1: 16MHz RC振荡

5∶3
TICKSPD[2∶0]
001
R
定时器计数时钟速率(该时钟频不大于OSC决定频率)

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 0.5MHz

111: 0.25MHz
2∶0
CLKSPD
001
R
时钟速率,不能高于系统时钟

000: 32MHz

001: 16MHz

010: 8MHz

011: 4MHz

100: 2MHz

101: 1MHz

110: 500kHz

111: 250kHz

SLEEPCMD控制寄存器的相关信息如表5.21所示,PERCFG寄存器的相关信息如表5.22所示。




表5.21SLEEPCMD睡眠模式控制寄存器



位
名称
复位
R/W
描述

7
—
0
R
预留
6
XOSC_STB
0
W
低速时钟状态

0: 没有打开或者不稳定

1: 打开且稳定
5
HFRC_STB
0
W
主时钟状态

0: 没有打开或者不稳定

1: 打开且稳定
4∶3
RST[1∶0]
xx
W
最后一次复位指示

00: 上电复位

01: 外部复位

10:  看门狗复位
2
OSC_PD
0
W
节能控制,OSC状态改变的时候硬件清0

0: 不关闭无用时钟

1: 关闭无用时钟
1∶0
MODE[1∶0]
0
W
功能模式选择

00: PM0

01: PM1

10: PM2

11: PM3


表5.22PERCFG外设控制寄存器



位
名称
复位
R/W
描述

7
—
0
R
预留
6
T1CFG
0
R/W
T1 I/O位置选择

0: 位置1

1: 位置2
5
T3CFG
0
R/W
T3 I/O位置选择

0: 位置1

1: 位置2
4
T4CFG
0
R/W
T4 I/O位置选择

0: 位置1

1: 位置2
3∶2
—
00
RO
预留
1
U1CFG
0
R/W
串口1位置选择

0: 位置1

1: 位置2
0
U0CFG
0
R/W
串口0位置选择

0: 位置1

1: 位置2

U0CSR寄存器的相关信息如表5.23所示,U0GCR寄存器的相关信息如表5.24所示,U0BUF寄存器的相关信息如表5.25所示,U0BAUD寄存器的相关信息如表5.26所示。



表5.23U0CSR(串口0控制和状态寄存器)



位
名称
复位
R/W
描述

7
MODE
0
R/W
串口模式选择

0:  SPI模式

1:  UART模式
6
RE
0
R/W
接收使能

0: 关闭接收

1: 允许接收
5
SLAVE
0
R/W
SPI主从选择

0: SPI主

1:  SPI从
4
FE
0
R/W
串口帧错误状态

0: 没有帧错误

1: 出现帧错误
3
ERR
0
R/W
串口校验结果

0: 没有校验错误

1: 字节校验出错
2
RX_BYTE
0
R/W
接收状态

0: 没有接收到数据

1: 接收到1字节数据

1
TX_BYTE
0
R/W
发送状态

0: 没有发送

1: 最后一次写入U0BUF的数据已经发送
0
ACTIVE
0
R
串口忙标志

0: 串口闲

1: 串口忙



表5.24U0GCR(串口0常规控制寄存器)



位
名称
复位
R/W
描述

7
CPOL
0
R/W
SPI时钟极性

0: 低电平空闲

1: 高电平空闲
6
CPHA
0
R/W
SPI时钟相位

0: 由CPOL跳向非CPOL时采样,由非CPOL跳向CPOL时输出

1: 由非CPOL跳向CPOL时采样,由CPOL跳向非CPOL时输出

续表


位
名称
复位
R/W
描述
5
ORDER
0
R/W
传输位序

0: 低位在先

1: 高位在先
4∶0
BAUD_E[4∶0]
0x00
R/W
波特率指数值,BAUD_M决定波特率



表5.25U0BUF(串口0收发缓冲器)



位
名称
复位
R/W
描述

7∶0
DATA[7∶0]
0x00
R/W
UART0收发寄存器



表5.26U0BAUD(串口0波特率控制器)



位
名称
复位
R/W
描述

7∶0
BAUD_M[7∶0]
0x00
R/W
波特率尾数,与BAUD_E决定波特率

表5.19~表5.26中列举了和CC2530处理器串口操作相关的寄存器,其中包括: CLKCONCMD和CLKCONSTA控制寄存器,用来控制系统时钟源和状态; SLEEPCMD和SLEEPSTA寄存器,用来控制各种时钟源的开关和状态; PERCFG寄存器为外设功能控制寄存器,用来控制外设功能模式; U0CSR、U0GCR、U0BUF、U0BAUD等为串口相关寄存器。
3. 软件设计

#include <iocc2530.h>

#include <stdio.h>

#include "./uart/hal_uart.h"

#define uchar unsigned char

#define uint unsigned int 

#define uint8 uchar

#define uint16 uint

#define TRUE 1

#define FALSE 0

//定义控制LED灯的端口

#define LED1 P1_0  //定义LED1为P1_0端口控制

#define LED2 P1_1  //定义LED2为P1_1端口控制

uchar temp;

/****************************

//延时函数

*****************************/

void Delay(uint n)

{

uint i,t;

for(i = 0;i<5;i++)

for(t = 0;t<n;t++);

}

void InitLed(void)

{

P1DIR |= 0x03;   //P1_0、P1_1定义为输出

LED1 = 1;       //LED1灯熄灭

LED2 = 1;	    //LED2灯熄灭

}

void main(void)

{

char receive_buf[3];

uchar counter =0;

uchar RT_flag=1;



InitUart();    // 波特率为57600bps

InitLed();  

prints("input: 11----->LED1 on   10----->LED1 off 21----->LED2 on
20----->LED2 off\r\n");

while(1)

{

if(RT_flag == 1)		  //接收

{

if( temp != 0)

{

if((temp!='\r')&&(counter<3))//'\r'回车键为结束字符 

//最多能接收3个字符

{                       

receive_buf[counter++] = temp;

}

else

{

RT_flag = 3;                   //进入LED设置状态

}

if(counter == 3)  RT_flag = 3;

temp  = 0;

}

}

if(RT_flag == 3)			 //LED状态设置

{

U0CSR &= ~0x40;		         //禁止接收

receive_buf[2] = '\0';

// prints(receive_buf);      prints("\r\n");

if(receive_buf[0] == '1')

{ 

if(receive_buf[1] == '1')   { LED1 = 0;   prints("led1 on\r\n");   }    

else if(receive_buf[1] == '0') { LED1 = 1;   prints("led1 off\r\n");  }

}

else if(receive_buf[0] == '2')

{ 

if(receive_buf[1] == '1')  { LED2 = 0;   prints("led2 on\r\n");   }   

else if(receive_buf[1] == '0') { LED2 = 1; prints("led2 off\r\n");  }

}

U0CSR |= 0x40;		        //允许接收

RT_flag = 1;		        //恢复到接收状态

counter = 0;		  //指针归0

}

}

}

/****************************************************************

*函数功能 : 串口接收一个字符					

*入口参数 : 无						

*返 回 值 : 无				

*说    明 : 接收完成后打开接收				

****************************************************************/

#pragma vector = URX0_VECTOR

 __interrupt void UART0_ISR(void)

{

URX0IF = 0;			  //清中断标志

temp = U0DBUF;

}



程序通过配置CC2530处理器的串口相关控制寄存器来设置串口0的工作模式为串口模式,波特率为57600bps,通过判断串口的输入来控制LED灯的状态。
4. 实施步骤
(1) 使用ZigBee Debuger USB仿真器连接PC和ZigBee(CC2530)模块,打开ZigBee模块开关供电。将系统配套串口线一端连接PC,另一端连接在ZigBee调试板的串口上。
(2) 启动IAR开发环境,新建工程。
(3) 在IAR开发环境中编译、运行、调试程序。
(4) 使用PC自带的超级终端连接串口,将超级终端设置为串口波特率57600bps、8位、无奇偶校验,无硬件流模式,当向串口输入相应数据格式的数据时,即可控制LED灯的开关。


LED1开: 11回车
LED1关: 10回车
LED2开: 21回车
LED2关: 20回车