您的位置:首页 > 其它

CC2530--串口实验的回显

2014-01-10 17:25 176 查看
今天做了一个下面的实验,注释都有了,所以就不过多解释了,主要就是总结一下

1.串口收发要初始化串口,(设置时钟频率-->选择用来当做串口的IO-->设置波特率-->发送中断设为0-->打开数据接收的中断)

2.字符串发送函数(U0DBUF填充字符-->等待串口发送完毕-->发送中断标志设为0,准备下次发送)

3.按键中断服务程序中,除了P1IFG要清零以外,P1IF也要清零。哎,忘记为什么了,有谁知道的,可以告诉我一下。反正我试了一下,不加上P1IF清零,程序就死循环了。

/****************************
* project: 串口实验的回显
*    描述:在PC机中的串口软件中发送数据给cc2530,
当发生以下其中一个条件时,cc2530就将数
据发回给PC机,PC端的串口软件显示该数据
a)cc2530接收到“#”
b)接收到的数据长度等于50
c)按下按键s3
*    时间:2014年1月9日
*    作者:林少游
***************************/
#include <ioCC2530.h>
#include <string.h>

#define YLED P1_0
#define BLED P1_1
#define KEY3 P1_2

#define uchar unsigned char
#define uint unsigned int

#define LIGHTOPEN 1
#define LIGHTCLOSE 0

uint DataNumber=0;    //接收到的数据的长度
char temp=0;          //接收到的字符
char ReceiveData[50]; //接收到的数据
char TXRXFlag=1;      //发送标志,1代表接收数据,3代表发送数据

void Delay(uint n);
void Init_Io();
void Init_Usart0();
void Usart0_Send_String(char *Data,int len);

/****************************
* @brief : 延时函数
****************************/
void Delay(uint n)
{
uint i;
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
}

/****************************
* @brief : IO端口初始化
*   描述 :Led灯的作用是标志数据接收或发送的状态
****************************/
void Init_Io()
{
P1DIR |= 0X03;      //P1.0,P1.1设置为输出
YLED = LIGHTOPEN;   //开黄灯
BLED = LIGHTCLOSE;  //关蓝灯

P1DIR &= ~0X40;     //P1.2设置为输入
P1IEN |= 0X04;      //P1.2设置为允许中断
PICTL |= 0X02;      //下降沿触发
EA = 1;             //打开总中断
IEN2 |= 0X10;       //P1允许中断
P1IFG = 0X00;       //P1中断标志清零
}

/****************************
* @brief : 串口初始化函数
****************************/
void Init_Usart()
{
CLKCONCMD &= ~0X40;   //设置系统时钟源为32MHz
while(CLKCONSTA&0X40);//等待晶振稳定
CLKCONCMD &= ~0X47;   //设置系统主时钟为32MHz

PERCFG = 0X00;        //选择P0做串口
P0SEL |= 0X3C;        //P0.2,P0.3,P0.4,P0.5设置为外设
P2DIR &= ~0XC0;       //选择UART0优先

U0CSR |= 0X80;        //USART模式选择UART
U0GCR |= 9;
U0BAUD|= 59;          //波特率设置为19200

U0CSR |= 0X40;        //允许接收
IEN0 |= 0X84;         //开总中断,接收中断使能
}

/****************************
* @brief :Uart0发送字符串函数
* @param :Data - 要发送的数据
len - 数据的长度
****************************/
void Usart0_Send_String(char *Data,int len)
{
uint i;
for(i=0;i<len;i++)
{
U0DBUF = *Data++;   //每次填充一个字符,即8位
while(UTX0IF==0);   //等待发送完毕
UTX0IF=0;           //发送终端清零,准备下一个发送
}
}

/****************************
* @brief : 主函数
****************************/
main()
{
Init_Io();
Init_Usart();
while(1)
{
YLED = LIGHTOPEN;         //发送数据时亮黄灯
if(TXRXFlag == 1)
{
if(temp!= 0)
{
if(temp!='#')
{
ReceiveData[DataNumber++]=temp;
}else
{
TXRXFlag = 3;   //发送数据
}
if(DataNumber==50)
{
TXRXFlag = 3;   //发送数据
}
temp = 0;
}
}
if(TXRXFlag == 3)
{
BLED = LIGHTOPEN;
YLED = LIGHTCLOSE;//发送数据标志

U0CSR &= ~0X40;   //停止接收数据
Usart0_Send_String(ReceiveData,DataNumber); //发送数据
U0CSR |= 0X40;    //允许数据接收
DataNumber=0;     //数据长度置0
TXRXFlag = 1;     //接收数据
BLED ^=1;
YLED ^=1;         //接收数据标志
}
}
}

/****************************
* @brief : 中断服务程序--接收数据
****************************/
#pragma vector = URX0_VECTOR
__interrupt void URX0_ISR(void)
{
temp = U0DBUF;  //保存数据
URX0IF = 0;     //接收中断标志清零,准备下一个数据接收
}

/****************************
* @brief : 中断服务程序--按键s3中断
* @描述  :当按下按键的时候也可以将接收到的数据发回给PC机
****************************/
#pragma vector = P1INT_VECTOR
__interrupt void P1INT_ISR(void)
{
P1IFG = 0;    //P1中断状态标志清零
TXRXFlag = 3; //发送数据
P1IF = 0;     //P1中断标志清零
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CC2530 串口实验