|
|
1 課題設(shè)計(jì)內(nèi)容
此次設(shè)計(jì)提出了用AT89C51單片機(jī)為核心控制元件,設(shè)計(jì)一個(gè)簡(jiǎn)易的搶答器,本方案以AT89C51單片機(jī)作為主控核心,與晶振、數(shù)碼管、蜂鳴器等構(gòu)成六路搶答器,利用了單片機(jī)的延時(shí)電路、按鍵復(fù)位電路、時(shí)鐘電路、定時(shí)/中斷等電路,設(shè)計(jì)的六路搶答器具有實(shí)時(shí)顯示搶答選手的號(hào)碼和搶答時(shí)間的特點(diǎn),還有復(fù)位電路,使其再開(kāi)始新的一輪的答題和比賽,同時(shí)還利用C51語(yǔ)言編程,使其實(shí)現(xiàn)搶答器的一些基本的功能。
本設(shè)計(jì)的系統(tǒng)實(shí)用性強(qiáng)、判斷精確、操作簡(jiǎn)單、擴(kuò)展功能強(qiáng)。它的功能實(shí)現(xiàn)是比賽開(kāi)始,主持人讀完題之后按下?lián)尨疰I,聲音提示,提示音結(jié)束后搶答倒計(jì)時(shí)開(kāi)始,此時(shí)數(shù)碼管開(kāi)始進(jìn)行10s的倒計(jì)時(shí),直到有一個(gè)選手搶答,選手按下?lián)尨疰I時(shí)有聲音提示并在對(duì)應(yīng)的數(shù)碼管上顯示出該選手的編號(hào)和搶答所剩的時(shí)間。如果在規(guī)定的10s時(shí)間內(nèi)沒(méi)有做出搶答,鳴笛提示本輪搶答結(jié)束,則此題作廢,即開(kāi)始重新一輪的搶答。下一輪搶答前先將時(shí)間歸零,再按下?lián)尨疰I即開(kāi)始。搶答者回答正確后,主持人可按下加分鍵,對(duì)應(yīng)于選手編號(hào)的數(shù)碼管顯示數(shù)字就增加(按下一次加一分,最高顯示9分),反之,搶答者回答錯(cuò)誤后,在該選手的得分?jǐn)?shù)不為0時(shí),主持人可按下減分鍵(按下一次減一分)。如果支持人要調(diào)整搶答時(shí)間,主持人可按下加時(shí)鍵(按下一次加1s)或減時(shí)鍵(按下一次減1s)。
2 設(shè)計(jì)方案論證
根據(jù)設(shè)計(jì)內(nèi)容要求,提出了如下兩種方案
方案一:以AT89C51為核心,連接LED數(shù)碼管,晶振電路,開(kāi)關(guān)電路組成。其工作原理圖如下所示:
圖1 工作原理圖
圖2.1 方案一:采用RX8 驅(qū)動(dòng)譯碼單片機(jī)設(shè)計(jì)的多路搶答器系統(tǒng)結(jié)構(gòu)框圖
方案二:以AT89C51單片機(jī)作為主控核心,與晶振、數(shù)碼管、蜂鳴器等構(gòu)成六路搶答器,利用了單片機(jī)的延時(shí)電路、按鍵復(fù)位電路、時(shí)鐘電路、定時(shí)/中斷等電路,設(shè)計(jì)的六路搶答器具有實(shí)時(shí)顯示搶答選手的號(hào)碼和搶答時(shí)間的特點(diǎn),還有復(fù)位電路。
兩種方案的特點(diǎn)比較如下:方案一具有電路簡(jiǎn)單,設(shè)計(jì)方便,耗電較少,可靠性高等特點(diǎn);方案二的圖案具備的功能更多,單片機(jī)占用端口資源利用合理,。可見(jiàn)方案二優(yōu)于其他兩種方案,因此本設(shè)計(jì)選用方案二。
3 系統(tǒng)硬件設(shè)計(jì)3.1方框圖
圖3.1 功能模塊圖
第一步按鍵掃描,AT89C51接收到按鍵掃描的信息確定是否開(kāi)始啟動(dòng)本輪搶答,當(dāng)掃描鍵被按下,第二步AT89C51啟動(dòng)聲音模塊,蜂鳴器發(fā)聲一段時(shí)間停止發(fā)聲,與此同時(shí)選手開(kāi)始搶答,第三步AT89C51啟動(dòng)LED顯示模塊,顯示搶答倒計(jì)時(shí),和各選手的的分?jǐn)?shù),整個(gè)過(guò)程按鍵掃描一直執(zhí)行,當(dāng)有選手按下?lián)尨疰I,按鍵掃描終止對(duì)選手按鍵的掃描,AT89C51啟動(dòng)聲音模塊提示有選手按鍵,并將該選手的序號(hào)發(fā)送到LED顯示,第四步,按鍵掃描對(duì)加減分按鍵掃描,按鍵每按下一次對(duì)相應(yīng)的選手對(duì)應(yīng)的數(shù)碼管上顯示的分?jǐn)?shù)加減一,直到搶答復(fù)位鍵的按下,開(kāi)始新的一輪循環(huán)。當(dāng)?shù)褂?jì)時(shí)結(jié)束時(shí)選手仍然沒(méi)有按鍵,AT89C51啟動(dòng)聲音模塊,提示本輪搶答結(jié)束。
3.2搶答器顯示模塊選擇
顯示模塊主要是顯示搶答的時(shí)間,組別號(hào)碼和選手得分情況。
在使用傳統(tǒng)的數(shù)碼管顯示。數(shù)碼管具有:低能耗、低損耗、低壓、壽命長(zhǎng)、耐老化、防曬、防潮、防火、防高(低)溫,對(duì)外界環(huán)境要求低,易于維護(hù),同時(shí)其精度高,稱量快,精確可靠,操作簡(jiǎn)單。數(shù)碼顯示是采用BCD編碼顯示數(shù)字,程序編譯容易,資源占用較少。
顯示功能與硬件關(guān)系極大,當(dāng)硬件固定后,如何在不引起操作者誤解的前提下提供盡可能豐富的信息,全靠軟件來(lái)解決。在這里我們使用的是七段數(shù)碼管顯示,通常在顯示上我們采用的方法一般包括兩種:一種是靜態(tài)顯示,一種是動(dòng)態(tài)顯示。其中靜態(tài)顯示的特點(diǎn)是顯示穩(wěn)定不閃爍,程序編寫簡(jiǎn)單,但占用端口資源多;動(dòng)態(tài)顯示的特點(diǎn)是:顯示穩(wěn)定性沒(méi)靜態(tài)好,程序編寫復(fù)雜,但是相對(duì)靜態(tài)顯示而言占用端口資源少。在本設(shè)計(jì)中根據(jù)實(shí)際情況采用的是動(dòng)態(tài)顯示方法。8位8段數(shù)碼管顯示電路如下圖所示。
圖 3.2 8位七段數(shù)碼管顯示電路圖
上圖中數(shù)碼管采用的是8位一體七段共陽(yáng)數(shù)碼管,其中A~H段分別接到單片機(jī)的P0口,由單片機(jī)輸出的P0口數(shù)據(jù)來(lái)決定段碼值,位選碼COM1,COM2,COM3,COM4,(COM1,COM2,
COM3,COM4)分別接到單片機(jī)的P2^0,P2^1,P2^2 ,P2^3,(P2^4,P2^5,P2^6,P2^7)由單片機(jī)來(lái)決定當(dāng)前該顯示的是哪一位。在圖中還有一個(gè)排阻,連接在P0口上,用作P0口的上拉電阻,保證P0口沒(méi)有數(shù)據(jù)輸出時(shí)候處于高電平狀態(tài)。
通過(guò)查表法,將其在數(shù)碼管上顯示出來(lái),其中P0口為字型碼輸入端,P2口的8位為字選段輸入段。在這里我們通過(guò)查表將字型碼送給8段數(shù)碼管顯示的數(shù)字。
3.3 控制器
控制器主要用于對(duì)顯示、搶答、聲音、計(jì)分等模塊進(jìn)行控制。
采用ATMEL公司的AT89C51作為系統(tǒng)控制器的CPU方案。單片機(jī)算術(shù)運(yùn)算功能強(qiáng),軟件編程靈活、自由度大,可以用軟件編程實(shí)現(xiàn)各種算法和邏輯控制,并且由于其功耗低、體積小、技術(shù)成熟和成本低等優(yōu)點(diǎn),使其在各個(gè)領(lǐng)域應(yīng)用廣泛。
3.4 鍵盤電路
鍵盤是單片機(jī)不可缺少的輸入設(shè)備,是實(shí)現(xiàn)人機(jī)對(duì)話的紐帶。鍵盤按結(jié)構(gòu)形式可以分為非編碼鍵盤和編碼鍵盤,前者用軟件方法產(chǎn)生鍵碼,而后者則用硬件方法來(lái)產(chǎn)生鍵碼。在單片機(jī)中使用的都是非編碼鍵盤,因?yàn)榉蔷幋a鍵盤結(jié)構(gòu)簡(jiǎn)單,成本低廉,非編碼鍵盤的類型很多,常用的有獨(dú)立式鍵盤,行列式鍵盤等。本設(shè)計(jì)采用獨(dú)立式鍵盤:
鍵盤接口中使用多少根I/O線,鍵盤中就有幾個(gè)按鍵,鍵盤接口使用了8根I/O口線,該鍵盤就有8個(gè)按鍵,這種類型的鍵盤,其按鍵比較少,且鍵盤中各按鍵的工作互不干擾。因此可以根據(jù)實(shí)際需要對(duì)鍵盤中的按鍵靈活的編碼。如圖2-2。
最簡(jiǎn)單的編碼方式就是根據(jù)I/O輸入口所直接反映的相應(yīng)按鍵,按下的狀態(tài)進(jìn)行編碼,稱按鍵直接狀態(tài)碼,對(duì)于這樣編碼的獨(dú)立式鍵盤,CPU可以通過(guò)直接讀取I/O口的狀態(tài)來(lái)獲取按鍵的直接狀態(tài)編碼值,根據(jù)這個(gè)值直接進(jìn)行按鍵識(shí)別,這樣形式的鍵盤結(jié)構(gòu)簡(jiǎn)單,按鍵識(shí)別容易。
獨(dú)立式鍵盤的缺點(diǎn)是需要占用比較多的I/O口線,當(dāng)單片機(jī)應(yīng)用系統(tǒng)鍵盤中需要的按鍵比較少或I/O口線比較富余時(shí),可以采用這樣類型的鍵盤。
圖3.3獨(dú)立式鍵盤
3.5 時(shí)鐘頻率電路的設(shè)計(jì)
單片機(jī)必須在時(shí)鐘的驅(qū)動(dòng)下才能工作。在單片機(jī)內(nèi)部有一個(gè)時(shí)鐘振蕩電路,只需要外接一個(gè)振蕩源就能產(chǎn)生一定的時(shí)鐘信號(hào)送到單片機(jī)內(nèi)部的各個(gè)單元,決定單片機(jī)的工作速度。時(shí)鐘電路如下圖所示。
圖3.4外部振蕩源電路
一般選用石英晶體振蕩器。此電路在加電大約延遲10ms后振蕩器起振,在XTAL2引腳產(chǎn)生幅度為3V左右的正弦波時(shí)鐘信號(hào),其振蕩頻率主要由石英晶振的頻率確定。電路中兩個(gè)電容C1,C2的作用有兩個(gè):一是幫助振蕩器起振;二是對(duì)振蕩器的頻率進(jìn)行微調(diào)。
單片機(jī)在工作時(shí),由內(nèi)部振蕩器產(chǎn)生或由外直接輸入的送至內(nèi)部控制邏輯單元的時(shí)鐘信號(hào)的周期稱為時(shí)鐘周期。其大小是時(shí)鐘信號(hào)頻率的倒數(shù)。圖中時(shí)鐘頻率為12MHz。
3.6 復(fù)位電路的設(shè)計(jì)
單片機(jī)的第9腳RST為硬件復(fù)位端,只要將該端持續(xù)4個(gè)機(jī)器周期的高電平即可實(shí)現(xiàn)復(fù)位,復(fù)位后單片機(jī)的各狀態(tài)都恢復(fù)到初始化狀態(tài),其電路圖如下所示:
圖3.5 按鍵復(fù)位電路
3.7 報(bào)警電路
利用程序來(lái)控制單片機(jī)某個(gè)口線的“高”電平或“低”電平,接上蜂鳴器就能發(fā)出聲音,若再利用延時(shí)程序控制“高”或“低”電平的持續(xù)時(shí)間,就能改變蜂鳴器鳴叫的時(shí)間。
本文設(shè)計(jì)如下圖所示。圖中利用單片機(jī)的I/O端口P1^6,單片機(jī)通過(guò)設(shè)定該端口的高、低電平使蜂鳴器發(fā)聲。
圖 3.6 發(fā)聲電路
3.8 74LS245引腳及功能
圖 3.7 74LS245引腳圖
74LS245是我們常用的芯片,用來(lái)驅(qū)動(dòng)led或者其他的設(shè)備,它是8路同相三態(tài)雙向總線收發(fā)器,可雙向傳輸數(shù)據(jù)。
74LS245還具有雙向三態(tài)功能,既可以輸出,也可以輸入數(shù)據(jù)。
當(dāng)80C51單片機(jī)的P0口總線負(fù)載達(dá)到或超過(guò)P0最大負(fù)載能力時(shí),必須接入74LS245等總線驅(qū)動(dòng)器。
當(dāng)片選端/E低電平有效時(shí),DIR=“0”,信號(hào)由 B 向 A 傳輸;(接收)
DIR=“1”,信號(hào)由 A 向 B 傳輸;(發(fā)送)當(dāng)/E為高電平時(shí),A、B均為高阻態(tài)。
3.9系統(tǒng)硬件連接原理總圖
圖2-6 系統(tǒng)硬件連接原理圖
3.10元器件清單
8位8段數(shù)碼管
1只;
AT89S52芯片
1只;
12MHz晶振
1只;
30PF瓷片電容
2只;
10UF電解電容
1只;
電阻1KΩ、200Ω、2.2KΩ
各一只;
按鍵BUTTON
13只;
三極管PNP
1只;
蜂鳴器
1只;
排阻471、102
各一只;
74LS245
一只
4 系統(tǒng)軟件設(shè)計(jì)4.1程序流程圖
圖4.1 程序流程圖
4.2源程序
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
/*-----------------------------------------------------------
共陽(yáng)極0-9的數(shù)碼管段碼
------------------------------------------------------------*/
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xc0};
/*-----------------------------------------------------------
變量定義
------------------------------------------------------------*/
sbit start=P3^6;
sbit reset=P3^7;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
sbit jia=P3^4;
sbit jian=P3^5;
sbit jia0=P3^0;
sbit jian0=P3^1;
bit action = 0;
uchar second=10,a[7]={0};
uchar timer0_count = 0;
uchar number=0;
uchar number_display = 0;
uchar k;
/*-----------------------------------------------------------
延時(shí)函數(shù)
------------------------------------------------------------*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
/*-----------------------------------------------------------
顯示函數(shù)
------------------------------------------------------------*/
void display(uchar number,uchar second)
{
P2 = 0x01;
P0 = table[second];
delay(1);
P2 = 0x02;
P0 = table[number];
delay(1);
P2 = 0x04;
P0 = table[a[0]];
delay(1);
P2 = 0x08;
P0 = table[a[1]];
delay(1);
P2 = 0x10;
P0 = table[a[2]];
delay(1);
P2 = 0x20;
P0 = table[a[3]];
delay(1);
P2 = 0x40;
P0 = table[a[4]];
delay(1);
P2 = 0x80;
P0 = table[a[5]];
delay(1);
}
/*-----------------------------------------------------------
搶答開(kāi)始按鍵檢測(cè)函數(shù)
------------------------------------------------------------*/
void start_keyscan()
{
while(start == 0)
{
key7=0;
display(number_display,second);
if(start == 1)
{
key7=1;
action = 1;
TR0 = 1;
}
}
}
/*-----------------------------------------------------------
搶答者按鍵檢測(cè)函數(shù)
------------------------------------------------------------*/
uchar key_scan8()
{
if(key1 == 0)
{
delay(8);
if(key1 == 0)
{
number = 1;
number_display = number;
}
}
if(key2 == 0)
{
delay(8);
if(key2 == 0)
{
number = 2;
number_display = number;
}
}
if(key3 == 0)
{
delay(8);
if(key3 == 0)
{
number = 3;
number_display = number;
}
}
if(key4 == 0)
{
delay(8);
if(key4 == 0)
{
number = 4;
number_display = number;
}
}
if(key5 == 0)
{
delay(8);
if(key5 == 0)
{
number = 5;
number_display = number;
}
}
if(key6 == 0)
{
delay(8);
if(key6 == 0)
{
number = 6;
number_display = number;
}
}
if(number_display != 0)
{
return number_display;
}
else
{
return 0;
}
}
/*-----------------------------------------------------------
搶答復(fù)位函數(shù)
------------------------------------------------------------*/
void reset_keyscan()
{
if(reset == 0)
{
delay(8);
if(reset == 0)
{
number_display = 0;
second=10;
}
}
}
/*-----------------------------------------------------------
主函數(shù)
------------------------------------------------------------*/
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
P2=0x00;
while(1)
{
reset_keyscan();
start_keyscan();
if(jia0==0)
{
delay(10);
while(jia0==0)
display(number_display,second);
second=second+1;
}
if(jian0==0)
{
delay(10);
while(jian0==0)
display(number_display,second);
second=second-1;
}
if(jia==0&&a[number-1]<9)
{
delay(10);
while(jia==0)
display(number_display,second);
a[number-1]=a[number-1]+1;
}
if(jian==0&&a[number-1]>0)
{
delay(10);
while (jian==0)
display(number_display,second);
a[number-1]=a[number-1]-1;
}
while(action)
{
while(!key_scan8()) //無(wú)人搶答
{
display(number_display,second);
if(second == 0)
{
second = 10;
break;
}
}
TR0 = 0;
key7=0;
delay(80);
display(number_display,second);
key7=1;
action = 0;
break;
}
display(number_display,second);
}
}
/*-----------------------------------------------------------
定時(shí)中斷
------------------------------------------------------------*/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timer0_count ++;
if(timer0_count == 20)
{
second --;
timer0_count = 0;
if(second==0)
{
key7=0;
delay(60);
key7=1;
}
}
}
|
|