#include <iocc2530.h>
#define rled P1_0
#define gled P1_1
/*变量定义和赋值*******************************/
char time[3]={10,44,55}; //时间初值
char recdata[10]; //串口接收到的数据
char senddata[10]="00:00:00 "; //时间数据字符串
char timetemp; //秒针变量
char counter=0; //中断次数统计
char temp; //串口接收到的数据临时变量
char number=0;
char follow_second; //时间跟随 用于判断是否用串口输出时间
void Init_Io(void)
{
P1SEL &=0XFC; //P1_0,P1_1接口设为通用接口模式
P1DIR|=0X03; //P1_0,P1_1接口设为输出模式
rled=0;
gled=0;
}
void Init_Clock(void)
{
CLKCONCMD &= 0XBF; //选择系统时钟为32MHZ石英晶振
CLKCONCMD |= 0X28; //定时器标记输出值设为1MHZ 这里不是很明白 定时器是以这个频率为基准的吗?
while(CLKCONSTA & 0X40); //等待时钟稳定
CLKCONCMD &= ~0X07; //主时钟频率为32MHZ
}
//T3初始化
void Init_T3(void){
T3CCTL0 |= 0X44; // T3通道0中断使能 T3通道0为比较模式
T3CC0 = 0XFA; //T3通道0比较寄存器值设为250
T3CTL |= 0X80; //T3定时计数时钟为16分频
T3CTL |= 0X02; //T3计时模式位模模式,从0X00->T3CC0
//T3CTL |= 0X08; //溢出中断使能 因为产生的是T3通道0比较中断而不是T3的溢出中断 故本句可以不要
IEN1 |= 0X08; //T3中断使能
EA |= 1; //总中断使能
T3CTL |=0X10; //启动T3
}
//初始化串口0函数
void Init_Uart0(void)
{
PERCFG &= 0XFE; //设USART0的ALT 1
P0SEL |= 0X3C; //P0口2、3、4、5做外设
P2DIR &= 0X3F; //P0外设优先级USART0最高
U0CSR |= 0X80; //设USART0 工作方式为 UART
U0GCR |= 9;
U0BAUD |= 59; //设波特率为19200
UTX0IF= 0; //UART0 TX中断标志位清0
U0CSR |= 0X40; //USART0 接收使能
IEN0 |= 0X04; //usart0 接收中断使能
IEN0 |= 0X80; //总中断使能
}
//串口发送字符串函数
void uarttx_send_string(char *data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF=*data++;
while(UTX0IF==0);
UTX0IF=0;
}
}
void main(void)
{
Init_Clock();
Init_T3();
Init_Uart0();
Init_Io();
do{ //计时程序段
if(timetemp==1)//到1秒后 将时分秒的数字改变
{
if(time[2]<59)//秒
time[2]++;
else//将秒设为0分加1
{
time[2]=0;
if(time[1]<59)//分
time[1]++;
else
{
time[1]=0;
if(time[0]<23)//时
time[0]++;
else
time[0]=0;
}
}
timetemp=0;
}
//接收到的字符串赋给recdata
if(temp!=0)
{
recdata[number]=temp;
number++;
temp=0;
}
//如果接收到9个字符 并且以#开头 则将time数组里的时间进行更新
if((recdata[0]=='#')&&(number==9))
{
time[2]= (recdata[7]-48)*10+(recdata[8]-48);//秒,0的ASCII码为48
if(time[2]>59)
time[2]=0;
time[1]=(recdata[4]-48)*10+(recdata[5]-48);//分
if(time[1]>59)
time[1]=0;
time[0]=(recdata[1]-48)*10+(recdata[2]-48);//时
if(time[0]>23)
time[0]=0;
gled=!gled; //设时间时,黄灯指示变换。
recdata[0]=0; //接收首位设0,以区别#
number=0;
}
//时间字符串发送显示
if(follow_second!=time[2])//秒数更新
{
senddata[7]=(char)(time[2])%10+48;
senddata[6]=(char)(time[2])/10+48;
senddata[4]=(char)(time[1])%10+48;
senddata[3]=(char)(time[1])/10+48;
senddata[1]=(char)(time[0])%10+48;
senddata[0]=(char)(time[0])/10+48;
uarttx_send_string(senddata,10);
follow_second=time[2];
}
}while(1);
}
//T3中断函数
#pragma vector=T3_VECTOR
__interrupt void T3_ISR(void)
{
IRCON &=0XF7;//清除T3中断标志位
counter++;
if(counter==250)//计时公式:250比较值*16分频*250次中断计数=1M,1秒
{
counter=0;
timetemp=1; //1秒标记,每一秒执second++
rled=!rled;
}
}
//接收中断函数
#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF=0; //清标志
temp=U0DBUF; //读取缓存到temp
}