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