本次設(shè)計(jì)用由AT89C51編程控制LED七段數(shù)碼管作顯示的球賽計(jì)時(shí)計(jì)分系統(tǒng)。系統(tǒng)應(yīng)具有賽程定時(shí)設(shè)置,賽程時(shí)間暫停,及時(shí)刷新甲、乙雙方的成績(jī)以及賽后成績(jī)暫存等功能。
內(nèi)容包括:顯示、鍵盤、時(shí)鐘等內(nèi)容 2.1需求分析 2.1.1 計(jì)分系統(tǒng) 分為“A隊(duì)”和“B隊(duì)”的“3分”,“2分”,“1分”各六個(gè)按鍵輸入部分,以及兩隊(duì)比分的LED顯示部分。在每次增加分?jǐn)?shù)的同時(shí),“24秒”計(jì)時(shí)恢復(fù)為初始值,“12分鐘”計(jì)時(shí)暫停,等待比賽的繼續(xù)進(jìn)行 2.1.2 計(jì)時(shí)系統(tǒng) (1)比賽開(kāi)始/繼續(xù):當(dāng)“比賽開(kāi)始/繼續(xù)”鍵按下后,“24s”和“12分鐘”計(jì)時(shí)器開(kāi)始倒計(jì)時(shí);
(2)手動(dòng)24s復(fù)位:當(dāng)“24s復(fù)位” 鍵按下后,“24s”倒計(jì)時(shí)恢復(fù)初始值,“12分鐘”倒計(jì)時(shí)暫停,等待比賽的繼續(xù);
(3)比賽暫停:“比賽暫停”鍵按下后,“24s”倒計(jì)時(shí)和“12分鐘”倒計(jì)時(shí)均暫停,等待比賽的繼續(xù)進(jìn)行;
(4)自動(dòng)增加比賽節(jié)數(shù):當(dāng)“12分鐘”倒計(jì)時(shí)完成后,判斷當(dāng)前節(jié)數(shù)是否為最后一節(jié),若不是,則節(jié)數(shù)自動(dòng)增加,并“12分鐘”和“24s”均恢復(fù)默認(rèn)值,等待下一節(jié)比賽的進(jìn)行。 2.2原理分析 采用單片機(jī)AT89C51作為本設(shè)計(jì)的核心元件。利用7段共陰LED作為顯示器件。在此設(shè)計(jì)中共接入了6個(gè)7段共陰LED顯示器,其中2個(gè)4位LED顯示器用于記錄AB隊(duì)的分?jǐn)?shù),每隊(duì)1個(gè)4位LED顯示器顯示范圍可達(dá)到0~999分,足夠滿足賽程需要;2個(gè)兩位LED顯示器用來(lái)記錄賽程時(shí)間,其中1個(gè)用于顯示分鐘,1個(gè)用于顯示秒鐘;使用1個(gè)2位LED顯示器用于顯示“24s”倒計(jì)時(shí),賽程計(jì)時(shí)均采用倒計(jì)時(shí)方式。即比賽前將時(shí)間設(shè)置好,即12分鐘,比賽開(kāi)始時(shí)啟動(dòng)計(jì)時(shí),直至計(jì)時(shí)到零為止。本設(shè)計(jì)中設(shè)立了10個(gè)按鍵,其中6個(gè)用于設(shè)置兩隊(duì)的比分,1個(gè)用于比賽開(kāi)始/比賽繼續(xù),1個(gè)用于暫停,1個(gè)用于手動(dòng)增加比賽節(jié)數(shù),一個(gè)用于恢復(fù)“24s”倒計(jì)時(shí)等功能。 2.3總體設(shè)計(jì) 系統(tǒng)主要包括單片機(jī)、LED顯示電路、按鍵控制電路、時(shí)鐘電路及復(fù)位電路等組成 2.4軟硬件設(shè)計(jì) 2.4.1 硬件設(shè)計(jì) 設(shè)計(jì)思路:
(1)按鍵模塊設(shè)計(jì) :
按鍵接至P1口和P3口,按鍵按下時(shí)輸入是低電平。鍵的設(shè)置如下:“A1”,“A2”,“A3”鍵是A隊(duì)加1分、加2分,加3分鍵盤,B隊(duì)同理!氨荣愰_(kāi)始/比賽繼續(xù)”是啟動(dòng)鍵,“比賽暫!笔菚和fI。此外,還有兩個(gè)按鍵, “24s”復(fù)位鍵,“增加比賽節(jié)數(shù)”鍵。
(2) LED顯示模塊設(shè)計(jì) :
顯示分為計(jì)時(shí)和計(jì)分顯示兩個(gè)部分,均采用共陰極LED數(shù)碼管動(dòng)態(tài)掃描顯示,由2個(gè)四位一體和4個(gè)兩位一體的共陰極數(shù)碼管構(gòu)成。數(shù)碼管的7個(gè)段控端輸出經(jīng)過(guò)74HC573驅(qū)動(dòng)器進(jìn)行電流放大驅(qū)動(dòng)接至P0口。采用動(dòng)態(tài)掃描方式,在足夠短的周期內(nèi),使各位數(shù)碼管逐個(gè)輪流受控顯示。 設(shè)計(jì)截圖: 2.4.2 軟件設(shè)計(jì) 軟件設(shè)計(jì)采用C語(yǔ)言模塊設(shè)計(jì)方法,程序由主程序、T0中斷程序、顯示程序、外部中斷0程序、按鍵程序、初始函數(shù)、計(jì)時(shí)函數(shù)、延時(shí)函數(shù)組成。
測(cè)試結(jié)果與分析 設(shè)計(jì)采用C語(yǔ)言編程,在Keil C51軟件編譯環(huán)境中,經(jīng)過(guò)編譯和連接,生成十六進(jìn)制的目標(biāo)代碼文件.hex。在硬件上,用Proteus軟件繪制出原理圖,經(jīng)過(guò)純電路調(diào)試無(wú)誤后,將生成的目標(biāo)代碼文件加載到Proteus界面的AT89C51中。接著再進(jìn)行軟硬件聯(lián)合調(diào)試,反復(fù)調(diào)試,直至所有顯示及按鍵功能實(shí)現(xiàn),直至仿真成功。 運(yùn)行截圖:   C語(yǔ)言程序代碼:- #include<reg52.h>
- #include<absacc.h>
-
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit A8=P2^0;
- sbit A9=P2^1;
- sbit A10=P2^2;
- sbit A11=P2^3;
- sfr P00=0x80;
-
-
- uchar code wei_1[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
- uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00,0X40};
-
- uchar minute=12; //分
- uchar second=0; //秒
- uchar key_status=0; //按鍵狀態(tài)值
- uchar scoreA=0; //A隊(duì)得分
- uchar scoreB=0; //B隊(duì)得分
- uchar count1=20; //記錄定時(shí)器時(shí)間
- uchar match=1; //比賽節(jié)數(shù)
- uchar rule_time=24; //記錄24秒規(guī)則
- uchar rule_flag=0; //記錄24秒規(guī)則是否啟用
-
-
- /*
- 初始化IO口
- */
- void IO_init(){
- A8=0;
- A9=0;
- }
- /*
- 初始化時(shí)間
- */
-
- void time_init(){
- TMOD = 0x01;
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- EA = 1;
- ET0 = 1;
- }
- /*
- 延時(shí)函數(shù)
- */
- void delay_ms(uint z){
- uint i;
- uchar j;
- for(i=0;i<z;i++){
-
- for(j=0;j<100;j++);
- }
- }
-
- /*
- 計(jì)時(shí)函數(shù)
- */
- void T0_Time() interrupt 1 using 1{
- if (count1-- == 0)
- {
- second--;
- rule_time--;
- count1 = 20;
- }
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- }
-
- /*
- 時(shí)間顯示函數(shù)
- */
- void time_display(uchar w2,uchar d2){
- uchar shi1,ge1;
- shi1=d2/10;
- ge1=d2%10;
-
- P00=wei_1[w2];
- A10=1;
- A10=0;
- P00=table[shi1];;
- A8=1;
- A8=0;
- delay_ms(5);
- P00=0;
- A10=1;
- A10=0;
- A8=1;
- A8=0;
-
- P00=wei_1[w2+1];
- A10=1;
- A10=0;
- P00=table[ge1];
- A8=1;
- A8=0;
- delay_ms(5);
- P00=0;
- A10=1;
- A10=0;
- A8=1;
- A8=0;
- }
-
- /*
- 分?jǐn)?shù)顯示函數(shù)
- */
- void score_dispaly(uchar w2,uchar d2){
- uchar qian2,shi2,ge2;
- qian2=d2/100;
- shi2=d2%100/10;
- ge2=d2%100%10;
-
- P00=wei_1[w2];
- A9=1;
- A9=0;
- P00=table[qian2];;
- A8=1;
- A8=0;
- delay_ms(10);
- P00=0;
- A9=1;
- A9=0;
- A8=1;
- A8=0;
-
- P00=wei_1[w2+1];
- A9=1;
- A9=0;
- P00=table[shi2];
- A8=1;
- A8=0;
- delay_ms(10);
- P00=0;
- A9=1;
- A9=0;
- A8=1;
- A8=0;
-
- P00=wei_1[w2+2];
- A9=1;
- A9=0;
- P00=table[ge2];
- A8=1;
- A8=0;
- delay_ms(10);
- P00=0;
- A9=1;
- A9=0;
- A8=1;
- A8=0;
- }
-
- /*
- 鍵盤輸入函數(shù)
- */
- void key(){
- static uchar key_new = 0, key_l;
- key_status = 0;
- P1 = 0x0f;
- if((P1 & 0x0f) != 0x0f)
- {
- delay_ms(1);
- if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
- {
- key_new = 0;
- /*
- 矩陣鍵盤掃描
- */
- key_l = (P1 | 0xf0);
- P1 = key_l;
- switch(P1)
- {
- /*
- 開(kāi)始計(jì)時(shí)/比賽繼續(xù)
- */
- case 0x7e:
- TR0=1;
- rule_flag=1;
- time_display(6,rule_time);
- break;
- /*
- 暫停比賽
- */
- case 0x7d:
- TR0=0;
- break;
-
- /*
- 加分,同時(shí)24秒清零和總計(jì)時(shí)器停止計(jì)時(shí)
- */
- case 0xee:
- TR0=0;
- scoreA +=3;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xed:
- TR0=0;
- scoreA +=2;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xeb:
- TR0=0;
- scoreA +=1;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xde:
- TR0=0;
- scoreB +=3;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xdd:
- TR0=0;
- scoreB +=2;
- rule_time=24;
- rule_flag=0;
- break;
- case 0xdb:
- TR0=0;
- scoreB +=1;
- rule_time=24;
- rule_flag=0;
- break;
- /*
- 增加比賽節(jié)數(shù),同時(shí)24秒復(fù)位和總計(jì)時(shí)器復(fù)位
- */
- case 0xbd:
- match++;
- minute=12;
- second=0;
- TR0=0;
- rule_time=24;
- rule_flag=0;
- break;
- /*
- 手動(dòng)24秒復(fù)位
- */
- case 0xbe:
- if(TR0==1){
- rule_time=0;
- rule_flag=0;
- }else{
- rule_flag=0;
- }
- break;
- }
- }
- }
- else
- {
- key_new = 1;
- }
- }
-
- void main()
- {
- IO_init();
- time_init();
- while(1){
- key();
-
- if(second==0){
- /*
- 判斷某節(jié)比賽是否結(jié)束
- */
- if(minute==0){
- /*
- 判斷是否為最后一節(jié)比賽
- */
- if(match<4){
- /*
- 計(jì)時(shí)系統(tǒng)恢復(fù)為默認(rèn)值,比賽節(jié)數(shù)加一
- */
- second=60;
- minute=11;
- match++;
- rule_time=24;
- rule_flag=0;
- }
- TR0=0;
- }
- /*
- 比賽分鐘數(shù)減一
- */
- else {
- second=60;
- minute--;
- }
- }
- /*
- 24秒結(jié)束,計(jì)時(shí)器暫停和24秒復(fù)位
- */
- if(rule_time<=0){
- TR0=0;
- rule_time=24;
- }
-
- /*
- 顯示
- */
- time_display(0,minute);
- time_display(2,second);
- time_display(4,match);
- time_display(6,rule_time);
- score_dispaly(1,scoreA);
- score_dispaly(5,scoreB);
- }
- }
復(fù)制代碼 以上的Word格式文檔51黑下載地址: |