/*
晶振24MHz
單片機內部定時產生時鐘(這里只有時分秒),每隔一秒輸出當前時間
下載程序后,單片機要重新上電,串口數據才能正常顯示
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint second_counter=0;
uchar i,time_display[9]={0x00,0x00,':',0x00,0x00,':',0x00,0x00,0x20}; /*一維數組用于存儲要顯示的時間,空格的ASCII碼是0x20*/
bit flag=0;
//定義類型為date的結構體
struct date{
uchar second,minute,hour;
};
struct date clock={0,0,0}; //定義類型為date的變量clock,并為其內部元素賦初值
void clockk(void);
void system_init(void);
//系統初始化
void system_init(void)
{
TMOD=0x22; //定時器0工作方式2,定時器1工作方式2
TH0=0x38; //定時器0中斷用來產生1秒時鐘定時,定時一次100us
TL0=0x38;
TH1=0xf3; //定時器1用于串行中斷,波特率
TL1=0xf3;
SCON=0x50;PCON=0x80;
EA=1; //總中斷允許
ET0=1; //定時器0中斷允許
// ES=1;
TR0=1; //啟動定時器0
TR1=1;
}
//時鐘
void clockk(void)
{
if(clock.second==60)
{
clock.second=0;
if(++clock.minute==60)
{
clock.minute=0;
if(++clock.hour==24) {clock.hour=0;}
}
}
}
//定時器0中斷服務程序,用于產生1秒定時。方式2不用重新賦初值,定時較精確。
void timer0(void) interrupt 1 using 1
{
if(++second_counter==10000)
{
flag=1;
second_counter=0;
++clock.second;
}
}
main()
{
system_init();
while(1)
{
clockk();
if(flag==1)
{
flag=0;
time_display[0]=clock.hour/10+0x30; //小時的十位。字符0的ASCII碼為0x30
time_display[1]=clock.hour%10+0x30; //小時的各位
time_display[3]=clock.minute/10+0x30; //分的十位
time_display[4]=clock.minute%10+0x30; //分的個位
time_display[6]=clock.second/10+0x30; //秒的十位
time_display[7]=clock.second%10+0x30; //秒的個位
for(i=0;i<9;i++)
{
SBUF=time_display[i]; //SBUF一次只能存放一個字符
while(TI==0){}
TI=0;
}
}
}
}