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