CC2530--串口实验的回显

今天做了一个下面的实验,注释都有了,所以就不过多解释了,主要就是总结一下

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,串口实验)