今天做了一个下面的实验,注释都有了,所以就不过多解释了,主要就是总结一下
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中断标志清零
}