基于51單片機(jī)的八路搶答器設(shè)計(jì)(1)
基于51單片機(jī)的八路搶答器設(shè)計(jì)(1),基于,51,單片機(jī),八路,搶答,設(shè)計(jì)
宜賓職業(yè)技術(shù)學(xué)院電子信息工程系 基于單片機(jī)八路搶答器的設(shè)計(jì)與制作
基于單片機(jī)八路搶答器的設(shè)計(jì)與制作
摘 要
本設(shè)計(jì)主要以AT89C52單片機(jī)為核心控制元件,設(shè)計(jì)一個(gè)簡(jiǎn)易的八路搶答器。本方案以AT89C52單片機(jī)作為主控核心,與數(shù)碼管、蜂鳴器等構(gòu)成八路搶答器,利用了單片機(jī)的延時(shí)電路、按鍵復(fù)位電路、時(shí)鐘電路、定時(shí)/中斷等電路,設(shè)計(jì)的搶答器具有實(shí)時(shí)顯示搶答選手的號(hào)碼和搶答時(shí)間的特點(diǎn),還有復(fù)位電路,使其再開始新的一輪答題和比賽,同時(shí)還利用C語言編程,使其實(shí)現(xiàn)一些基本的功能。本設(shè)計(jì)的系統(tǒng)擴(kuò)展功能強(qiáng)、判斷精確、操作簡(jiǎn)單,具有良好的使用價(jià)值。
關(guān)鍵字:搶答器;單片機(jī);數(shù)碼管
8 is based on single chip vies to answer first the design and production
Abstract
This design mainly by AT89C52 single chip microcomputer as the core control elements, design a simple 8 vies to answer first device. This plan to AT89C52 single chip microcomputer as control core, and digital pipe, made the buzzer 8 vies to answer first, use of the single chip computer the delay of the circuit, key reset circuit, clocking circuit and timing/interrupt circuits, etc, the design of vies to answer first instruments have real-time display vies to answer first player number and the characteristics of the time vies to answer first, and reset circuit, the new round of begin again answer and games, and also using C language program, make its realize some basic functionality. The design of the system function expansion of strong, judge accurate and simple operation, good use value.
Key word: vies to answer first device; Single chip microcomputer; Digital tube
目 錄
1引 言 1
2總體方案設(shè)計(jì) 2
2.1 方案論證 2
2.2 方案比較 3
2.3 方案選擇 3
3 系統(tǒng)硬件設(shè)計(jì) 4
3.1 搶答器的設(shè)計(jì)原理 4
3.2 主控芯片的介紹 4
3.2.1時(shí)鐘電路的設(shè)計(jì) 5
3.2.2復(fù)位電路的設(shè)計(jì) 5
3.3 搶答電路的設(shè)計(jì) 6
3.4 顯示電路的設(shè)計(jì) 7
3.5 報(bào)警電路的設(shè)計(jì) 8
4 系統(tǒng)軟件設(shè)計(jì) 10
4.1 軟件設(shè)計(jì)思路 10
4.2 主程序設(shè)計(jì) 11
4.3 子程序設(shè)計(jì) 12
4.3.1 按鍵程序設(shè)計(jì) 14
4.3.2 顯示程序設(shè)計(jì) 18
4.3.3 報(bào)警程序設(shè)計(jì) 19
5 電路板設(shè)計(jì) 20
5.1電路板的設(shè)計(jì) 20
5.2電路板的加工 21
6 系統(tǒng)調(diào)試 22
6.1調(diào)試工具 22
6.2系統(tǒng)軟件調(diào)試 22
6.3系統(tǒng)硬件調(diào)試 23
結(jié) 論 24
總結(jié)與體會(huì) 25
致 謝 26
參考文獻(xiàn) 27
附 錄
附圖1 搶答器原理圖
附圖2元器件清單
附圖3答器PCB圖
附圖4實(shí)物圖
28
基于單片機(jī)八路搶答器的設(shè)計(jì)與制作
1引 言
在這個(gè)競(jìng)爭(zhēng)激烈的社會(huì)中,知識(shí)競(jìng)賽,評(píng)選優(yōu)勝,選拔人才之類的活動(dòng)愈加頻繁。在競(jìng)賽中,都是多個(gè)選手一起參加,如果采用舉手回答問題的這個(gè)方式來進(jìn)行競(jìng)賽已經(jīng)不適應(yīng)社會(huì)的需要。并且在主持人提出問題的時(shí)候,如果讓選手用舉手的方法來進(jìn)行搶答,這樣會(huì)很不公平。而在當(dāng)今社會(huì),比賽要追求準(zhǔn)確、公正、直觀地判斷出第一位搶答者,這時(shí)候智能搶答器就派上用場(chǎng)了。
智能搶答器是一種應(yīng)用十分廣泛的設(shè)備,在各種競(jìng)賽、搶答場(chǎng)合中,它都能客觀、迅速地判別出最先獲得發(fā)言權(quán)的選手。早期的搶答器只是由幾個(gè)三極管、可控硅、發(fā)光管等器件組成的,能通過發(fā)光管的指示辯認(rèn)出選手號(hào)碼。現(xiàn)在大多數(shù)智能搶答器都由單片機(jī)或數(shù)字集成電路構(gòu)成的,并且新增了許多功能,如選手號(hào)碼顯示,搶按前或搶按后的計(jì)時(shí),選手得分顯示等功能。
本設(shè)計(jì)采用AT89C52單片機(jī)作為整個(gè)控制核心。八路搶答器主要由時(shí)鐘電路、復(fù)位電路、報(bào)警電路、顯示電路、控制電路、搶答電路組成。工作時(shí),用按鍵通過開關(guān)電路輸入各路的搶答信號(hào),經(jīng)單片機(jī)的處理, 輸出控制信號(hào),這就是利用單片機(jī)控制的智能搶答器設(shè)計(jì)。
2 總體方案設(shè)計(jì)
2.1 方案論證
根據(jù)設(shè)計(jì)要求,有如下兩種方案:
方案一:搶答器系統(tǒng)的各部分均采用中小規(guī)模集成數(shù)字電路,利用硬件電子元器件實(shí)現(xiàn),用機(jī)械開關(guān)按鈕作為控制開關(guān),完成搶答輸入信號(hào)的觸發(fā)。該方案的特點(diǎn)是中小規(guī)模集成電路應(yīng)用技術(shù)成熟,性能可靠,能方便地完成選手搶答的基本功能,沒有軟件的設(shè)計(jì)部分,不需要編程。但是,電路結(jié)構(gòu)復(fù)雜,調(diào)試?yán)щy,涉及到的外圍元器件很多,造成搶答器的成本較高,并且制作過程工序比較煩瑣,不便于安裝與調(diào)試,給實(shí)際操作帶來很大的麻煩。
該方案的電路主要是由搶答開關(guān)電路、觸發(fā)電路、觸發(fā)鎖存電路、編碼器、八段顯示譯碼器等部分構(gòu)成。其結(jié)構(gòu)復(fù)雜,電路繁瑣,容易出現(xiàn)因?qū)Ь€連接混亂而引起的短路等故障問題。如圖2.1所示。
圖2.1 數(shù)字電路搶答器的控制結(jié)構(gòu)框圖
方案二:采用AT89C52單片機(jī)為核心控制元件。由發(fā)光二極管、數(shù)碼管、蜂鳴器等構(gòu)成八路搶答器,利用了單片機(jī)的延時(shí)電路、按鍵時(shí)鐘電路、復(fù)位電路、報(bào)警電路、顯示電路、控制電路、搶答電路,設(shè)計(jì)的搶答器具有實(shí)時(shí)顯示搶答選手的號(hào)碼和搶答時(shí)間的特點(diǎn),還有復(fù)位電路,使其再開始新的一輪的答題和比賽,同時(shí)還利用C語言編程,使其實(shí)現(xiàn)一些基本的功能。如圖2.2所示。
圖2.2 單片機(jī)搶答器設(shè)計(jì)方案
2.2 方案比較
方案一電路結(jié)構(gòu)復(fù)雜,可靠性不高,功能也比較簡(jiǎn)單,特別是當(dāng)搶答路數(shù)很多時(shí),實(shí)現(xiàn)起來就更為困難。在調(diào)試過程中也比較困難,涉及到的外圍元器件很多,造成搶答器的成本較高,并且制作過程工序比較煩瑣,不便于安裝與調(diào)試,給實(shí)際操作帶來很大的麻煩。方案二由于使用單片機(jī),使其技術(shù)比較成熟,應(yīng)用起來方便、簡(jiǎn)單并且單片機(jī)周圍的輔助電路也比較少,便于控制和實(shí)現(xiàn)。整個(gè)系統(tǒng)具有極其靈活的可編程性,能方便地對(duì)系統(tǒng)進(jìn)行功能的擴(kuò)張和更改性。并且單片機(jī)具有結(jié)構(gòu)簡(jiǎn)單、可靠性高、功能強(qiáng)大、實(shí)用性強(qiáng)、優(yōu)異的性能價(jià)格比等特點(diǎn)。
2.3 方案選擇
綜上所述,我的設(shè)計(jì)采用方案二。以單片機(jī)為核心的新型智能搶答器,在保留原始搶答器的基本功能的同時(shí)又增加了數(shù)碼管顯示電路實(shí)現(xiàn)了其它功能。
3 系統(tǒng)硬件設(shè)計(jì)
3.1 搶答器的工作原理
本系統(tǒng)采用單片機(jī)作為整個(gè)控制核心??刂葡到y(tǒng)主要由:顯示模塊、控制模塊、報(bào)警模塊、搶答模塊組成。工作時(shí),該系統(tǒng)通過矩陣鍵盤輸入搶答信號(hào),經(jīng)單片機(jī)的處理后,輸出控制信號(hào),利用一個(gè)4位數(shù)碼管來完成顯示功能并伴隨蜂鳴器報(bào)警,用按鍵來讓選手進(jìn)行搶答,在數(shù)碼管上顯示哪一組先答題,從而實(shí)現(xiàn)整個(gè)搶答過程。
當(dāng)主持人按下開始鍵時(shí),向單片機(jī)P3.2引腳輸入一個(gè)低電平信號(hào),表示整個(gè)電路開始工作,此時(shí)數(shù)碼管前兩位顯示選手編號(hào)(無人搶答顯示00),后兩位顯示倒計(jì)時(shí)剩余時(shí)間。若在25秒內(nèi)仍然無人搶答,蜂鳴器在最后5秒發(fā)出連續(xù)報(bào)警,提示搶答時(shí)間快要結(jié)束;若在30秒內(nèi)有人搶答,并且搶答成功,則將選手編號(hào)顯示在數(shù)碼管前兩位上,后兩位顯示搶答剩余時(shí)間,同時(shí)蜂鳴器發(fā)出一聲報(bào)警,提示其他沒有搶答的選手此題已被人搶答成功。若在搶答過程中遇見特殊情況,主持人則可以通過時(shí)間加,時(shí)間減按鍵來進(jìn)行時(shí)間調(diào)節(jié)。若要開始新的一輪搶答,主持人按下復(fù)位鍵再按開始鍵即可。
此次用單片機(jī)控制的搶答器思路簡(jiǎn)單明了,可操作性強(qiáng),可靠性高,擴(kuò)展功能強(qiáng),能夠完全實(shí)現(xiàn)普通搶答器的基本功能。
3.2主控芯片的介紹
AT89C52是一個(gè)低功耗、高性能的單片機(jī),40個(gè)引腳,32個(gè)外部雙向輸入/輸出(I/O)端口,同時(shí)內(nèi)含2個(gè)外中斷口,2個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,AT89C52可以按照常規(guī)方法進(jìn)行編程,也可以在線編程。其將通用的微處理器和Flash存儲(chǔ)器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲(chǔ)器可有效地降低開發(fā)成本。主要管腳有:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出端口,外接12MHz 晶振;RST(9 腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路;VCC(40 腳)和VSS(20 腳)為供電端口,分別接+5V電源的正負(fù)端;P0~P2 為可編程通用I/O 腳,其功能用途由軟件定義。如圖3.2所示。
3.2.1 時(shí)鐘電路的設(shè)計(jì)
內(nèi)部時(shí)鐘方式就是利用單片機(jī)芯片內(nèi)部的振蕩器,通過在引腳XTALl和XTAL2兩端跨接晶體振蕩器,構(gòu)成穩(wěn)定的自激振蕩器的方法,再由獲得的自激振蕩器發(fā)出穩(wěn)定的脈沖,直接送入芯片內(nèi)部的時(shí)鐘電路的方式??缃拥木w振蕩器如果已經(jīng)起振,則會(huì)向XTAL2引腳上輸出一定幅值的正弦波。自激振蕩器的頻率取決于晶體振蕩器的頻率,常見的晶體振蕩器頻率有6MHz和12MHz。AT89C52單片機(jī)的時(shí)鐘頻率最高可為24Mz。時(shí)鐘電路如圖3.2.1所示。
圖3.2.1 時(shí)鐘電路圖
3.2.2 復(fù)位電路的設(shè)計(jì)
復(fù)位電路是必不可少的一部分。單片機(jī)在啟動(dòng)運(yùn)行時(shí)都需要進(jìn)行復(fù)位操作,以便使CPU和系統(tǒng)中的其它部件都處于某一確定的初始狀態(tài),并從這個(gè)狀態(tài)開始工作。AT89C52單片機(jī)有一個(gè)引腳RST,它是施密特觸發(fā)器的輸入端,其輸出端接復(fù)位電路的輸入。復(fù)位信號(hào)是高電平有效,其有效時(shí)間應(yīng)持續(xù)24個(gè)振蕩脈沖周期(即二個(gè)機(jī)器周期)以上,若使用頻率為6MHz的晶振,則復(fù)位信號(hào)持續(xù)時(shí)間應(yīng)超過4μs才能完成復(fù)位操作。
復(fù)位電路有上電復(fù)位和手動(dòng)復(fù)位兩種。手動(dòng)復(fù)位又有電平方式和脈沖方式兩種。在本次設(shè)計(jì)中,為了方便操作,采用手動(dòng)復(fù)位的電平復(fù)位。其復(fù)位電路連接圖如圖3.2.2所示:
圖3.2.2 復(fù)位電路
3.3搶答電路的設(shè)計(jì)
按照鍵盤與單片機(jī)的連接方式可分為獨(dú)立式鍵盤與矩陣式鍵盤。獨(dú)立式鍵盤是一種常見的輸入裝置,但是獨(dú)立式鍵盤局限于個(gè)數(shù),以及占用較多I/O口,所以本次設(shè)計(jì)采用的是矩陣式鍵盤。如圖3.3所示。
圖3.3 搶答電路
矩陣鍵盤行掃描實(shí)現(xiàn)原理:
判斷鍵盤中有無鍵按下:將全部行線P1.0和P1.1置于低電平,然后檢測(cè)列線的狀態(tài)。只要有一列為低電平,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根列線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
判斷閉合鍵所在的位置:在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
3.4 顯示電路的設(shè)計(jì)
在單片機(jī)應(yīng)用系統(tǒng)中,對(duì)于系統(tǒng)的運(yùn)行狀態(tài)和運(yùn)行結(jié)果,通常都需要直觀交互顯示出來。單片機(jī)應(yīng)用系統(tǒng)中最常用的顯示器有LED和LCD兩種。這兩種顯示器都可以顯示數(shù)字、字符及系統(tǒng)的狀態(tài),LED和LCD數(shù)碼顯示最為普遍,本設(shè)計(jì)采用的是更為環(huán)保的4位LED顯示器。
4位數(shù)碼管動(dòng)態(tài)顯示原理與實(shí)現(xiàn):
P0.0-P0.6端口接動(dòng)態(tài)數(shù)碼管的字形碼筆段,P2.0-P2.3端口接動(dòng)態(tài)數(shù)碼管的數(shù)位選擇端。4位數(shù)碼管的8個(gè)顯示筆劃"a,b,c,d,e,f,g,dp "的同名端連在一起,另外為每個(gè)數(shù)碼管的公共極COM增加位選端控制電路,位選端由獨(dú)立的I/O線控制,當(dāng)單片機(jī)輸出字形碼時(shí),所有數(shù)碼管都接收到相同的字形碼,但究竟是那個(gè)數(shù)碼管會(huì)顯示出字形,取決于單片機(jī)對(duì)位選端控制,所以我們只要將需要顯示的數(shù)碼管的選通控制打開,該位元就顯示出字形,沒有選通的數(shù)碼管就不會(huì)亮。就使各個(gè)數(shù)碼管輪流受控顯示,這也就是動(dòng)態(tài)顯示的原理。動(dòng)態(tài)顯示能夠節(jié)約大量的I/O口,而且功耗較低。如圖3-4所示。
圖3.4 顯示電路
3.5 控制電路
本控制電路采用4個(gè)獨(dú)立按鍵來控制搶答時(shí)間的加減,如圖3-5所示。
圖3.5 控制電路
控制電路的原理與實(shí)現(xiàn):
當(dāng)控制電路中K9-K12中有鍵被按下時(shí),對(duì)應(yīng)的I/O口被置為低電平,通過中斷程序?qū)崿F(xiàn)相對(duì)應(yīng)的功能。該電路采用獨(dú)立式按鍵,其原理簡(jiǎn)單明了。
3.6 報(bào)警電路
本搶答器的報(bào)警電路比較簡(jiǎn)單,只起提示選手的搶答成功信息及時(shí)間警告等少許功能,所以報(bào)警電路的核心元件采用一個(gè)蜂鳴器來實(shí)現(xiàn)報(bào)警。如圖3.6所示。
圖3.6 報(bào)警電路
4 系統(tǒng)軟件設(shè)計(jì)
4.1 定時(shí)中斷模塊
由于搶答器中需要顯示倒計(jì)時(shí)來提示選手們搶答時(shí)間,在規(guī)定時(shí)間進(jìn)行搶答,所以需要定時(shí)中斷模塊,當(dāng)時(shí)間小于6秒時(shí),搶答器需要提供警告,以及當(dāng)搶答時(shí)間結(jié)束時(shí),要關(guān)閉外部中斷,表示搶答結(jié)束,此時(shí)再有鍵按下?lián)尨鹌饕膊粫?huì)做出反應(yīng)。流程圖如圖4.1所示。
圖4.1 搶答器的定時(shí)中斷流程圖
程序:
EA=1;ET0=1; /*開啟總中斷源*/
EX0=1; /*啟動(dòng)外部中斷0*/
if(shijian==0)
{
TR0=0;TR2=0;TF2=0;
}
4.2 外部中斷模塊
搶答器的主要外部中斷來自于選手們的搶答,當(dāng)選手搶答時(shí),搶答器同時(shí)判斷被按下的鍵號(hào)并顯示在數(shù)碼管上,然后再數(shù)碼管上顯示剩余時(shí)間,同時(shí)關(guān)閉中斷,表示搶答結(jié)束,此時(shí)再有鍵按下?lián)尨鹌饕膊粫?huì)做出任何反應(yīng)。外部中斷流程圖如圖4.2所示。
圖4.2 外部中斷流程圖
程序:
void timer_2()interrupt 5
{
TH2=(65536-50000)/256;
TL2=(65536-50000)%256;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
TR2=0;
switch(temp)
{
case 0xee:{TR0=0;TF2=0;num=1;bj();red=1;huang=0;}break;
case 0xde:{TR0=0;TF2=0;num=2;bj();red=1;huang=0;}break;
case 0xbe:{TR0=0;TF2=0;num=3;bj();red=1;huang=0;}break;
case 0x7e:{TR0=0;TF2=0;num=4;bj();red=1;huang=0;}break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}}}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
TR2=0;
switch(temp)
{
case 0xed:{TR0=0;TF2=0;num=5;bj();red=1;huang=0;}break;
case 0xdd:{TR0=0;TF2=0;num=6;bj();red=1;huang=0;}break;
case 0xbd:{TR0=0;TF2=0;num=7;bj();red=1;huang=0;}break;
case 0x7d:{TR0=0;TF2=0;num=8;bj();red=1;huang=0;}break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}}}
4.3 報(bào)警模塊
報(bào)警模塊主要作用有兩個(gè),一是當(dāng)時(shí)間還剩5秒時(shí),蜂鳴器放出報(bào)警,以此提示選手們搶答時(shí)間將要結(jié)束;二是當(dāng)有選手第一時(shí)間搶答成功時(shí)發(fā)出報(bào)警聲,提示其他選手不必再搶答。報(bào)警程序流程圖如圖4.3所示。
圖4.3 報(bào)警程序流程圖
程序:
if(bb==1)
{
bb=0;
if(shijian==5)
{
speak=~speak;
}
if(shijian==4)
{
speak=~speak;
}
if(shijian==3)
{
speak=~speak;
}
if(shijian==2)
{
speak=~speak;
}
{if(shijian==1)
speak=~speak;}
4.4 控制模塊
控制模塊的主要作用是對(duì)搶答器的開始和復(fù)位功能進(jìn)行控制,主要由主持人來實(shí)現(xiàn)功能。當(dāng)開始鍵被按下時(shí),搶答器開始正常工作;當(dāng)搶答器停止工作時(shí),可以按下復(fù)位鍵使搶答器回到初始化狀態(tài)??刂瞥绦蛄鞒虉D如圖4.4所示。
圖4.4 控制程序流程圖
程序:
void keyscan()
{
if(sjia==0)
{
delay(5);
if(sjia==0)
{
shijian=shijian+1;
if(shijian==99)
{
shijian=0;
}}
while(!sjia);
}
if(sji==0)
{
delay(5);
if(sji==0)
{
shijian=shijian-1;
if(shijian==0)
{
hijian=30;
}}
while(!sji);
}
4.5 主程序模塊
主程序主要完成硬件初始化,子程序調(diào)用和程序間的切換,由于本設(shè)計(jì)要求搶答器具有開始、復(fù)位、搶答三種方式切換功能,所以主程序除了要進(jìn)行硬件部分的初始化以外還要進(jìn)行各個(gè)程序之間的調(diào)用和切換。主程序流程圖如圖4.5所示。
程序:
void main()
{
huang=0;red=0;EA=1;
TMOD=0x11;T2CON=0x01;
TH0=(65536-50000)/256;TL0=(65536-50000)%256;
TH1=(65536-5000)/256;TL1=(65536-5000)%256;
TH2=(65536-50000)/256;TL2=(65536-50000)%256;
ET0=1;TR0=0;ET1=1;TR1=1;ET2=1;TR2=0;IT0=1;EX0=1;IT1=1;
EX1=1;aa=0;bb=0;shijian=30;
while(1)
{
keyscan();
第5章 系統(tǒng)的仿真
5.1 搶答器Keil軟件的仿真
運(yùn)行程序,查找語法錯(cuò)誤,按照錯(cuò)誤提示修改程序,直到0錯(cuò)誤0警告為止程序語法調(diào)試成功,生成HEX文件加載進(jìn)電路。如圖5-1所示。
圖5-1 程序調(diào)試
5.2 搶答器protenus軟件的仿真
繪制搶答器的軟件仿真圖步驟分一下四步:
(1)查找所需要的元器件;
(2)根據(jù)電路圖進(jìn)行連線;
(3)是用來寫線所對(duì)應(yīng)的坐標(biāo);
(4)裝載keil生成和HEX文件進(jìn)行仿真。
通過以上步驟,來實(shí)現(xiàn)搶答器設(shè)計(jì)的仿真實(shí)現(xiàn)。
附錄一 原理圖
附錄2 源程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit speak=P3^4;
sbit huang=P3^0;
sbit red=P3^1;
sbit sjia=P3^6;
sbit sji=P3^7;
sbit kai=P3^0;
sbit fuwei=P3^1;
sbit kais=P3^2;
uchar num,temp,shijian,shi,ge,ashi,age,aa,tt,bb,i;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void bj()
{
for(i=0;i<110;i++)
{
speak=~speak; delay(6);
}
for(i=0;i<230;i++)
{
speak=~speak; delay(2);
}}
void keyscan()
{
if(sjia==0)
{
delay(5);
if(sjia==0)
{
shijian=shijian+1;
if(shijian==99)
{
shijian=0;
}}
while(!sjia);
}
if(sji==0)
{
delay(5);
if(sji==0)
{
shijian=shijian-1;
if(shijian==0)
{
shijian=30;
}}
while(!sji);
}}
void zhuanhuan()
{
shi=shijian/10; ge=shijian%10; ashi=num/10; age=num%10;
}
void sound()
{
speak=0;
}
void main()
{
huang=0;red=0;
EA=1;TMOD=0x11;T2CON=0x01;
TH0=(65536-50000)/256;TL0=(65536-50000)%256;
TH1=(65536-5000)/256;TL1=(65536-5000)%256;
TH2=(65536-50000)/256;TL2=(65536-50000)%256;
ET0=1;TR0=0;ET1=1;TR1=1;ET2=1;TR2=0;IT0=1;EX0=1;IT1=1;EX1=1;
aa=0;bb=0;shijian=30;
while(1)
{
keyscan();
}}
void int_0() interrupt 0
{
huang=1; TR0=1; TR2=1;
}
void timer_0() interrupt 1
{
TH0=(65536-50000)/256;TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;shijian--;
if(shijian==6)
{
red=1;huang=0sound();
}
if(shijian==0)
{
TR0=0;TR2=0;TF2=0;
}}}
void int_1() interrupt 2
{
shijian=30;num=0;TR0=0;TR2=0;
}
void timer_1() interrupt 3
{
TH1=(65536-5000)/256;TL1=(65536-5000)%256;
tt++;bb++;
if(tt==5)
tt=1;
zhuanhuan();
switch(tt)
{
case 1:P2=0xf4;P0=table[shi];break;
case 2:P2=0xf8;P0=table[ge];break;
case 3:P2=0xf1;P0=table[ashi];break;
case 4:P2=0xf2;P0=table[age];break;
default : ;
}
if(bb==1)
{
bb=0;
if(shijian==5)
{
speak=~speak;
}
if(shijian==4)
{
speak=~speak;
}
if(shijian==3)
{
speak=~speak;
}
if(shijian==2)
{
speak=~speak;
}
if(shijian==1)
{
speak=~speak;
}}}
void timer_2() interrupt 5
{
TH2=(65536-50000)/256;TL2=(65536-50000)%256;
P1=0xfe;temp=P1;temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);temp=P1;temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;TR2=0;
switch(temp)
{
case 0xee:{TR0=0;TF2=0;num=1;bj();red=1;huang=0;}break;
case 0xde:{TR0=0;TF2=0;num=2;bj();red=1;huang=0;}break;
case 0xbe:{TR0=0;TF2=0;num=3;bj();red=1;huang=0;}break;
case 0x7e:{TR0=0;TF2=0;num=4;bj();red=1;huang=0;}break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}}}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);temp=P1;
emp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;TR2=0;
switch(temp)
{
case 0xed:{TR0=0;TF2=0;num=5;bj();red=1;huang=0;}break;
case 0xdd:{TR0=0;TF2=0;num=6;bj();red=1;huang=0;}break;
case 0xbd:{TR0=0;TF2=0;num=7;bj();red=1;huang=0;}break;
case 0x7d:{TR0=0;TF2=0;num=8;bj();red=1;huang=0;}break;
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}}}}
收藏