项目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 MCS51。 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 MCS51。 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回车