第三次无线传感器网络实验

更新时间:2024-04-02 03:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

南昌航空大学实验报告

二O 一六 年 四 月 20 日

课程名称: 无线传感器网络 实验名称:CC2530 串口指令控制LED灯 班级: 姓名:

指导教师评定: 签名:

一、实验目的

1. 通过实验掌握CC2530 芯片串口配置与使用 2. 观察底板上RX、TX串口发送指示灯的变化

3. 接收串口发送过来的数据,通过数据内容分析控制LED

注:嵌入式开发中,当程序能跑起来后,串口是第一个要跑起来的设备,所有的工作状态,交互信息都会从串口输出。

二、实验内容

1. 查看数据手册,了解CC2530的串口功能,熟悉串口的相关配置寄存器; 2. 根据实验手册内容配置CC2530的串口相关寄存器,使用P0_2和P0_3的外设功能将其配置为串口方式,并设置波特率为115200后处理串口的中断,使其允许接收数据并产生中断; 3. 配置所需LED灯的I/O口;

4. 编写串口的初始化、发送数据以及中断处理函数;

5. 在程序入口函数中,设置系统时钟源和主频,初始化完毕后,进入while循环处理相应指令并控制LED灯。

三、实验相关电路图

图1

PL2303HX串口转换芯片电路原理图

P0_2、P0_3配置为外设功能时:P0_2为RX, P0_3为TX. USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI模式。两个USART具有同样的功能,可以设置在单独的I/O 引脚 。

四、实验过程

1. 串口的配置

1)配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0。

2)配置相应串口的控制和状态寄存器。 3)配置串口工作的波特率。 波特率由下式给出:

F 是系统时钟频率,等于16 MHz RCOSC 或者32 MHz XOSC。

2. 中断的初始化

1)标志位清0;

2)处理串口的默认接收状态; 3)开启系统中断。

3. 使用串口调试助手对程序进行调试检验,注意发送的指令必须以字符串形式发送而不能以hex形式发送;

4. 源代码

#include #include

typedef unsigned char uchar; typedef unsigned int uint; #define UART0_RX 1 #define UART0_TX 2 #define CONTROL_LED 3 #define SIZE 4 #define ON 0 #define OFF 1 #define LED1 P1_0 #define LED2 P1_1 char RxBuf; char UartState; uchar count;

char RxData[SIZE]; //存储发送字符串 void DelayMS(uint msec) {

uint i,j;

for (i=0; i

void InitLed(void) {

P1DIR |= 0x03; //P1.0和P1.1定义为输出口 }

void InitUart(void) {

PERCFG = 0x00;

//外设控制寄存器 USART 0的IO位置1

P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能) P2DIR &= ~0xC0; //P0优先作为UART0 U0CSR |= 0x80; //设置为UART方式 U0GCR |= 11;

U0BAUD |= 216; //波特率设为115200

UTX0IF = 0; //UART0 TX中断标志初始置位0 U0CSR |= 0x40; //允许接收

IEN0 |= 0x84; //开总中断允许接收中断 }

void UartSendString(char *Data, int len) {

uint i;

for(i=0; i

U0DBUF = *Data++; while(UTX0IF == 0); UTX0IF = 0; } }

#pragma vector = URX0_VECTOR __interrupt void UART0_ISR(void)

{

URX0IF = 0; // 清中断标志

RxBuf = U0DBUF; }

void main(void) {

CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定为32M CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ InitLed();

//设置LED灯相应的IO口

InitUart(); //串口初始化函数 UartState = UART0_RX;

//串口0默认处于接收模式

memset(RxData, 0, SIZE); while(1) {

if(UartState == UART0_RX) //接收状态 {

if(RxBuf != 0) {

if((RxBuf != '#')&&(count < 3))//以'#'为结束符 RxData[count++] = RxBuf; else {

if(count >= 3) //判断数据合法性,防止溢出 {

count = 0; //计数清0 memset(RxData, 0, SIZE);//清空接收缓冲 } else

UartState = CONTROL_LED;//进入发送状态 }

RxBuf = 0; } }

if(UartState == CONTROL_LED) //控制LED灯 {

//判断接收的数据合法性

if((RxData[0]=='d'||RxData[0]=='D')&&(RxData[1]=='1'||RxData[1]=='2')) {

if(RxData[1]=='1')

LED1 = ~LED1; //低电平点亮 else

LED2 = ~LED2; } else

if((RxData[0]=='a'||RxData[0]=='A')&&(RxData[1]=='0'||RxData[1]=='1')) {

if(RxData[1]=='0') {

LED1 = ON; LED2 = ON; } else {

LED1 = OFF; LED2 = OFF; }

}

UartState = UART0_RX; count = 0;

memset(RxData, 0, SIZE); //清空接收缓冲区 } } }

五、实验心得

本次实验主要是熟悉串口功能的使用,通过实验弄清了串口相关的寄存器及

配置方法,通过自己动手写代码配置寄存器加强了对串口功能的掌握,进一步熟悉了对于硬件编程的特点,即寄存器的配置,也巩固了对串口通信的理解和运用,还有一点是在调试程序过程中积累了经验,有助于后期对CC2530芯片编写程序和调试程序。

本文来源:https://www.bwwdw.com/article/juir.html

Top