|
該項(xiàng)目基本滿足以下要求
1.一個(gè)四位一體數(shù)碼管顯示比賽時(shí)間,時(shí)間格式如:15:00,兩個(gè)三位一體數(shù)碼管顯示甲乙兩對的比分,比分格式如:008。
2.比賽時(shí)間采用倒計(jì)時(shí)方式,以一秒的頻率減時(shí),上電時(shí)默認(rèn)初值為15:00.
3.甲乙隊(duì)比分采用三位數(shù),上電初值為000,最大值為999,滿足常理要求,未開始比賽以及比賽結(jié)束后比分無法加減,
4.比賽未開始之前,可以通過ADD1、DEC1鍵對比較時(shí)間的分鐘進(jìn)調(diào)時(shí),通過ADD2、DEC2鍵對比較時(shí)間的秒進(jìn)行調(diào)時(shí)。
5.可隨時(shí)暫停/啟動(dòng)比賽時(shí)間。
6.比賽進(jìn)行時(shí),可以通過ADD1、DEC1鍵對甲隊(duì)比分加、減,可以通過ADD2、DEC2對乙隊(duì)比分加、減。每按一次鍵,加/減1分。
7.當(dāng)一節(jié)比賽完后,可以通過(EXCHANGE)換場鍵換場,換場后,比分交換顯示,交換后,下一節(jié)比賽開始時(shí),相應(yīng)的比分加減鍵也隨之交換。
8.當(dāng)比賽結(jié)束時(shí),發(fā)出報(bào)警。
視頻教程下載地址:http://www.torrancerestoration.com/bbs/dpj-100315-1.html
單片機(jī)源程序如下:
- /*
- 倒計(jì)時(shí)計(jì)算器,數(shù)碼管顯示 默認(rèn)值15:00
- 共陽數(shù)碼管
- */
- #include <reg52.h>
- void delay(int ms);
- void dispaly(char min,char sec,int sco1,int sco2);
- void key_scan(void);
- /*共陽極數(shù)碼管的0-9數(shù)字編碼*/
- code unsigned char table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- sbit s8 = P3^6;
- sbit s9 = P3^7;
- sbit buz = P3^4;
- char m = 15; //默認(rèn)的分鐘
- char sec = 0; //默認(rèn)的秒鐘
- int sc1 = 0; //默認(rèn)甲方的比分
- int sc2 = 0; //默認(rèn)乙方的比分
- char buz_flag = 0; //默認(rèn)報(bào)警標(biāo)志為0,不報(bào)警
- char status = 0; //狀態(tài)標(biāo)志,0的時(shí)候表示非比賽狀態(tài),1表示比賽狀態(tài)
- int main(void)
- {
- /*使用定時(shí)器進(jìn)行計(jì)時(shí)*/
- //初始化定時(shí)器0
- TMOD=0xf1; //設(shè)置T0為工作方式1 16位的定時(shí)器模式
- TH0=(65535-50000)/256; //50ms中斷一次
- TL0=(65535-50000)%256;
- /*Timer0工作在模式0下時(shí)為13位定時(shí)/計(jì)數(shù)器,
- TL0只使用前5位,故對32進(jìn)行求余/模 */
-
-
- ET0=1; //開定時(shí)器0中斷
-
- P3 = 0x3f;
-
- /*外部中斷0 的初始化*/
- IT0 = 1; //設(shè)置為下降沿觸發(fā)
- EX0 = 1; //外部中斷0中斷允許位
-
-
- EA=1; //開總中斷
- // TR0=1; //啟動(dòng)定時(shí)器0
- while(1)
- {
- dispaly(m,sec,sc1,sc2);
- key_scan();
- if(buz_flag)
- {
- buz = 0;
- }
- }
- }
-
- /*按鍵掃描*/
- void key_scan(void)
- {
- static char key_flag = 0; //按鍵按下標(biāo)志 ,檢測到按下之后為1,否則為0
- static char key_count = 0;
- static unsigned char key_val = 0; //檢測到按鍵之后保存的按鍵值
- int t;
-
- P1 = 0xff;
-
- if(P1 != 0xff) //有按鍵按下了
- {
- if(key_flag == 1) //表示已經(jīng)檢測到按鍵了
- {
- key_count++;
- if(key_count > 15)
- {
- key_count = 0;
- if(P1 == key_val) //確實(shí) 有按鍵按下了
- {
- switch(key_val) //進(jìn)行按鍵處理
- {
- case 0xfe:
- //add1
- if(status)
- {
- sc1 += 1;
- }
- else
- {
- m += 1;
- }
- break;
- case 0xfd:
- //dec1
- if(status)
- {
- if(sc1 > 0)
- {
- sc1 -= 1;
- }
- }
- else
- {
- if(m>0)
- {
- m -= 1;
- }
- }
- break;
- case 0xfb:
- //add2
- if(status)
- {
- sc2 += 1;
- }
- else
- {
- if(sec<59)
- {
- sec += 1;
- }
- }
- break;
- case 0xf7:
- //dec2
- if(status)
- {
- if(sc2 > 0)
- {
- sc2 -= 1;
- }
- }
- else
- {
- if(sec>0)
- {
- sec -= 1;
- }
- }
- break;
- case 0xef:
- //exchang
- t = sc1;
- sc1 = sc2;
- sc2 = t;
- break;
- }
- }
- else
- {
- key_val = 0; //還原默認(rèn)值
- key_flag = 0; //還原默認(rèn)值
- key_count = 0;
- }
- }
-
- }
- else
- {
- key_val = P1; //保存按鍵的值
- key_flag = 1; //檢測到了按鍵
- }
- }
- else
- {
- key_val = 0; //還原默認(rèn)值
- key_flag = 0; //還原默認(rèn)值
- key_count = 0;
- }
-
- }
- void exint0() interrupt 0 //中斷服務(wù)函數(shù)的書寫格式
- {
- // if(IE0 == 1) //產(chǎn)生了外部中斷,IE 自動(dòng)置為1
- {
- if(status)
- {
- status = 0 ; //切換到非比賽狀態(tài)
- TR0 = 0 ; //關(guān)閉定時(shí)器0
- }
- else
- {
- status = 1 ; //切換到非比賽狀態(tài)
- TR0 = 1 ; //啟動(dòng)定時(shí)器1
- }
- }
- }
- char counter = 0;
- /******T0中斷函數(shù)*******/
- void Timer0()interrupt 1
- {
- TH0=(65535-50000)/256; //50ms中斷一次
- TL0=(65535-50000)%256;
- counter++;
- while(counter>=20)
- {
- counter=0;
- if(sec == 0)
- {
- m --;
- sec = 60;
- if(m == 0)
- {
- buz_flag = 1; //報(bào)警標(biāo)志設(shè)置
- }
- }
- sec--;
- }
- }
- //led數(shù)碼管顯示,4個(gè)參數(shù)分別表示分鐘秒鐘,分?jǐn)?shù)1和分?jǐn)?shù)2
- void dispaly(char min,char sec,int sco1,int sco2)
- {
- char buf[10];
- char i;
-
- buf[0] = min/10%10; //分鐘的十位
- buf[1] = min%10; //分鐘的各位
- buf[2] = sec/10%10; //秒鐘的十位
- buf[3] = sec%10; //秒鐘的各位
- buf[4] = sco1/100%10; //分?jǐn)?shù)1的百位
- buf[5] = sco1/10%10; //分?jǐn)?shù)1的十位
- buf[6] = sco1%10; //分?jǐn)?shù)1的個(gè)位
- buf[7] = sco2/100%10; //分?jǐn)?shù)2的百位
- buf[8] = sco2/10%10; //分?jǐn)?shù)2的十位
- buf[9] = sco2%10; //分?jǐn)?shù)2的個(gè)位
-
- for(i=0;i<8;i++)
- {
- P0 = table[buf[i]];
- P2 = 1<<i;
- delay(1);
- P2 = 0;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
4.bisaijifenqi.rar
(31.68 KB, 下載次數(shù): 23)
2017-12-8 22:40 上傳
點(diǎn)擊文件名下載附件
4.bisaijifenqi-1208.rar
(25.22 KB, 下載次數(shù): 19)
2017-12-8 22:40 上傳
點(diǎn)擊文件名下載附件
在單片機(jī)視頻中的項(xiàng)目二部分,有源代碼及完整的視頻,謝謝大家,希望大家共同進(jìn)步
|
評分
-
查看全部評分
|