貴州電子信息職業(yè)技術(shù)學(xué)院通信工程系 吳政江
微電腦控制簡易球賽計分牌的設(shè)計與制作
貴州電子信息職業(yè)技術(shù)學(xué)院通信工程系 吳政江
球類比賽中裁判需要計分時通常需要計分牌,以便及時、準(zhǔn)確、清楚地記錄并顯示比賽雙方的得分,體現(xiàn)比賽的公正性以及渲染比賽的緊張氣氛。傳統(tǒng)的計分牌采用黑板加粉筆方式,計分麻煩且不環(huán)保。用單片機(jī)來設(shè)計計分牌可謂得心應(yīng)手。本文介紹一款微電腦控制簡易球賽計分牌的設(shè)計與制作。硬件上,它是一個具有數(shù)碼管顯示、按鍵輸入、數(shù)據(jù)運(yùn)算等比較完整的單片機(jī)應(yīng)用系統(tǒng)。軟件上,采用C語言編程。旨在向廣大單片機(jī)愛好者介紹單片機(jī)應(yīng)用系統(tǒng)的基本開發(fā)過程以及C語言程序設(shè)計方法。
單片機(jī);計分牌;設(shè)計;制作
電子信息類專業(yè)各骨干課程不但有較難理解的理論分析,也有大量的實(shí)際應(yīng)用電路,因而既要學(xué)習(xí)理論,更要動手實(shí)踐,理論性和實(shí)踐性均很強(qiáng)。然而,當(dāng)前職業(yè)學(xué)校學(xué)生普遍存在文化基礎(chǔ)不牢,接受能力不佳,學(xué)習(xí)積極性、分析問題與解決問題能力不高的現(xiàn)實(shí)情況。因此,長期以來,職業(yè)學(xué)校電子信息類專業(yè)各骨干課程理論教學(xué)方法枯燥,實(shí)驗(yàn)教學(xué)可操作性差,課程設(shè)計缺乏創(chuàng)新,結(jié)果大多數(shù)學(xué)生對這些課程理論理解不清,實(shí)驗(yàn)走過場,課程設(shè)計找槍手,考試弄虛作假。針對這一問題,我們提出了用計算機(jī)仿真技術(shù)對電子信息類專業(yè)各骨干課程進(jìn)行教學(xué)改革的思想。本文是用Proteus仿真軟件對單片機(jī)課程進(jìn)行教學(xué)改革的一個綜合應(yīng)用。用單片機(jī)設(shè)計一個簡易球賽計分牌。硬件上,它是一個具有數(shù)碼管顯示、按鍵輸入、數(shù)據(jù)運(yùn)算等比較完整的單片機(jī)應(yīng)用系統(tǒng)。軟件上,采用C語言編程。
1.1 球賽計分牌功能模塊劃分
(1)人機(jī)對話功能模塊。計分牌應(yīng)能及時輸入比賽雙方得分,故電路要求有人機(jī)對話功能。這里用4個按鍵來改變比賽雙方得分,按鍵SW1與SW2用來增加及減少比賽一方(如A方)得分?jǐn)?shù);按鍵SW3與SW4用來增加及減少比賽另一方(如B方)得分?jǐn)?shù)。
(2)顯示模塊。采用4只共陽極數(shù)碼管顯示得分情況,最大顯示比分為99∶99,基本能滿足小型比賽要求。其中“∶”由兩只紅色發(fā)光二極管代替,開機(jī)時即亮。
(3)單片機(jī)模塊。這里采用AT89C51單片機(jī)加復(fù)位電路與時鐘電路即可,無需外擴(kuò)存儲器與I/O口。
(4)電源模塊。單片機(jī)所需的+5V電源可由220伏的交流市電經(jīng)降壓、整流、濾波與穩(wěn)壓得到。
1.2 硬件電路設(shè)計
根據(jù)以上功能模塊劃分,確定球賽計分牌硬件電路[1]如圖1所示(電源電路略去未畫,實(shí)際制作時應(yīng)補(bǔ)上)。對該電路簡要分析如圖1所示。
(1)核心部分是由AT89C51單片機(jī)與復(fù)位電路以及時鐘電路組成的單片機(jī)最小應(yīng)用系統(tǒng)。
(2)根據(jù)計分牌功能要求,用4個共陽極數(shù)碼管顯示比賽雙方得分,數(shù)字顯示中間分隔符“∶”利用兩只紅色發(fā)光二極管來實(shí)現(xiàn)。
(3)Q1、Q2、Q3、Q4為4個共陽極數(shù)碼管驅(qū)動三極管,目的是增強(qiáng)單片機(jī)I/O口的電流驅(qū)動能力。
(4)由于本項(xiàng)目涉及到的按鍵數(shù)較少,故采用獨(dú)立式鍵盤結(jié)構(gòu)。4只按鍵分別連接單片機(jī)的P1.4~P1.7口(實(shí)際制作時可任選單片機(jī)其他I/O口,但程序應(yīng)作相應(yīng)的調(diào)整)。
根據(jù)硬件電路,設(shè)比賽雙方為A與B,按鍵SW1與SW2設(shè)為A方得分加、減按鍵;按鍵SW3與SW4設(shè)為B方得分加、減按鍵。程序采用模塊化設(shè)計,由主函數(shù)及相關(guān)子函數(shù)組成。
2.1 主函數(shù)
完成對四個獨(dú)立按鍵的無限循環(huán)判斷,并調(diào)動態(tài)掃描函數(shù)顯示比賽雙方得分?jǐn)?shù)。其流程圖[2]如圖2所示。
2.2 動態(tài)掃描函數(shù)
完成BCD碼轉(zhuǎn)換、動態(tài)數(shù)碼管顯示,同時用于按鍵延時消抖。
圖1 球賽計分牌電路
2.3 5ms延時函數(shù)
完成5ms延時,供動態(tài)掃描函數(shù)調(diào)用。
這里給出C語言參考源程序如下所示。
#include〈reg51.h〉
#define uchar unsigned char
#define uint unsigned int
sbit sw1=P1?7; //定義A方增加鍵
sbit sw2=P1?6; //定義A方減少鍵
sbit sw3=P1?5; //定義B方增加鍵
sbit sw4=P1?4; //定義B方減少鍵
uchar duanma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x 92,0x82,0xF8,0x80,0x90}; //共陽極數(shù)碼管0到9的段碼
uchar weima[4]={0x7f,0xbf,0xdf,0xef}; //共陽極數(shù)管位碼
uchar xianshi[4]={0,0,0,0}; //顯示緩存器
uint jishu=0,affs=0,bffs=0; //定義變量
void dtsm(void); //聲明動態(tài)掃描函數(shù)
/*延時約5毫秒函數(shù)*/
void delay05ms(void)
{
uchar j,k;
for(j=10;j〉0;j--)
for(k=110;k〉0;k--);
}
如圖2所示。
/*主函數(shù)*/
void main(void)
{
while(1) //無限循環(huán)
{
dtsm(); //*******************按鍵判斷**** ********************************
if(sw1==0) //A方加分鍵按下嗎
{
dtsm(); //調(diào)動態(tài)掃描函數(shù)兼作延時消抖
if(sw1==0) //A方加分鍵還按下嗎
圖2 計分牌主函數(shù)流程圖
{
affs++; //A方分?jǐn)?shù)加1
if(affs==100)affs=99; //最大為99
while(sw1==0)dtsm(); //等待A方加分鍵釋放
}
}
if(sw2==0) //A方減分鍵按下嗎
{
dtsm(); //調(diào)動態(tài)掃描函數(shù)兼作延時消抖
if(sw2==0) //A方減分鍵還按下嗎
{
affs--; //A方分?jǐn)?shù)減1
if(affs==-1)affs=0; //最小為0
while(sw2==0)dtsm(); //等待A方減分鍵釋放
}}
if(sw3==0) //判斷B方加分鍵
{
dtsm();
if(sw3==0)
{
bffs++;
if(bffs==100)bffs=99;
while(sw3==0)dtsm();
}}
if(sw4==0) //判斷B方減分鍵
{
dtsm();
if(sw4==0)
{
bffs--;
if(bffs==-1)bffs=0;
while(sw4==0)dtsm();
}}}}
/*動態(tài)掃描函數(shù)*/
void dtsm(void)
{
xianshi[0]=duanma[affs/10]; //分離A方分?jǐn)?shù)十位
xianshi[1]=duanma[affs%10]; //分離A方分?jǐn)?shù)個位
xianshi[2]=duanma[bffs/10]; //分離B方分?jǐn)?shù)十位
xianshi[3]=duanma[bffs%10]; //分離B方分?jǐn)?shù)個位
//*******************動態(tài)掃描**************** *****************
jishu++;
if(jishu==4)jishu=0;
P2=0x00;
P2=weima[jishu]; //送位碼
P0=xianshi[jishu]; //送段碼
delay05ms();
}
本程序采用模塊化設(shè)計有利于程序的升級與修改。程序中按鍵“去抖”不用延時子函數(shù)而用動態(tài)掃描函數(shù)代替,可以提高程序效率,避免在調(diào)用延時子函數(shù)時數(shù)碼管亮度下降甚至出現(xiàn)閃爍現(xiàn)象。調(diào)用一次動態(tài)掃描函數(shù)相當(dāng)于延時約8ms。這是采用動態(tài)數(shù)碼管顯示時的應(yīng)用技巧之一。
(1)啟動Proteus軟件,并用其繪制圖1所示電路原理圖。
(2)啟動Keil軟件。建立工程,輸入上述C語言源程序并編譯調(diào)試生成二進(jìn)制的目標(biāo)文件。
(3)將第(2)步生成的二進(jìn)制目標(biāo)文件加載到第(1)步所繪電路原理圖的AT89C51單片機(jī)中,然后仿真運(yùn)行。按下SW1~SW4中的任一按鍵,觀察相應(yīng)的數(shù)碼管顯示是否變化,其變化是否符合要求。
(4)購買元器件,按硬件電路焊好電路板,將參考程序?qū)懭階T89C51單片機(jī),通電。按下SW1~SW4中的任一按鍵,觀察相應(yīng)的數(shù)碼管顯示是否變化,其變化是否符合要求。調(diào)試完成后,將產(chǎn)品投入實(shí)際的球類比賽(如籃球比賽)中使用,看是否能適應(yīng)實(shí)際的現(xiàn)場比賽。
文中從電路結(jié)構(gòu)與工作原理、軟件規(guī)劃與設(shè)計以及系統(tǒng)調(diào)試等三個方面簡要介紹了微電腦控制簡易球賽計分牌的設(shè)計與制作。是采用Proteus仿真軟件對單片機(jī)原理及應(yīng)用課程進(jìn)行教學(xué)改革的一個綜合性應(yīng)用實(shí)例。硬件上,它是一個具有數(shù)碼管顯示、按鍵輸入、數(shù)據(jù)運(yùn)算等比較完整的單片機(jī)應(yīng)用系統(tǒng)。軟件上,采用C語言編程。涉及單片機(jī)的內(nèi)部結(jié)構(gòu)及最小應(yīng)用系統(tǒng)、獨(dú)立式鍵盤結(jié)構(gòu)與設(shè)計、LED數(shù)碼管接口技術(shù)及其動態(tài)顯示原理以及C語言程序設(shè)計等單片機(jī)知識。旨在向廣大單片機(jī)愛好者介紹單片機(jī)應(yīng)用系統(tǒng)的基本開發(fā)過程以及C語言程序設(shè)計方法。
[1]吳政江,張定祥.單片機(jī)原理及應(yīng)用(基于C語言)[M].北京:化學(xué)工業(yè)出版社,2013.
[2]舒?zhèn)ゼt.單片機(jī)原理與實(shí)訓(xùn)教程[M].北京:科學(xué)出版社,2008.
2014年貴州省高校人文社會科學(xué)研究項(xiàng)目“基于計算機(jī)仿真技術(shù)的電子信息類骨干課程課改研究”(負(fù)責(zé)人:吳政江;編號:14ZC261)。
吳政江,貴州電子信息職業(yè)技術(shù)學(xué)院副教授,主要研究方向:單片機(jī)與嵌入式系統(tǒng)、電子信息技術(shù)、職業(yè)教育等。