您的位置:首页 > 其它

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

2014-01-12 23:57 225 查看
/*****************************
* 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;
}
}


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