程序實現(xiàn)的功能:
1. 實驗箱上電后, 不顯示當前時間.
2. 向8051發(fā)送"Show.E"后, 顯示當前時間.
3. 向8051發(fā)送"Hide.E"后, 隱藏當前時間.
4. 向8051發(fā)送"Start.E"后, 時鐘開始計時.
5. 向8051發(fā)送"Stop.E"后, 時鐘停止計時(若當前處于"Show"狀態(tài), 則顯示停止計時前的時間).
6.向8051發(fā)送"hour:minute:second.E(hour、minute、second均為具體的數(shù)字, 且不足10 十位要添零補位)"后, 時鐘按照給出的時間的整點開始計時.
#include #include unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//對應數(shù)碼管顯示0~9 char buf[30];//存放收到的數(shù)據 int tcount = 0;//記錄經過的2ms區(qū)間段個數(shù) int t = 0; int hour = 23, minute = 59, second = 55; char en = 0;//電子時鐘顯示表示, 默認為不顯示 char en_ = 0;//電子時鐘啟停標志, 默認為停止 void clear(int i)//清屏函數(shù) { P2 = i << 2; P0 = 0; } void T0_INT() interrupt 1 //timer0中斷, 每2ms觸發(fā)一次 { TR0 = 0;//關閉timer0 TH0 = 0xF8; TL0 = 0x30;//65536 - 2000 = 63536 = F830H if(tcount % 6 == 0) { //秒數(shù)個位 if(en_ == 1)//時鐘啟動狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 0;//右數(shù)第一個數(shù)字亮 P0 = DIG_CODE[second % 10]; } else//時鐘不顯示 { clear(tcount % 6); } t ++; tcount ++; } else//時鐘暫停狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 0; P0 = DIG_CODE[second % 10]; } else//時鐘不顯示 { clear(tcount % 6);; } tcount ++; } } else if(tcount % 6 == 1) { //秒數(shù)十位 if(en_ == 1)//時鐘啟動狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 1 << 2;//右數(shù)第二個數(shù)字亮 P0 = DIG_CODE[second / 10]; } else//時鐘不顯示 { clear(tcount % 6); } t ++; tcount ++; } else//時鐘暫停狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 1 << 2; P0 = DIG_CODE[second / 10]; } else//時鐘不顯示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 2) { //分鐘個位 if(en_ == 1)//時鐘啟動狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 2 << 2;//右數(shù)第三個數(shù)字亮 P0 = DIG_CODE[minute % 10]; } else//時鐘不顯示 { clear(tcount % 6); } t ++; tcount ++; } else//時鐘暫停狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 2 << 2; P0 = DIG_CODE[minute % 10]; } else//時鐘不顯示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 3) { //分鐘十位 if(en_ == 1)//時鐘啟動狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 3 << 2;//右數(shù)第四個數(shù)字亮 P0 = DIG_CODE[minute / 10]; } else//時鐘不顯示 { clear(tcount % 6); } t ++; tcount ++; } else//時鐘暫停狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 3 << 2; P0 = DIG_CODE[minute / 10]; } else//時鐘不顯示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 4) { //小時個位 if(en_ == 1)//時鐘啟動狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 4 << 2;//右數(shù)第二個數(shù)字亮 P0 = DIG_CODE[hour % 10]; } else//時鐘不顯示 { clear(tcount % 6); } t ++; tcount ++; } else//時鐘暫停狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 4 << 2; P0 = DIG_CODE[hour % 10]; } else//時鐘不顯示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 5) { //小時十位 if(en_ == 1)//時鐘啟動狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 5 << 2;//右數(shù)第二個數(shù)字亮 P0 = DIG_CODE[hour / 10]; } else//時鐘不顯示 { clear(tcount % 6); } t ++; tcount ++; } else//時鐘暫停狀態(tài) { if(en == 1)//時鐘顯示 { P2 = 5 << 2; P0 = DIG_CODE[hour / 10]; } else//時鐘不顯示 { clear(tcount % 6); } tcount ++; } } if(tcount == 500) { tcount = 0; } if(t == 500)//2ms * 500 = 1000ms = 1s -> 1s時間到 { t = 0; second ++; if(second == 60) { second = 0; minute ++; if(minute == 60) { minute = 0; hour ++; if(hour == 24) { hour = 0; } } } } TR0 = 1;//重新開啟timer0 } int main() { int i = 0; clear(7); TMOD = 0x21; SCON = 0x50;//設置串行通信格式 TH0 = 0xF8; TL0 = 0x30; TH1 = 0xE6; TL1 = 0xE6; IE = 0x82; TR0 = 1;//開啟timer0 TR1 = 1;//開啟timer1以產生波特率 while(1) { if(RI == 1)//收到數(shù)據 { RI = 0; buf[i ++] = SBUF;//接收串口發(fā)來的數(shù)據 buf[i] = '