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;
}
}
* 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 串口实验
- CC2530基础实验之串口控制LED灯
- linux串口超时时间设置
- CC2530 ADC实验1(读取片内温度并通过串口显示)
- cc2530 串口实验--控制led灯
- linux串口超时时间设置
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
- CC2530--串口实验的回显
- cc2530 串口实验--控制led灯
- Linux学习中的小实验与时间设置
- Zstack设置发送功率(CC2530)
- IIS使用十大原则,(IIS过期时间,IIS缓存设置) 【转载】
- php 设置一个函数的最大运行时间
- STM32F4 串口实验中收不到超级终端发送的数据,调试工具却可以
- centOS7 时间设置
- mongodb 设置过期时间 mongodb缓存
- 设置linux时区同步当前时间
- MySQL 创建表时,设置时间字段自己主动插入当前时间
- iOS开发---设置启动页停留时间
- spring cloud各种超时时间设置