|
單片機(jī)自20世紀(jì)70年代問世以來,以極其高的性價(jià)比受到人們的重視和關(guān)注,所以應(yīng)用很廣,發(fā)展很快。由于單片機(jī)的集成度高,功能強(qiáng),通用性好,特別是它具有體積小、重量輕、能耗低、價(jià)格便宜、可靠性高、抗干擾能力強(qiáng)和使用方便等獨(dú)特的優(yōu)點(diǎn),使單片機(jī)迅速得到了推廣應(yīng)用。目前已經(jīng)成為測(cè)量控制應(yīng)用系統(tǒng)中的優(yōu)選機(jī)種和新電子產(chǎn)品的關(guān)鍵部位,許多用單片機(jī)做控制的球賽計(jì)時(shí)計(jì)分系統(tǒng)也應(yīng)運(yùn)而生,如:用單片機(jī)控制液晶顯示(LCD)計(jì)時(shí)計(jì)分器,用單片機(jī)控制LED七段顯示器計(jì)時(shí)計(jì)分器等。籃球計(jì)時(shí)計(jì)分器以單片機(jī)為核心,由計(jì)時(shí)器、計(jì)分器、綜合控制器等組成。
系統(tǒng)采用模塊化設(shè)計(jì),主體分為計(jì)時(shí)顯示模塊、計(jì)分顯示模塊、定時(shí)報(bào)警、按鍵控制鍵盤模塊。每個(gè)模塊的程序結(jié)構(gòu)簡單、任務(wù)明確,易于編寫、調(diào)試和修改。程序可讀性好,對(duì)程序的修改可局部進(jìn)行,其他部分可保持不變。編程后利用Keil C51軟件來進(jìn)行編譯,再將生成的HEX文件裝入芯片中,采用Proteus軟件仿真,檢驗(yàn)功能是否能夠正常實(shí)現(xiàn),隨后可用Protel99畫出硬件電路圖。本設(shè)計(jì)中系統(tǒng)硬件電路主要由以下幾個(gè)部分組成:單片機(jī)AT89C51、計(jì)時(shí)電路、計(jì)分電路、報(bào)警電路和按鍵開關(guān)。
本次設(shè)計(jì)用由AT89C51編程控制LED七段數(shù)碼管作顯示的球賽計(jì)時(shí)計(jì)分系統(tǒng)。該系統(tǒng)具有賽程定時(shí)設(shè)置、賽程時(shí)間暫停、及時(shí)刷新甲乙雙方的成績等功能。它具有價(jià)格低廉、性能穩(wěn)定、操作方便并且易于攜帶等特點(diǎn),廣泛適合各類學(xué);蛘咝⌒蛨F(tuán)體作為賽程計(jì)時(shí)計(jì)分。
籃球計(jì)分器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (20.93 KB, 下載次數(shù): 115)
下載附件
2018-12-25 22:06 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #define LEDData P0
- unsigned char code LEDCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char minit,second,count,count1; //分,秒,計(jì)數(shù)器
- sbit add1=P1^0; //甲對(duì)加分,每按一次加1分 /在未開始比賽時(shí)為加時(shí)間分
- sbit dec1=P1^1; //甲對(duì)減分,每按一次減1分 /在未開始比賽時(shí)為減時(shí)間分
- sbit exchange=P1^2; //交換場(chǎng)地
- sbit add2=P1^3; //乙對(duì)加分,每按一次加1分 /在未開始比賽時(shí)為加時(shí)間秒
- sbit dec2=P1^4; //乙對(duì)減分,每按一次減1分 /在未開始比賽時(shí)為減時(shí)間秒
- sbit secondpoint=P0^7; //秒閃動(dòng)點(diǎn)
- //----依次點(diǎn)亮數(shù)碼管的位------
- sbit led1=P2^7;
- sbit led2=P2^6;
- sbit led3=P2^5;
- sbit led4=P2^4;
- sbit led5=P2^3;
- sbit led6=P2^2;
- sbit led7=P2^1;
- sbit led8=P2^0;
- sbit led9=P3^7;
- sbit led10=P3^6;
- sbit led11=P3^5;
- sbit alam=P1^7; //報(bào)警
- sbit onoff=P3^2;
- bit playon=0; //比賽進(jìn)行標(biāo)志位,為1時(shí)表示比賽開始,計(jì)時(shí)開啟
- bit timeover=0; //比賽結(jié)束標(biāo)志位,為1時(shí)表示時(shí)間已經(jīng)完
- bit AorB=0; //甲乙對(duì)交換位置標(biāo)志位
- bit halfsecond=0; //半秒標(biāo)志位
- unsigned int scoreA; //甲隊(duì)得分
- unsigned int scoreB; //乙隊(duì)得分
-
- void Delay5ms(void)
- {
- unsigned int i;
- for(i=100;i>0;i--);
- }
- void display(void)
- {
- //-----------顯示時(shí)間分--------------
- LEDData=LEDCode[minit/10];
- led1=0;
- Delay5ms();
- led1=1;
- LEDData=LEDCode[minit%10];
- led2=0;
- Delay5ms();
- led2=1;
- //-------------秒點(diǎn)閃動(dòng)------------
- if(halfsecond==1)
- LEDData=0x80;
- else
- LEDData=0x00;
- led2=0;
- Delay5ms();
- led2=1;
- secondpoint=0;
- //-----------顯示時(shí)間秒------------
- LEDData=LEDCode[second/10];
- led3=0;
- Delay5ms();
- led3=1;
- LEDData=LEDCode[second%10];
- led4=0;
- Delay5ms();
- led4=1;
- //-----------顯示1組的分?jǐn)?shù)百位-------
- if(AorB==0)
- LEDData=LEDCode[scoreA/100];
- else
- LEDData=LEDCode[scoreB/100];
- led5=0;
- Delay5ms();
- led5=1;
- //---------------顯示1組分?jǐn)?shù)的十位-----------
- if(AorB==0)
- LEDData=LEDCode[(scoreA%100)/10];
- else
- LEDData=LEDCode[(scoreB%100)/10];
- led6=0;
- Delay5ms();
- led6=1;
- //---------------顯示1組分?jǐn)?shù)的個(gè)位-----------
- if(AorB==0)
- LEDData=LEDCode[scoreA%10];
- else
- LEDData=LEDCode[scoreB%10];
- led7=0;
- Delay5ms();
- led7=1;
- //-----------顯示2組分?jǐn)?shù)的百位-------
- if(AorB==1)
- LEDData=LEDCode[scoreA/100];
- else
- LEDData=LEDCode[scoreB/100];
- led8=0;
- Delay5ms();
- led8=1;
- //-----------顯示2組分?jǐn)?shù)的十位-----------
- if(AorB==1)
- LEDData=LEDCode[(scoreA%100)/10];
- else
- LEDData=LEDCode[(scoreB%100)/10];
- led9=0;
- Delay5ms();
- led9=1;
- //-----------顯示2組分?jǐn)?shù)的個(gè)位-----------
- if(AorB==1)
- LEDData=LEDCode[scoreA%10];
- else
- LEDData=LEDCode[scoreB%10];
- led10=0;
- Delay5ms();
- led10=1;
- }
- //=========================按鍵檢測(cè)程序================================================
- void keyscan(void)
- {
- if(onoff==0)
- {
- display();
- if(onoff==0)
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- TR1=0;
- timeover=0;
- playon=!playon; //開始標(biāo)志位
- TR0=playon; //開啟計(jì)時(shí)
- do
- display();
- while(onoff==0);
- }
- }
- if(playon==0)
- {
- if(add1==0)
- {
- display();
- if(add1==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(minit<99)
- minit++;
- else
- minit=99;
- }
- do
- display();
- while(add1==0);
- }
- if(dec1==0)
- {
- display();
- if(dec1==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(minit>0)
- minit--;
- else
- minit=0;
- }
- do
- display();
- while(dec1==0);
- }
- if(add2==0)
- {
- display();
- if(add2==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(second<59)
- second++;
- else
- second=59;
- }
- do
- display();
- while(add2==0);
- }
- if(dec2==0)
- {
- display();
- if(dec2==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(second>0)
- second--;
- else
- second=0;
- }
- do
- display();
- while(dec2==0);
- }
- if(exchange==0)
- {
- display();
- if(exchange==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- TR1=0; //關(guān)閉T1計(jì)數(shù)器
- alam=1; //關(guān)報(bào)警
- AorB=~AorB; //開啟交換
- minit=15; //并將時(shí)間預(yù)設(shè)為15:00
- second=0;
- }
- do
- display();
- while(exchange==0);
- }
- }
- else
- {
- if(add1==0)
- {
- display();
- if(add1==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(AorB==0)
- {
- if(scoreA<999)
- scoreA++;
- else
- scoreA=999;
- }
- else
- {
- if(scoreB<999)
- scoreB++;
- else
- scoreB=999;
- }
- }
- do
- display();
- while(add1==0);
- }
- if(dec1==0)
- {
- display();
- if(dec1==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(AorB==0)
- {
- if(scoreA>0)
- scoreA--;
- else
- scoreA=0;
- }
- else
- {
- if(scoreB>0)
- scoreB--;
- else
- scoreB=0;
- }
- }
- do
- display();
- while(dec1==0);
- }
- if(add2==0)
- {
- display();
- if(add2==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(AorB==1)
- {
- if(scoreA<999)
- scoreA++;
- else
- scoreA=999;
- }
- else
- {
- if(scoreB<999)
- scoreB++;
- else
- scoreB=999;
- }
- }
- do
- display();
- while(add2==0);
- }
- if(dec2==0)
- {
- display();
- if(dec2==0);
- {
- alam=0;
- Delay5ms();Delay5ms();
- alam=1;
- if(AorB==1)
- {
- if(scoreA>0)
- scoreA--;
- else
- scoreA=0;
- }
- else
- {
- if(scoreB>0)
- scoreB--;
- else
- scoreB=0;
- }
- }
- do
- display();
- while(dec2==0);
- }
- }
- }
-
- //******************************主函數(shù)*************************************************
- void main(void)
- {
- TMOD=0x11;
- TL0=0xb0;
- TH0=0x3c;
- TL1=0xb0;
- TH1=0x3c;
- minit=12; //初始值為12:00
- second=0;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=0;
- TR1=0;
- P1=0xFF;
- P3=0xFF;
- while(1)
- {
- keyscan();
- display();
- }
- }
- //*********************************中斷服務(wù)函數(shù)**************************************
- void time0_int(void) interrupt 1
- {
- TL0=0xb0;
- TH0=0x3c;
- TR0=1;
- count++;
- if(count==10)
- {
- halfsecond=0;
- }
- if(count==20)
- {
- count=0;
- halfsecond=1;
-
- if(second==0)
- {
- if(minit>0)
- {
- second=59;
- minit--;
- }
- else
- {
- timeover=1;
- playon=0;
- TR0=0;
- TR1=1;
- }
- }
- else
- second--;
- }
- }
- //*********************************中斷服務(wù)函數(shù)**************************************
- void time1_int(void) interrupt 3
- {
- TL1=0xb0;
- TH1=0x3c;
- TR1=1;
- count1++;
- if(count1==10)
- {
- alam=0;
- }
- if(count1==20)
- {
- count1=0;
- alam=1;
- }
- }
復(fù)制代碼
0.png (41.07 KB, 下載次數(shù): 77)
下載附件
2018-12-25 22:06 上傳
所有資料51hei提供下載:
基于51單片機(jī)的籃球計(jì)分器設(shè)計(jì).zip
(67.99 KB, 下載次數(shù): 346)
2018-12-25 10:02 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|