zigbee基础应用(五)uart串口通信
来源:互联网 发布:mac的ppt怎么调16:9 编辑:程序博客网 时间:2024/06/05 12:39
zigbee基础应用(五)uart串口通信
1.硬件篇
P0.2为RX P0.3为TX
2.芯片篇
用到的芯片的概况
3.计算篇
波特率的计算公式,通过对UxBAUD.BAUD_M和UxGCR.BAUD_E的配置来设置波特率,如
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
U0BAUD |= 216; //波特率设为115200
4.软件篇
实现步骤:
(1)设置时钟源的晶振 通过CLKCONCMD
等待晶振稳定 通过CLKCONSTA
设置系统主时钟频率 CLKCONCMD
(2)UART的备用位置 PERCFG
将要使用的IO口设置为外设IO P0SEL
外设优先级设置 P2DIR
(3)设置UART模式 U0CSR
通过对UxBAUD.BAUD_M和UxGCR.BAUD_E的配置来设置波特率
UART0 TX中断标志初始置位0 UTX0IF
(4)通过U0DBUF来发送和接收数据
UTX0IF来判断是否发送完成 ,为1则发送成功
URX0IF来判断是否接受完成,为1则接收成功
接收数据时U0CSR |= 0X40;允许接收
发送数据时U0CSR &= 0X40;禁止接收
代码:
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P1_0
#define LED2 P1_1
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
uchar Recdata[30]="hello zigbee!\n";
uchar RXTXflag = 1;
uchar temp;
uint datanumber = 0;
uint stringlen;
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
#if 0
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF;
}
#else
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
// IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
P1DIR = 0x03; //P1控制LED
LED1 = 1;
LED2 = 1; //关LED
initUART0();
stringlen = strlen((char *)Recdata);
UartTX_Send_String(Recdata,stringlen);
while(1)
{
if(RXTXflag == 1) //接收状态
{
if( URX0IF == 1)
{
LED2=0; //接收状态指示
URX0IF = 0; //清中断标志
temp = U0DBUF;
if((temp!='#')&&(datanumber<50)) //’#‘被定义为结束字符,最多能接收50个字符
{
Recdata[datanumber++] = temp;
}
else
{
RXTXflag = 3; //进入发送状态
}
if(datanumber == 50)
{
RXTXflag = 3;
}
temp = 0;
LED2=1; //接收状态指示
}
}
if(RXTXflag == 3) //发送状态
{
UartTX_Send_String("send:",5);
LED2 = 1; //关LED2
LED1 = 0; //发送状态指示
U0CSR &= ~0x40; //不能收数
UartTX_Send_String(Recdata,datanumber);
UartTX_Send_String("\n",1);
U0CSR |= 0x40; //允许接收
RXTXflag = 1; //恢复到接收状态
datanumber = 0; //指针归0
LED1 = 1; //关发送指示
memset(Recdata, 0, sizeof(Recdata));
}
}
}
#endif
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P1_0
#define LED2 P1_1
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
uchar Recdata[30]="hello zigbee!\n";
uchar RXTXflag = 1;
uchar temp;
uint datanumber = 0;
uint stringlen;
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
#if 0
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF;
}
#else
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
// IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
P1DIR = 0x03; //P1控制LED
LED1 = 1;
LED2 = 1; //关LED
initUART0();
stringlen = strlen((char *)Recdata);
UartTX_Send_String(Recdata,stringlen);
while(1)
{
if(RXTXflag == 1) //接收状态
{
if( URX0IF == 1)
{
LED2=0; //接收状态指示
URX0IF = 0; //清中断标志
temp = U0DBUF;
if((temp!='#')&&(datanumber<50)) //’#‘被定义为结束字符,最多能接收50个字符
{
Recdata[datanumber++] = temp;
}
else
{
RXTXflag = 3; //进入发送状态
}
if(datanumber == 50)
{
RXTXflag = 3;
}
temp = 0;
LED2=1; //接收状态指示
}
}
if(RXTXflag == 3) //发送状态
{
UartTX_Send_String("send:",5);
LED2 = 1; //关LED2
LED1 = 0; //发送状态指示
U0CSR &= ~0x40; //不能收数
UartTX_Send_String(Recdata,datanumber);
UartTX_Send_String("\n",1);
U0CSR |= 0x40; //允许接收
RXTXflag = 1; //恢复到接收状态
datanumber = 0; //指针归0
LED1 = 1; //关发送指示
memset(Recdata, 0, sizeof(Recdata));
}
}
}
#endif
0 0
- zigbee基础应用(五)uart串口通信
- ZigBee基础实验(五)--UART(ONLY串口发送)
- ZigBee基础实验(六)--UART(串口收发)
- Zigbee之旅(五):几个重要的CC2430基础实验——串口通信
- FPGA基础设计(三):UART串口通信
- 11.5 UART串口通信的基本应用
- STM32的串口通信(uart)
- UART串口通信
- CC2430 串口通信UART
- 串口通信UART--读书笔记
- UART串口通信
- UART串口通信
- STM32 --UART串口通信
- C51 UART 串口通信
- UART串口通信
- UART串口通信
- UART串口通信
- Zigbee串口通信
- HDU5592 ZYB's Premutation 树状数组应用
- DTU原理及基础知识
- AVFormatContext结构体源码解析
- 深入浅出学Hive——Hive安装与配置
- 一段常用的加解密代码demo
- zigbee基础应用(五)uart串口通信
- Android 4.4前后版本读取图库图片和拍照完美解决方案
- shell 脚本之for
- 如何计算润几月
- iOS开发3DTouch(二)
- mysql The InnoDB memory heap is disabled 问题决解
- (半)linux下ab网站压力测试命令
- 双向链表操作(逆置三种实现以及 冒泡排序 )
- 【c++】菱形虚拟虚拟继承模型探索