|
設(shè)計(jì)任務(wù):設(shè)計(jì)并仿真實(shí)現(xiàn)一個(gè)籃球比賽計(jì)時(shí)器。系統(tǒng)框圖如下圖所示。
籃球比賽計(jì)時(shí)器框圖
4.設(shè)計(jì)要求
1) 基本要求
(1)計(jì)時(shí)功能:
l 能記錄整個(gè)賽程的實(shí)際比賽時(shí)間,并能修改比賽時(shí)間,計(jì)時(shí)范圍:0~99分鐘。
l 能扣除暫停時(shí)間、節(jié)間休息時(shí)間和罰球時(shí)間。
(2)定時(shí)功能:
l 總時(shí)間分為四節(jié),每節(jié)時(shí)間到報(bào)警
l 節(jié)休時(shí)間到報(bào)警
(3)節(jié)休時(shí)間可人為預(yù)置。
2) 發(fā)揮部分
(1)語音播報(bào)“暫停時(shí)長到”、“節(jié)間休息時(shí)長到”。
5、備注
(1)設(shè)計(jì)內(nèi)容包括:系統(tǒng)方案設(shè)計(jì)、電原理圖設(shè)計(jì)、PCB版圖設(shè)計(jì)和仿真電路設(shè)計(jì);
(2)完成基本要求和仿真得90分;
(3)完成擴(kuò)展部分并仿真加10分。
由于單片機(jī)的集成度高,功能強(qiáng),通用性好,特別是它具有體積小、重量輕、能耗低、價(jià)格便宜、可靠性高、抗干擾能力強(qiáng)和使用方便等獨(dú)特的優(yōu)點(diǎn),使單片機(jī)迅速得到了推廣應(yīng)用。目前已經(jīng)成為測量控制應(yīng)用系統(tǒng)中的優(yōu)選機(jī)種和新電子產(chǎn)品的關(guān)鍵部位,許多用單片機(jī)做控制的球賽計(jì)時(shí)系統(tǒng)也應(yīng)運(yùn)而生,如:用單片機(jī)控制液晶顯示(LCD)計(jì)時(shí)計(jì)時(shí)器,用單片機(jī)控制LED七段顯示器計(jì)時(shí)計(jì)時(shí)器等;@球計(jì)時(shí)器以單片機(jī)為核心,由計(jì)時(shí)器和綜合控制器等組成。
本設(shè)計(jì)中系統(tǒng)硬件電路主要由以下幾個(gè)部分組成:單片機(jī)AT89C51、計(jì)時(shí)電路及報(bào)警電路和按鍵開關(guān)。具體由AT89C51編程控制LED七段數(shù)碼管作顯示的球賽計(jì)時(shí)系統(tǒng)。該系統(tǒng)具有記錄單節(jié)時(shí)間及24秒倒計(jì)時(shí)等功能。它具有價(jià)格低廉、性能穩(wěn)定、操作方便并且易于攜帶等特點(diǎn),廣泛適合各類學(xué);蛘咝⌒蛨F(tuán)體作為賽程計(jì)時(shí)計(jì)分。
(1)設(shè)計(jì)內(nèi)容包括:系統(tǒng)方案設(shè)計(jì)、電原理圖設(shè)計(jì)、PCB版圖設(shè)計(jì)和仿真電路設(shè)計(jì);... II
(2)完成基本要求和仿真得90分;... II
摘 要... III
ABSTRACT. IV
第1章 概述... 6
1.1 選題背景、研究目的及意義... 6
1.1.1 選題背景... 6
1.2 國內(nèi)外研究現(xiàn)狀... 6
1.3 本設(shè)計(jì)主要實(shí)現(xiàn)內(nèi)容... 7
2 系統(tǒng)總體設(shè)計(jì)方案... 8
2.1單片機(jī)介紹... 8
2.2 顯示模塊... 9
3 硬件電路... 10
3.1 數(shù)碼管驅(qū)動(dòng)及顯示電路... 10
3.2 按鍵及蜂鳴器模塊... 10
第4章 軟件設(shè)計(jì)... 11
5 仿真測試... 12
5.1 PROTEUS仿真實(shí)現(xiàn)... 12
5.2仿真測試... 12
結(jié) 論... 15
參考文獻(xiàn)... 16
附錄一 硬件原理圖.. 17
附錄二 仿真原理圖.. 18
附錄三 PCB圖... 19
附錄四 程序... 20
第1章 概述
1.1 選題背景、研究目的及意義
隨著體育活動(dòng)越來越多的受到人們的重視,籃球比賽也被很多青少年所喜愛。我本人也參加過學(xué)校組織的班級間的籃球比賽,但是比賽的計(jì)分和計(jì)時(shí)的工具大多是很簡陋的比分牌,十分的不方便。而且大多由于缺少24秒的倒計(jì)時(shí),控球時(shí)間計(jì)時(shí)不是很準(zhǔn)確。我開發(fā)的這個(gè)系統(tǒng)原料簡單,按鍵功能強(qiáng)大,計(jì)時(shí)準(zhǔn)確,流動(dòng)性強(qiáng),非常適合于學(xué)校的籃球比賽等對于計(jì)時(shí)要求比較高的地方。自從1976年Intel公司推出第一批單片機(jī)以來,80年代單片機(jī)技術(shù)進(jìn)入快速發(fā)展時(shí)期,近年來,隨著大規(guī)模集成電路的發(fā)展,單片機(jī)繼續(xù)朝快速、高性能方向發(fā)展,從4位、8位單片機(jī)發(fā)展到16位、32位單片機(jī)。單片機(jī)主要用于控制,它的應(yīng)用領(lǐng)域遍及各行各業(yè),大到航天飛機(jī),小至日常生活中的冰箱、彩電,單片機(jī)都可以大顯其能。單片機(jī)將微處理器、存儲器、定時(shí)/計(jì)數(shù)器、I/O接口電路等集成在一個(gè)芯片上的大規(guī)模集成電路,本身即是一個(gè)小型化的微機(jī)系統(tǒng)。單片機(jī)技術(shù)與傳感與測量技術(shù)、信號與系統(tǒng)分析技術(shù)、電路設(shè)計(jì)技術(shù)、可編程邏輯應(yīng)用技術(shù)、微機(jī)接口技術(shù)、數(shù)據(jù)庫技術(shù)以及數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)操作系統(tǒng)、匯編語言程序設(shè)計(jì)、高級語言程序設(shè)計(jì)、軟件工程、數(shù)據(jù)網(wǎng)絡(luò)通信、數(shù)字信號處理、自動(dòng)控制、誤差分析、儀器儀表結(jié)構(gòu)設(shè)計(jì)和制造工藝等的結(jié)合,使得單片機(jī)的應(yīng)用非常廣泛。
1.3 本設(shè)計(jì)主要實(shí)現(xiàn)內(nèi)容
(1)計(jì)時(shí)功能:
能記錄整個(gè)賽程的實(shí)際比賽時(shí)間,并能修改比賽時(shí)間,計(jì)時(shí)范圍:0~99分鐘。
能扣除暫停時(shí)間、節(jié)間休息時(shí)間和罰球時(shí)間。
(2)定時(shí)功能:
總時(shí)間分為四節(jié),每節(jié)時(shí)間到報(bào)警
節(jié)休時(shí)間到報(bào)警
(3)節(jié)休時(shí)間可人為預(yù)置。
XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時(shí)鐘源驅(qū)動(dòng)器件,XTAL2應(yīng)不接。有余輸入至內(nèi)部時(shí)鐘信號要通過一個(gè)二分頻觸發(fā)器,因此對外部時(shí)鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。
復(fù)位電路: 復(fù)位電路是單片機(jī)應(yīng)用中的最基本和最重要的電路,用于處理單片機(jī)工作失靈等緊急問題。當(dāng)單片機(jī)復(fù)位端口為高電平時(shí),單片機(jī)中的代碼將不會被執(zhí)行。一開始上電時(shí),電容還未充滿電,復(fù)位端口為高電平,避免了直接上電就運(yùn)行程序?qū)е碌某绦蝈e(cuò)誤等問題。當(dāng)電容充滿電后,復(fù)位端口變?yōu)榈碗娖,程序開始運(yùn)行。單片機(jī)最小系統(tǒng)如圖2.1所示。
圖2.1 單片機(jī)最小系統(tǒng)
2.2 顯示模塊
方案一:四位共陰數(shù)碼管顯示煙霧濃度值和溫度值;
方案二:采用液晶顯示屏LCD顯示煙霧濃度值和溫度值。
本系統(tǒng)顯示采用的是四位共陰數(shù)碼管。眾所周知,單片機(jī)設(shè)計(jì)中一般采用LED數(shù)碼管或者LCD液晶顯示屏來顯示數(shù)據(jù),而LCD液晶顯示屏的特點(diǎn)比較突出,顯示的數(shù)據(jù)清晰、明了,且功耗較少。相比于LCD液晶顯示,四位數(shù)碼管的顯示能力不如LCD液晶顯示屏,但是其價(jià)格便宜,且能滿足本設(shè)計(jì)的需求。因此,本設(shè)計(jì)就采用四位共陰數(shù)碼管,下圖2.2所示的是四位共陰數(shù)碼管。
圖2.2 四位數(shù)碼管
3 硬件電路
3.1 數(shù)碼管驅(qū)動(dòng)及顯示電路
數(shù)碼管驅(qū)動(dòng)及顯示電路如圖3.1所示,通過PNP三極管S9012顯示數(shù)碼管的驅(qū)動(dòng),并利用單片機(jī)P0口實(shí)現(xiàn)數(shù)據(jù)的顯示。
圖3.1 數(shù)碼管驅(qū)動(dòng)及顯示電路
3.2 按鍵及蜂鳴器模塊
按鍵電路如圖3.2所示,由“時(shí)間分鐘加鍵”、“時(shí)間分鐘減鍵”、“時(shí)間秒加鍵”、“時(shí)間秒減鍵”、“計(jì)時(shí)開始/停止按鍵”、“24S重置按鍵”六個(gè)鍵組成。在改變分?jǐn)?shù)時(shí),按下以上的鍵就可以實(shí)現(xiàn)數(shù)值的改變。
圖3.2 按鍵及蜂鳴器模塊
第4章 軟件設(shè)計(jì)
本設(shè)計(jì)中采用的處理器是STC單片機(jī),由此可采用面向MCS-51的程序設(shè)計(jì)語言,包括ASM51匯編語言和C51高級語言,這兩種語言各有特點(diǎn)。數(shù)學(xué)運(yùn)算程序適合用C51高級語言編寫,因?yàn)橛酶呒壵Z言編寫運(yùn)算程序可提高編程效率和應(yīng)用程序的可靠性。本設(shè)計(jì)需要實(shí)現(xiàn)時(shí)間的加減以及計(jì)時(shí)提示,整體程序流程圖如圖4.1所示。
圖4.1 主程序流程圖
5 仿真測試
5.1PROTEUS仿真實(shí)現(xiàn)
首先,我們利用我們根據(jù)硬件電路原理圖,同時(shí)結(jié)合仿真特點(diǎn),利用protues8.7軟件設(shè)計(jì)了如圖5.1所示的仿真電路圖。仿真中最小系統(tǒng)的復(fù)位電路與硬件原理圖最小系統(tǒng)中復(fù)位電路有所區(qū)別,復(fù)位電路中的電容值為0.1uf,電阻值為100Ω。
圖5.1 仿真原理圖
根據(jù)第四章軟件設(shè)計(jì)的思路,結(jié)合仿真需求,我們將仿真設(shè)計(jì)的C代碼利用KEIL5編寫好,并進(jìn)行詳細(xì)地注釋。接著,我們點(diǎn)擊“create HEX file”,并再次編譯程序,這樣就會生成HEX燒錄文件。最后,我們打開仿真原理圖,并將生產(chǎn)的“HEX”文件燒錄到單片機(jī)芯片中,點(diǎn)擊開始仿真,就可以實(shí)現(xiàn)相關(guān)仿真了,我們將在下一節(jié)中具體展示仿真的結(jié)果。
5.2仿真測試
通過按下“倒計(jì)時(shí)開始/停止”按鍵,開始倒計(jì)時(shí)。具體仿真測試如圖5.2所示,從圖中可以看出,單節(jié)時(shí)間調(diào)整為12分鐘,按鍵按下后,數(shù)碼管顯示清晰、無抖動(dòng),實(shí)現(xiàn)了既定功能。
圖5.2 時(shí)間顯示
通過按下“時(shí)間分鐘加鍵”、“時(shí)間分鐘減鍵”、“時(shí)間秒加鍵”、“時(shí)間秒減鍵”四個(gè)按鍵,可以實(shí)現(xiàn)單節(jié)時(shí)間的調(diào)整。具體仿真測試如圖5.3所示,從圖中可以看出,24S時(shí)間為0,蜂鳴器響起,按鍵按下后,數(shù)碼管顯示清晰、無抖動(dòng),實(shí)現(xiàn)了既定功能。
圖5.3 時(shí)間到報(bào)警
通過按下“24S重置”按鍵,可以實(shí)現(xiàn)24S重置。具體仿真測試如圖5.4所示,從圖中可以看出,24S時(shí)間為24,按鍵按下后,數(shù)碼管顯示清晰、無抖動(dòng),實(shí)現(xiàn)了既定功能。
圖5.4 重置
結(jié) 論
結(jié)合以上設(shè)計(jì),本設(shè)計(jì)實(shí)現(xiàn)了以下功能:
(1)計(jì)時(shí)功能:
能記錄整個(gè)賽程的實(shí)際比賽時(shí)間,并能修改比賽時(shí)間,計(jì)時(shí)范圍:0~99分鐘。
能扣除暫停時(shí)間、節(jié)間休息時(shí)間和罰球時(shí)間。
(2)定時(shí)功能:
總時(shí)間分為四節(jié),每節(jié)時(shí)間到報(bào)警
節(jié)休時(shí)間到報(bào)警
(3)節(jié)休時(shí)間可人為預(yù)置。
附錄四 程序
#include<reg52.h>
#define LEDData P0
unsigned char codeLEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
intminit,second,count,count1; //分,秒,計(jì)數(shù)器
char min=15,sec=0;
sbit add1=P1^0; //甲對加分,每按一次加1分 /在未開始比賽時(shí)為加時(shí)間分
sbit dec1=P1^1; //甲對減分,每按一次減1分 /在未開始比賽時(shí)為減時(shí)間分
sbit add2=P1^3; //乙對加分,每按一次加1分 /在未開始比賽時(shí)為加時(shí)間秒
sbit dec2=P1^4; //乙對減分,每按一次減1分 /在未開始比賽時(shí)為減時(shí)間秒
sbit p24_sec=P1^5;
sbitsecondpoint=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 led11=P3^5;
sbit led12=P3^4;
sbit alam=P1^7; //報(bào)警
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; //甲乙對交換位置標(biāo)志位
bit halfsecond=0; //半秒標(biāo)志位
char sec24=24;
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=0x7f;
else
LEDData=0xff;
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;
//-----------顯示時(shí)間分--------------
LEDData=LEDCode[sec24/10];
led11=0;
Delay5ms();
led11=1;
LEDData=LEDCode[sec24%10];
led12=0;
Delay5ms();
led12=1;
}
//=========================按鍵檢測程序================================================
void keyscan(void)
{
if(playon==0)
{
if(add1==0)
{
display();
if(add1==0);
{
if(minit<99)
minit++;
else
minit=99;
min=minit;
}
do
display();
while(add1==0);
}
if(dec1==0)
{
display();
if(dec1==0);
{
if(minit>0)
minit--;
else
minit=0;
min=minit;
}
do
display();
while(dec1==0);
}
if(add2==0)
{
display();
if(add2==0);
{
if(second<59)
second++;
else
second=59;
sec=second;
}
do
display();
while(add2==0);
}
if(dec2==0)
{
display();
if(dec2==0);
{
if(second>0)
second--;
else
second=0;
sec=second;
}
do
display();
while(dec2==0);
}
}
else
{
if(p24_sec==0)
{
display();
if(p24_sec==0)
{
sec24=24;
TR0=1;
alam=1;
while(p24_sec==0) display();
}
}
}
}
//******************************主函數(shù)*************************************************
void main(void)
{
TMOD=0x11;
TL0=0xb0;
TH0=0x3c;
TL1=0xb0;
TH1=0x3c;
minit=min; //初始值為15:00
second=sec;
EA=1;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
EX0=1;
IT0=1;
IT1=1;
// EX1=1;
PX0=1;
// PX1=1;
PT0=0;
P1=0xFF;
P3=0xFF;
alam=1;
while(1)
{
keyscan();
display();
}
}
void PxInt0(void)interrupt 0
{
Delay5ms();
EX0=0;
alam=1;
TR1=0;
if(timeover==1)
{
timeover=0;
}
if(playon==0)
{
playon=1; //開始標(biāo)志位
TR0=1; //開啟計(jì)時(shí)
if((minit+second)==0)
{
sec24=24;
minit=min;
second=sec;
}
}
else
{
playon=0; //開始標(biāo)志位清零,表示暫停
TR0=0; //暫時(shí)計(jì)時(shí)
}
EX0=1; //開中斷
}
/*
void PxInt1(void)interrupt 2
{
Delay5ms();
EX1=0; //關(guān)中斷
if(timeover==1) //比賽結(jié)束標(biāo)志,必須一節(jié)結(jié)束后才可以交換,中途不能交換場地
{
TR1=0; //關(guān)閉T1計(jì)數(shù)器
alam=1; //關(guān)報(bào)警
AorB=~AorB; //開啟交換
minit=15; //并將時(shí)間預(yù)設(shè)為15:00
second=0;
}
EX1=1; //開中斷
}
*/
//*********************************中斷服務(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)
{
second--;
if(second<0)
{
if(minit>0)
{
second=59;
minit--;
}
else
{
second=0;
timeover=1;
playon=0;
TR0=0;
TR1=1;
}
|
|