Proteus仿真版本:proteus7.8
程序編譯器:keil4 / keil5
設(shè)計(jì)編號(hào):Q005
資料下載鏈接
功能說明:
(1) 按鍵輸入模塊,包括主持人時(shí)間加,時(shí)間減,開始搶答,新一輪4個(gè)按鍵和選手一號(hào)到八號(hào)共搶8答按鍵;
(2) 顯示模塊,可以搶答實(shí)現(xiàn)倒計(jì)時(shí)和顯示搶答選手編號(hào);
(3) 蜂鳴器模塊,用于倒計(jì)時(shí)提醒,倒計(jì)時(shí)開始后發(fā)出短暫的聲響,聲響持續(xù)的時(shí)間為0.5s左右。
概述
1.1 課程設(shè)計(jì)目的
(1) 綜合所學(xué)的單片機(jī)原理及接口技術(shù)等課程的理論知識(shí)完成本課程設(shè)計(jì);
(2) 學(xué)習(xí)并掌握基本電路設(shè)計(jì)與使用方法,單片機(jī)的編程與應(yīng)用方法;
(3) 提高綜合分析、解決實(shí)際問題的能力。
1.2 任務(wù)和要求
本設(shè)計(jì)是以搶答為出發(fā)點(diǎn)。考慮到依需設(shè)定限時(shí)回答的功能,利用AT89C51單片機(jī)及外圍接口實(shí)現(xiàn)的搶答系統(tǒng),利用單片機(jī)的定時(shí)器/計(jì)數(shù)器定時(shí)和記數(shù)的原理,將軟、硬件有機(jī)地結(jié)合起來,使得系統(tǒng)能夠正確地進(jìn)行計(jì)時(shí),同時(shí)使數(shù)碼管能夠正確地顯示時(shí)間。用開關(guān)做鍵盤輸出,發(fā)光二極管和蜂鳴器發(fā)出提示。同時(shí)系統(tǒng)能夠?qū)崿F(xiàn):在搶答中,只有開始后搶答才有效,如果在開始搶答前搶答為無效;在軟件中還應(yīng)用了外部中斷,通過中斷解除搶答的鎖存,似的設(shè)計(jì)更加靈活,實(shí)用性更強(qiáng)。
本設(shè)計(jì)主要設(shè)計(jì)指標(biāo):
(1) 按鍵輸入模塊,包括主持人時(shí)間加,時(shí)間減,開始搶答,新一輪4個(gè)按鍵和選手一號(hào)到八號(hào)共搶8答按鍵;
(2) 顯示模塊,可以搶答實(shí)現(xiàn)倒計(jì)時(shí)和顯示搶答選手編號(hào)。
(3) 蜂鳴器模塊,用于倒計(jì)時(shí)提醒,倒計(jì)時(shí)開始后發(fā)出短暫的聲響,聲響持續(xù)的時(shí)間為0.5s左右。
1.3 系統(tǒng)結(jié)構(gòu)圖
圖1 系統(tǒng)結(jié)構(gòu)圖
主持人控制搶答器時(shí)間加減和開始,設(shè)置好時(shí)間或者使用默認(rèn)時(shí)間后,按下開始按鍵即開始倒計(jì)時(shí),每倒計(jì)時(shí)一秒蜂鳴器短暫鳴0.5提醒選手。選手在開始搶答后按下各自的按鍵搶答,一旦按下會(huì)顯示選手編號(hào)。一輪搶答結(jié)束后,主持人按下新一輪即可進(jìn)入下一輪的搶答。
2理論分析與計(jì)算
倒計(jì)時(shí)主要應(yīng)用了51單片機(jī)的定時(shí)器,本設(shè)計(jì)應(yīng)用定時(shí)器產(chǎn)生50ms定時(shí)。以12Mhz的晶振來說,機(jī)器周期是1us,計(jì)滿TH0、TL0就需要216-1個(gè)數(shù),再來一個(gè)數(shù)就“溢出”產(chǎn)生中斷,一次溢出也就是65536us,約等于65.5ms,假若定時(shí)50ms需要一個(gè)預(yù)裝值(初值),總值-需要值=預(yù)裝值。預(yù)裝后,定時(shí)器從預(yù)裝值開始加值,定時(shí)器溢出中斷后,會(huì)重新從預(yù)裝值開始加值加到50ms就再產(chǎn)生中斷,從而達(dá)到了定時(shí)的目的。如果要定時(shí)1s就可以讓定時(shí)器中斷1000ms/50ms=20次。
3硬件設(shè)計(jì)
根據(jù)系統(tǒng)結(jié)構(gòu)圖,系統(tǒng)由:AT89C51最小系統(tǒng)、顯示模塊、按鍵模塊和蜂鳴器模塊組成。
3.1 AT89C51最小系統(tǒng)
AT89C51是美國(guó)ATMEL公司生產(chǎn)的低電壓,高性能CMOS8位單片機(jī),片內(nèi)含4k bytes的可反復(fù)擦寫的只讀程序存儲(chǔ)器和128 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器,期間采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲(chǔ)單元,功能強(qiáng)大的AT89C51單片機(jī)可靈活應(yīng)用于各種控制領(lǐng)域。
AT89C51提供以下標(biāo)準(zhǔn)功能:4k字節(jié)Flash閃速存儲(chǔ)器,128字節(jié)內(nèi)部RAM,32個(gè)I/O口線,兩個(gè)16位定時(shí)/計(jì)數(shù)器,一個(gè)5向量?jī)杉?jí)中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止CPU的工作,但允許RAM,定時(shí)/計(jì)數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位。
本系統(tǒng)中央控制器采用的單片機(jī)AT89C51,復(fù)位電路采用上電復(fù)位電路。外接的晶振為12MHz晶振。
圖2 AT89C51最小系統(tǒng)
3.2 顯示模塊
本次設(shè)計(jì)采用八段數(shù)碼管顯示,是四位一體共陰極數(shù)碼管,由四個(gè)八段數(shù)碼管集成,高電平點(diǎn)亮。在顯示上我們通常采用兩種方法:一種是靜態(tài)顯示,一種是動(dòng)態(tài)顯示。
靜態(tài)顯示是指每個(gè)數(shù)碼管的每一個(gè)段碼都由一個(gè)單片機(jī)的I/O端口進(jìn)行驅(qū)動(dòng),或者使用如BCD碼二-十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動(dòng)。靜態(tài)顯示的優(yōu)點(diǎn)是編程簡(jiǎn)單,顯示亮度高,缺點(diǎn)是占用I/O端口多,實(shí)際應(yīng)用時(shí)必須增加譯碼驅(qū)動(dòng)器進(jìn)行驅(qū)動(dòng),增加了硬件電路的復(fù)雜性。
LED數(shù)碼管動(dòng)態(tài)顯示接口是單片機(jī)中應(yīng)用最為廣泛的一種顯示方式之一,動(dòng)態(tài)顯示是將所有數(shù)碼管的8個(gè)顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個(gè)數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨(dú)立的I/O線控制,當(dāng)單片機(jī)輸出字形碼時(shí),單片機(jī)對(duì)位選通COM端電路的控制,所以我們只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形,沒有選通的數(shù)碼管就不會(huì)亮。通過分時(shí)輪流控制各個(gè)數(shù)碼管的的COM端,就使各個(gè)數(shù)碼管輪流受控顯示,這就是動(dòng)態(tài)顯示。
在輪流顯示過程中,每位數(shù)碼管的點(diǎn)亮?xí)r間為1~2ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實(shí)際上各位數(shù)碼管并非同時(shí)點(diǎn)亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會(huì)有閃爍感,動(dòng)態(tài)顯示的效果和靜態(tài)顯示是一樣的,但能夠節(jié)省大量的I/O端口,而且功耗更低。故本次設(shè)計(jì)采用動(dòng)態(tài)顯示方法。其原理圖如圖3所示。
圖3 顯示模塊
本設(shè)計(jì)使用74HC573來驅(qū)動(dòng)四位一體數(shù)碼管。74HC573的八個(gè)鎖存器都是透明的D型鎖存器,當(dāng)使能(LE)為高時(shí),Q輸出將隨數(shù)據(jù)(D)輸入而變。當(dāng)使能(LE)為低時(shí),輸出將鎖存在已建立的數(shù)據(jù)電平上。輸出控制不影響鎖存器的內(nèi)部工作,即老數(shù)據(jù)可以保持,甚至當(dāng)輸出被關(guān)閉時(shí),新的數(shù)據(jù)也可以置入。這種電路可以驅(qū)動(dòng)大電容或低阻抗負(fù)載,可以直接與系統(tǒng)總線接口并驅(qū)動(dòng)總線,而不需要外接口。特別適用于緩沖寄存器,I/O通道,雙向總線驅(qū)動(dòng)器和工作寄存器.573工作電壓在5V(VCC)左右最大7V最小2V,最大輸出電流為20MA,可用來驅(qū)動(dòng)發(fā)光二極管。
圖4 顯示電路驅(qū)動(dòng)電路
3.3鍵盤模塊
鍵盤是人機(jī)交互的接口,本設(shè)計(jì)中,我們采用獨(dú)立鍵盤。按鈕需要12個(gè),分別為8位搶答按鍵、開始搶答鍵、新一輪按鍵、搶答時(shí)間加鍵和搶答時(shí)間減鍵。當(dāng)按鍵按下,與主控芯片連接的端口被降為低電平,按鍵松開則也升為高電平。按鍵采用的是Tack Switch按鈕開關(guān),它具有自動(dòng)恢復(fù)的功能。當(dāng)我們按下按鈕時(shí),其中的接點(diǎn)接通,放開按鈕后,接點(diǎn)恢復(fù)為切斷。雖然Tack Switch有4個(gè)引腳,但實(shí)際上,其內(nèi)部只有一對(duì)a接點(diǎn),即其中兩個(gè)引腳是內(nèi)部相連通的,而另外兩個(gè)引腳內(nèi)部也是相連通的。
本設(shè)計(jì)中12個(gè)按鍵實(shí)現(xiàn)了搶答,時(shí)間調(diào)節(jié)等功能,獨(dú)立按鍵的引入使得體現(xiàn)了本設(shè)計(jì)的人性化,智能化,功能的強(qiáng)大。其電路分為主持人部分和選手部分。分別實(shí)現(xiàn)了控制、調(diào)節(jié)功能和搶答功能。其電路圖如圖4所示。
圖4 按鍵電路
3.4蜂鳴器模塊
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。 蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。
本設(shè)計(jì)采用電磁式蜂鳴器進(jìn)行。電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)。振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期性地振動(dòng)發(fā)聲。因此需要一定的電流才能驅(qū)動(dòng)它,單片機(jī)I/O引腳輸出的電流較小,單片機(jī)輸出的TTL電平基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路。如蜂鳴器電路圖5所示,蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負(fù)極接到三極管的發(fā)射極E,三極管的基極B經(jīng)過限流電阻R3后由單片機(jī)的beep引腳控制,當(dāng)beep輸出低電平時(shí),三級(jí)管QS截止,沒有電流流過線圈,蜂鳴器不發(fā)聲;當(dāng)beep輸出高電平時(shí),三級(jí)管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過程序控制beep腳的電平來使蜂鳴器發(fā)出聲音和關(guān)閉。其電路圖如圖5所示。
圖5 蜂鳴器電路
軟件設(shè)計(jì)
當(dāng)接通電源開始工作后,單片機(jī)中的程序開始運(yùn)行,將對(duì)程序進(jìn)行初始化,以便和單片機(jī)芯片達(dá)成通信協(xié)議。完成初始化后,將進(jìn)行鍵盤掃描,同時(shí)判斷開始按鍵、調(diào)節(jié)按鍵是否按下。最后完成倒計(jì)時(shí)和選手號(hào)碼的顯示。系統(tǒng)流程圖如圖6所示。
圖6 系統(tǒng)流程框圖
根據(jù)系統(tǒng)軟件設(shè)計(jì)要求將軟件劃分為:主程序、顯示子程序、按鍵子程序、蜂鳴器子程序
4.1 主程序
主程序完成外部中斷初始化、定時(shí)器初始化、蜂鳴器模塊初始化。主程序掃描主持人不斷掃描按鍵,進(jìn)行對(duì)應(yīng)的操作。
進(jìn)入主程序后,顯示顯示預(yù)設(shè)的倒計(jì)時(shí)數(shù)字20,程序掃描主持人按鍵倒計(jì)時(shí)加減鍵和開始按鍵。按下開始按鍵后,倒計(jì)時(shí)開始工作,實(shí)時(shí)刷新倒計(jì)時(shí)數(shù)字,每倒計(jì)時(shí)1秒蜂鳴器beep引腳拉低0.5秒,蜂鳴器短鳴0.5秒。在掃描到選手按下按鍵后,倒計(jì)時(shí)定時(shí)器停止工作,顯示選手編號(hào)和按下?lián)尨疰I的時(shí)間。
主要(關(guān)鍵)代碼:
EA=1;
EX0=1;//外部中斷0
IT0=1;//設(shè)置下降沿觸發(fā)中斷0
TMOD=0x11;
TH0=(65536-50000)/256;//這是50ms的
TL0=(65536-50000)%256;
ET0=1;
TR0=0;
TH1=(65536-50000)/256;//這是50ms的
TL1=(65536-50000)%256;
ET1=1;
TR1=1;
time=20; //定時(shí)時(shí)間
num=0; //選手編號(hào)
flag=0; //搶答模式標(biāo)志位
beep=0;//蜂鳴器為0 不響
此段程序是完成外部中斷初始化、定時(shí)器初始化、蜂鳴器模塊初始化。完成后進(jìn)入大循環(huán)。
TempData[2]=dofly_DuanMa[time/10];
//分解顯示信息,如要顯示68,則68/10=6 68%10=8
TempData[3]=dofly_DuanMa[time%10];
if(num!=0)
m=1;
if(start==0)
{
DelayMs(10);
if(start==0)
{
flag=1;
while(!start);
}
}
這段函數(shù)完成了倒計(jì)時(shí)的顯示和掃描是否開始倒計(jì)時(shí)。在沒有開始搶答時(shí),選手按下按鍵會(huì)顯示選手編號(hào)和清零時(shí)間,一起防止選手搶答。開始搶答后,標(biāo)志位flag變?yōu)?。開始執(zhí)行按鍵掃描函數(shù)check2();
void check1()
{
if(num==1)
{
TempData[0]=dofly_DuanMa[num/10];
//分解顯示信息,如要顯示68,則68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
beep=0;
Display(0,8); //數(shù)碼管顯示函數(shù)
TR0=0;
while(m);
}
假如按鍵1按下,會(huì)顯示選手編號(hào)。同時(shí)程序會(huì)卡在while(m);循環(huán)。此時(shí)除了新一輪按鍵之外的任何按鍵都系統(tǒng)沒有任何變化。
oid restart() interrupt 0//按鍵中斷處理函數(shù) 新一輪
{
m = 0;
num = 0;
TR0 = 0;
flag = 0;
time = 23;
TempData[0] = 0;
TempData[1] = 0;
TempData[2] = 0;
TempData[3] = 0;
}
新一輪按鍵是外部中斷0,即使程序一直在執(zhí)行while(m)循環(huán),按下按鍵后,程序會(huì)執(zhí)行一次中斷函數(shù),將變量清零,函數(shù)重新執(zhí)行按鍵掃描。
4.2 按鍵掃描子函數(shù)
關(guān)鍵代碼介紹
if(key1==0)
{
DelayMs(10);
if(key1==0)
{
num=1;
while(!key1);
}
}
程序一直判斷按鍵引腳電壓,按下按鍵電壓為0。按鍵會(huì)產(chǎn)生抖動(dòng),需要進(jìn)行消抖處理,演示10毫秒后,如果按鍵電壓還是0,令按鍵數(shù)目num為1。表示按下的按鍵是按鍵1。供主函數(shù)處理按鍵消息。
4.3顯示子程序
關(guān)鍵代碼介紹
/*------------------------------------------------
顯示函數(shù),用于動(dòng)態(tài)掃描數(shù)碼管
輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個(gè)數(shù)碼管開始顯示
如輸入0表示從第一個(gè)顯示。
Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
DataPort=0; //清空數(shù)據(jù),防止有交替重影
DUAN=1; //段鎖存
DUAN=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
WEI=1; //位鎖存
WEI=0;
DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
DUAN=1; //段鎖存
DUAN=0;
DelayMs(2); // 掃描間隙延時(shí),時(shí)間太長(zhǎng)會(huì)閃爍,太短會(huì)造成重影
}
}
該函數(shù)用于動(dòng)態(tài)掃描數(shù)碼管。輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個(gè)數(shù)碼管開始顯示,如輸入0表示從第一個(gè)顯示。 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2。顯示主要控制74HC573鎖存數(shù)據(jù)。先清除數(shù)據(jù),清段鎖存。然后選擇位碼。開位鎖存將數(shù)據(jù)存在位鎖存器,選擇到了需要顯示的數(shù)碼管。位鎖存完成后將數(shù)據(jù)寫進(jìn)段鎖存數(shù)據(jù),將需要顯示的數(shù)據(jù)寫到數(shù)碼管中。
4.4蜂鳴器提示子函數(shù)
蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負(fù)極接到三極管的發(fā)射極E,三極管的基極B經(jīng)過限流電阻R3后由單片機(jī)的beep引腳控制,當(dāng)beep輸出低電平時(shí),三級(jí)管QS截止,沒有電流流過線圈,蜂鳴器不發(fā)聲;當(dāng)beep輸出高電平時(shí),三級(jí)管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過程序控制beep腳的電平來使蜂鳴器發(fā)出聲音和關(guān)閉。
void timer_t0() interrupt 1
{
TH0=(65536-50000)/256;//這是50ms的
TL0=(65536-50000)%256;
t++;
beep=0;
if(t==20)//設(shè)置為20,就是1s為高1s為低
{
beep=1;
t=0;
time--;
TempData[2]=dofly_DuanMa[time/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
TempData[3]=dofly_DuanMa[time%10];
if(time<=0)
{
time=0;
}
}
}
在50ms一次的定時(shí)器0中斷中,每10次中斷令蜂鳴器置零。第20次中斷令蜂鳴器置一。以此產(chǎn)生0.5s短暫提醒。
5 PROTEUS EDA仿真測(cè)試
5.1 PROTEUS EDA仿真圖繪制
圖 7仿真圖
5.2 測(cè)試
1.初始化。
? 圖8 初始化
2.未按下開始搶答鍵,選手搶答無效。
圖9 搶答無效
3.按下開始搶答鍵,進(jìn)入搶答倒計(jì)時(shí)。
圖10 搶答倒計(jì)時(shí)
3.有選手按下?lián)尨疰I,顯示選手號(hào)碼及剩余時(shí)間。
圖11 搶答成功
6 總結(jié)以及展望
在硬件電路焊接和軟件程序設(shè)計(jì)分別完成的基礎(chǔ)之上,進(jìn)行軟硬件的結(jié)合與調(diào)試。通過下載將在電腦上已完成的程序下載到單片機(jī)芯片中。在調(diào)試中發(fā)現(xiàn)軟件中存在的問題,及時(shí)解決問題,確保系統(tǒng)能正常工作并達(dá)到設(shè)計(jì)要求。通過反復(fù)的調(diào)試與實(shí)驗(yàn),可以證明該系統(tǒng)能夠較好地完成設(shè)計(jì)所需的基本要求。即能夠正確的完成搶答器預(yù)期功能。
在完成系統(tǒng)時(shí)我們遇到了很多困難,從一開始電路設(shè)計(jì)不夠優(yōu)化導(dǎo)致蜂鳴器不能正常發(fā)聲,到后來查閱資料一點(diǎn)點(diǎn)豐富我們的設(shè)計(jì)。在整個(gè)設(shè)計(jì)過程中,我們充分發(fā)揮團(tuán)隊(duì)精神,分工合作,發(fā)揮人的主觀能動(dòng)性,自主學(xué)習(xí),學(xué)到了許多沒學(xué)到的知識(shí),較好的完成了作品。相互學(xué)習(xí)、相互討論研究,共同進(jìn)步,完了最初的設(shè)想。
在電路焊接時(shí)雖然沒什么大問題,但從中也知道了焊接在整個(gè)作品中的重要性,電路工程量大,不能心急,一個(gè)個(gè)慢慢來不能急于求成。反而達(dá)到事半功倍的效果。對(duì)電路的設(shè)計(jì)、布局要先有一個(gè)好的構(gòu)思,才顯得電路板美觀、大方。
程序編寫中,由于思路不清晰,開始時(shí)遇到了很多的問題,經(jīng)過靜下心來思考,和同組員的討論,理清了思路,反而得心應(yīng)手。在此次設(shè)計(jì)中,知道了做凡事要有一顆平常的心,不要想著走捷徑,一步一個(gè)腳印。
此次比賽也練就了我們的耐心,讓我們認(rèn)識(shí)到了學(xué)習(xí)基礎(chǔ)知識(shí)的重要性,當(dāng)設(shè)計(jì)完整的系統(tǒng)時(shí),要考慮到硬件和軟件兩者的結(jié)合,有時(shí)硬件的不足,我們可以用軟件程序來彌補(bǔ),從而節(jié)約硬件成本,在設(shè)計(jì)軟件程序時(shí)要模塊化,可以提高程序的可讀性??傊?,通過此次單片機(jī)課程設(shè)計(jì)我們的能力得到了全方位的提高。
設(shè)計(jì)資料
資料下載鏈接見文章開頭