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