Version1.1較Version1.0功能更加完善.
程序實(shí)現(xiàn)的功能:
1. 實(shí)驗(yàn)箱上電后, 兩倒計(jì)時(shí)器都不顯示, 且都處于暫停狀態(tài).
2. 向8051發(fā)送"Show countdown 1st.E"后, 第一個(gè)倒計(jì)時(shí)器顯示秒數(shù)(初始為0, 然后從15開(kāi)始倒計(jì)時(shí)).
3. 向8051發(fā)送"Show countdown 2nd.E"后, 第二個(gè)倒計(jì)時(shí)器顯示秒數(shù)(初始為0, 然后從25開(kāi)始倒計(jì)時(shí)).
4. 向8051發(fā)送"Start countdown 1st.E"后, 第一個(gè)倒計(jì)時(shí)器開(kāi)始倒計(jì)時(shí).
5. 向8051發(fā)送"Start countdown 2nd.E"后, 第二個(gè)倒計(jì)時(shí)器開(kāi)始倒計(jì)時(shí).
6. 向8051發(fā)送"Hide countdown 1st.E"后, 第一個(gè)倒計(jì)時(shí)器隱藏秒數(shù).
7. 向8051發(fā)送"Hide countdown 2nd.E"后, 第二個(gè)倒計(jì)時(shí)器隱藏秒數(shù).
8. 向8051發(fā)送"Stop countdown 1st.E"后, 第一個(gè)倒計(jì)時(shí)器暫停倒計(jì)時(shí).
9. 向8051發(fā)送"Stop countdown 2nd.E"后, 第二個(gè)倒計(jì)時(shí)器暫停倒計(jì)時(shí).
10. 向8051發(fā)送"Show both.E"后, 兩個(gè)倒計(jì)時(shí)器顯示秒數(shù).
11. 向8051發(fā)送"Hide both.E"后, 兩個(gè)倒計(jì)時(shí)器隱藏秒數(shù).
12. 向8051發(fā)送"Start both.E"后, 兩個(gè)倒計(jì)時(shí)器開(kāi)始倒計(jì)時(shí).
13. 向8051發(fā)送"Stop both.E"后, 兩個(gè)倒計(jì)時(shí)器暫停倒計(jì)時(shí).
#include #include unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//對(duì)應(yīng)數(shù)碼管顯示0~9 char buf[30];//存儲(chǔ)接收到的命令 int tcount = 0;//記錄經(jīng)過(guò)的5ms區(qū)間段個(gè)數(shù) int sec1 = 15, sec2 = 25;//倒計(jì)時(shí)初始值 int sec1_ = 0, sec2_ = 0;//實(shí)時(shí)變化 int t1 = 0, t2 = 0; char en1 = 0, en2 = 0;//兩計(jì)時(shí)器秒數(shù)顯示標(biāo)志, 默認(rèn)為不顯示 char en1_ = 0, en2_ = 0;//兩計(jì)時(shí)器啟停標(biāo)志, 默認(rèn)為停止 void T0_INT() interrupt 1 //timer0中斷, 每5ms觸發(fā)一次 { TR0 = 0;//關(guān)閉timer0 TH0 = 0xEC; TL0 = 0x78;//65536 - 5000 = 60536 if(tcount % 4 == 0) { if(en1_ == 1)//若倒計(jì)時(shí)器1啟動(dòng) { //顯示個(gè)位數(shù)(第一個(gè)倒計(jì)時(shí)器) P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右數(shù)第一個(gè)數(shù)字點(diǎn)亮 if(en1 == 1)//若倒計(jì)時(shí)器1顯示秒數(shù) { P0 = DIG_CODE[sec1_ % 10]; } else { P0 = 0;//不顯示數(shù)字 } t1 ++; } else//若倒計(jì)時(shí)器1暫停 { //顯示個(gè)位數(shù)(第一個(gè)倒計(jì)時(shí)器) P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右數(shù)第一個(gè)數(shù)字點(diǎn)亮 if(en1 == 1)//若倒計(jì)時(shí)器1顯示秒數(shù) { P0 = DIG_CODE[sec1_ % 10]; } else { P0 = 0;//不顯示數(shù)字 } } tcount ++; } else if(tcount % 4 == 1) { if(en1_ == 1)//若倒計(jì)時(shí)器1啟動(dòng) { //顯示十位數(shù)(第一個(gè)倒計(jì)時(shí)器) P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右數(shù)第二個(gè)數(shù)字點(diǎn)亮 if(en1 == 1)//若倒計(jì)時(shí)器1顯示秒數(shù) { P0 = DIG_CODE[sec1_ / 10]; } else { P0 = 0;//不顯示數(shù)字 } t1 ++; } else//若倒計(jì)時(shí)器1暫停 { //顯示十位數(shù)(第一個(gè)倒計(jì)時(shí)器) P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右數(shù)第二個(gè)數(shù)字點(diǎn)亮 if(en1 == 1)//若倒計(jì)時(shí)器1顯示秒數(shù) { P0 = DIG_CODE[sec1_ / 10]; } else { P0 = 0;//不顯示數(shù)字 } } tcount ++; } else if(tcount % 4 == 2) { if(en2_ == 1)//若倒計(jì)時(shí)器2啟動(dòng) { //顯示個(gè)位數(shù)(第二個(gè)倒計(jì)時(shí)器) P2 = 100 << 2;//P2 = 0001 0000 -> (P24, P23, P22) = (1, 0, 0) -> 右數(shù)第五個(gè)數(shù)字點(diǎn)亮 if(en2 == 1)//若倒計(jì)時(shí)器2顯示秒數(shù) { P0 = DIG_CODE[sec2_ % 10]; } else { P0 = 0;//不顯示數(shù)字 } t2 ++; } else//若倒計(jì)時(shí)器2暫停 { //顯示個(gè)位數(shù)(第二個(gè)倒計(jì)時(shí)器) P2 = 100 << 2;//P2 = 0001 0000 -> (P24, P23, P22) = (1, 0, 0) -> 右數(shù)第五個(gè)數(shù)字點(diǎn)亮 if(en2 == 1)//若倒計(jì)時(shí)器2顯示秒數(shù) { P0 = DIG_CODE[sec2_ % 10]; } else { P0 = 0;//不顯示數(shù)字 } } tcount ++; } else if(tcount % 4 == 3) { if(en2_ == 1)//若倒計(jì)時(shí)器2啟動(dòng) { //顯示十位數(shù)(第二個(gè)倒計(jì)時(shí)器) P2 = 101 << 2;//P2 = 0001 0100 -> (P24, P23, P22) = (1, 0, 1) -> 右數(shù)第六個(gè)數(shù)字點(diǎn)亮 if(en2 == 1)//若倒計(jì)時(shí)器2顯示秒數(shù) { P0 = DIG_CODE[sec2_ / 10]; } else { P0 = 0;//不顯示數(shù)字 } t2 ++; } else//若倒計(jì)時(shí)器2暫停 { //顯示十位數(shù)(第二個(gè)倒計(jì)時(shí)器) P2 = 101 << 2;//P2 = 0001 0100 -> (P24, P23, P22) = (1, 0, 1) -> 右數(shù)第六個(gè)數(shù)字點(diǎn)亮 if(en2 == 1)//若倒計(jì)時(shí)器2顯示秒數(shù) { P0 = DIG_CODE[sec2_ / 10]; } else { P0 = 0;//不顯示數(shù)字 } } tcount ++; } if(tcount == 200) { tcount = 0; } if(t1 == 100) { t1 = 0; if(-- sec1_ == -1) { sec1_ = sec1; } } if(t2 == 100) { t2 = 0; if(-- sec2_ == -1) { sec2_ = sec2; } } TR0 = 1;//重新開(kāi)啟timer0 } int main() { int i = 0; P2 = 111 << 2; P0 = 0;//數(shù)碼管全滅 TMOD = 0x21; SCON = 0x50;//設(shè)置串行通信格式 TH0 = 0xEC; TL0 = 0x78;//65536 - 5000 = 60536 = EC78H TH1 = 0xE6; TL1 = 0xE6; IE = 0x82; TR0 = 1;//開(kāi)啟timer0 TR1 = 1;//開(kāi)啟timer1 while(1) { if(RI == 1)//如果收到數(shù)據(jù) { RI = 0; buf[i ++] = SBUF;//接收串口發(fā)來(lái)的數(shù)據(jù) buf[i] = '