cc2530 串口实验4--设置时间


/*****************************
* project : PC机可以向cc2530发送时间,来设置cc2530的当前时间
            cc2530每秒钟向PC机发送当前时间。
*    时间 :2014年1月12日
*    作者 :林少游
*****************************/
#include <ioCC2530.h>
#include <string.h>
#include "Usart_Timer.h"


uint Count = 0;                   //中断计数器
char temp=0;                      //保存串口中接收到的数据
char TimeUpdate = 0;              //更新时间
char FollowSecond =1;             //发送时间的标志
char SendData[] ="00:00:00\n";    //要发送的时间
int Time[3] = {12,0,0};           //当前的时间
char ReceiveData[9]="#00:00:00";   //保存PC发送过来的时间
int DataNumber = 0;               //ReceiveData接收到的数据长度

extern void Init_Clock();
extern void Init_IO();
extern void Init_Usart();
extern void Init_Timer();
extern void Usart_Send_String(char *Data,int len);

/*****************************
* @ brief : 中断服务程序--T3定时器
*****************************/
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
  IRCON &= ~0X04;     //T3中断标志清零
  Count++;            //中断计数器
  if(Count>250)       //中断250次,约1秒
  {
    Count=0;
    TimeUpdate = 1;   //更新时间标志
  }
}

/*****************************
* @ brief : 中断服务程序--串口数据接收中断
*    描述 :当cc2530接收到PC机发送过来的时间时发生中断
*****************************/
#pragma vector = URX0_VECTOR
__interrupt void URX0_ISR(void)
{
  //TCON &= ~0X08;      //TCON.URX0IF串口接收中断标志清零
  URX0IF = 0;         //URX0IF串口接收中断标志清零
  temp = U0DBUF;      //将缓冲器中的数据保存到temp中
}

/*****************************
* @ brief : 主函数
*****************************/
main()
{
  Init_Clock();       //初始化系统时钟频率
  Init_Timer();       //初始化定时器
  Init_Usart();       //初始化串口
  Init_IO();          //初始化IO口,设置led灯
  Usart_Send_String(SendData,sizeof(8)); //发送初始时间
  while(1)
  {
    if(TimeUpdate==1)               //if
    {
       if(Time[2]<59)               //设置秒
       {
          Time[2]++;
       }
       else if(Time[1]<59)          //设置分
       {
          Time[2]=0;
          Time[1]++;
       }
       else if(Time[0]<23)          //设置时
       {
          Time[2]=0;
          Time[1]=0;
          Time[0]++;
       }
       else 
       {
          Time[2]=0;
          Time[1]=0;
          Time[0]=0;
       }
       TimeUpdate = 0;               //时间更新清零
    }//end if
    
    /************上面的if语句完成了时间的设置,精确到了秒*****************/
    
    if(temp != 0)   
    {
      ReceiveData[DataNumber++]=temp; //保存PC机发送过来的时间
      temp = 0;
    }
    
    if(ReceiveData[0] == '#' && DataNumber == 9) //设置cc2530的新时间
    {
      Time[2]=(ReceiveData[7]-'0')*10+(ReceiveData[8]-'0');
      if(Time[2]>59) Time[2]=0;
      Time[1]=(ReceiveData[4]-'0')*10+(ReceiveData[5]-'0');
      if(Time[1]>59) Time[1]=0;
      Time[0]=(ReceiveData[1]-'0')*10+(ReceiveData[2]-'0');
      if(Time[0]>23) Time[0]=0;
      
      ReceiveData[0]=0;           //首位清零
      DataNumber=0;               //接收到的数据长度清零
    }
    
    if(FollowSecond != Time[2])   //发送时间
    {
      SendData[8]='\n';
      SendData[7]=Time[2]%10 + '0';
      SendData[6]=Time[2]/10 + '0';
      SendData[5]=':';
      SendData[4]=Time[1]%10 + '0';
      SendData[3]=Time[1]/10 + '0';
      SendData[2]=':';
      SendData[1]=Time[0]%10 + '0';
      SendData[0]=Time[0]/10 + '0';
      Usart_Send_String(SendData,9);
      FollowSecond = Time[2];
    }
    
    
    
  }//end while
}


/**************************
T3用比较模式,把32M进行32分频
T3CTL再进行16分频
每次计数溢出为4ms
**************************/
#include <ioCC2530.h>
#include <string.h>

#define YLED P1_0
#define BLED P1_1

#define LIGHTOPEN 1
#define LIGHTCLOSE 0

#define uint unsigned int
#define uchar unsigned char

/***********************
* @brief : 系统时钟初始化函数
*   描述 :该系统选择32MHz的时钟源频率
**********************/
void Init_Clock()
{
  CLKCONCMD = 0X28;           //系统时钟源选择32MHz,Time Ticks 为1MHz,Clock Speed 为32MHz
  while(CLKCONSTA & 0X40);    //等待晶振稳定
}
/**********************
* @brief : LED初始化函数
**********************/
void Init_IO()
{
  P1DIR |= 0X03;              //P1.0,P1.1 设置为输出
  YLED = LIGHTOPEN;           //亮黄灯
  BLED = LIGHTCLOSE;          //亮蓝灯
}

/**********************
* @brief : 串口初始化函数
**********************/
void Init_Usart()
{
  PERCFG = 0X00;              //位置1 P0口
  P0SEL |= 0X3C;              //P0口做串口 
  P2DIR &=~0XC0;              //P0优先作为串口
  
  U0CSR |= 0X80;              //USART选择UART模式
  U0GCR = 9;
  U0BAUD = 59;                //波特率设置为19200
  
  IEN0 = 0X84;                //总中断使能,串口接收中断使能
  //IEN2 = 0X04;                //串口发送中断使能
  //URX0IF = 0;                 //串口接收中断标志清零
  UTX0IF = 0;                 //串口发送中断标志清零
  U0CSR |= 0X40;              //串口允许接收数据
}

/*********************
* @brief : 定时器初始化函数
*********************/
void Init_Timer()
{
  T3CTL = 0X9A;               //16分频,溢出中断使能,模模式
  T3CCTL0 = 0X44;             //频道0中断使能,选择比较模式
  T3CC0 = 0xFA;                //定时器比较值设为250
  
  IEN0 |= 0X80;               //总中断使能
  IEN1 |= 0X08;               //T3中断使能
 // TIMIF &= ~0X03;             //T3溢出中断标志清零,T3频道0中断标志清零
  
}

/**********************
* @brief : 串口发送字符串
*********************/
void Usart_Send_String(char *Data,int len)
{
  uint i;
  for(i=0;i<len;i++)
  {
    U0DBUF = *Data++;
    while(UTX0IF==0);
    UTX0IF = 0;
  }
}

cc2530 串口实验4--设置时间_第1张图片

你可能感兴趣的:(CC2530,设置时间,串口实验)