單片機(jī)c語(yǔ)言實(shí)例
基于MCS-51系列單片機(jī)AT89S51的八路搶答器基于MCS-51系列單片機(jī)AT89S51的八路搶答器前言隨著現(xiàn)代電子電路的快速發(fā)展,以及電子行業(yè)對(duì)現(xiàn)有電子工程技術(shù)的不斷需求,特別是對(duì)實(shí)際操作實(shí)踐的電子人才的需求越來(lái)越多,所以加強(qiáng)學(xué)生動(dòng)手能力、重視實(shí)踐應(yīng)該是電子發(fā)展需求的必然趨向。實(shí)踐動(dòng)手能力的培養(yǎng)是一種綜合能力,這種能力當(dāng)然是在一定難度的前提下完成的,通過(guò)一定數(shù)量的實(shí)踐才能逐步形成的。因此在培養(yǎng)實(shí)踐能力的同時(shí),要通過(guò)實(shí)踐來(lái)不斷的發(fā)現(xiàn)問(wèn)題和解決問(wèn)題的途徑和方法,從而提高實(shí)踐能力。近年來(lái),隨著單片機(jī)檔次的不斷提高,功能的不斷完善,其應(yīng)用日趨成熟、應(yīng)用領(lǐng)域日趨擴(kuò)大,特別是工業(yè)測(cè)控、尖端武器和日用家電等領(lǐng)域更是因?yàn)橛辛藛纹瑱C(jī)而生輝增色。單片機(jī)應(yīng)用技術(shù)已成為一項(xiàng)新的工程應(yīng)用技術(shù)。本次實(shí)習(xí)設(shè)計(jì)的題目為基于單片機(jī)的搶答器。在本次的課程設(shè)計(jì)中我主要負(fù)責(zé)了該系統(tǒng)的印制電路板PCB的制作一、方案論證方案一:系統(tǒng)各部分采用中小規(guī)模集成數(shù)字電路,用機(jī)械開關(guān)按鈕作為控制開關(guān),完成搶答輸入信號(hào)的觸發(fā)。該方案的特點(diǎn)是中小規(guī)模集成電路應(yīng)用技術(shù)成熟,性能可靠,能方便地完成選手搶答的基本功能,但是由于系統(tǒng)功能要求較高,所以電路連接集成電路相對(duì)較多,而且過(guò)于復(fù)雜,并且制作過(guò)程工序比較煩瑣,使用不太方便。方案二:該系統(tǒng)采用MCS-51系列單片機(jī)AT89S51作為控制核心,該系統(tǒng)可以完成運(yùn)算控制、信號(hào)識(shí)別以及顯示功能的實(shí)現(xiàn)。由于用了單片機(jī),使其技術(shù)比較成熟,應(yīng)用起來(lái)方便、簡(jiǎn)單并且單片機(jī)周圍的輔助電路也比較少,便于控制和實(shí)現(xiàn)。整個(gè)系統(tǒng)具有極其靈活的可編程性,能方便地對(duì)系統(tǒng)進(jìn)行功能的擴(kuò)張和更改性。 CS-51單片機(jī)特點(diǎn)如下:1> 可靠性好:單片機(jī)按照工業(yè)控制要求設(shè)計(jì),抵抗工業(yè)噪聲干擾優(yōu)于一般的CPU ,程序指令和數(shù)據(jù)都可以燒寫在ROM許多信號(hào)通道都在同一芯片,因此可靠性高。2> 易擴(kuò)充:單片機(jī)有一般電腦所必須的器件,如三態(tài)雙向總線,串并行的輸入及輸出引腳,可擴(kuò)充為各種規(guī)模的微電腦系統(tǒng)3> 控制功能強(qiáng):單片機(jī)指令除了輸入輸出指令,邏輯判斷指令外還有更豐富的條件分支跳躍指令。原理框圖如1-1所示;圖1-1方案比較及其選用依據(jù),顯然方案二比方案一簡(jiǎn)單的多,不但從性能上優(yōu)于方案一,而且在使用上及其功能的實(shí)現(xiàn)上都較方案一簡(jiǎn)潔,并且由于單片機(jī)具有優(yōu)越的高集成電路性,使其工作速度更快、效率更高。另外AT89S51單片機(jī)采用12MHz的晶振,提高了信號(hào)的測(cè)量精度,并且使該系統(tǒng)可以通過(guò)軟件改進(jìn)來(lái)擴(kuò)張功能。而方案一采用了中小規(guī)模集成電路,有其復(fù)雜的電路性能,從而可能會(huì)使信號(hào)的輸入輸出產(chǎn)生延時(shí)及不必要的誤差。依此依據(jù)選擇方案二比較適合。二、原理分析1. 本電路采用單片機(jī)AT89C51作為控制芯片,單片機(jī)的P0口外接八個(gè)發(fā)光二極管,每個(gè)發(fā)光二極管分別作為八位選手的信號(hào)指示燈。并在各個(gè)外接電路上并接開關(guān)按鍵,按鍵另一端接地。發(fā)光二極管采用共陽(yáng)極接法,由于P0口為高電平呈輸入狀態(tài),當(dāng)有按鍵按下時(shí),P0口呈低電平與按鍵對(duì)應(yīng)的發(fā)光二極管滿足點(diǎn)亮條件點(diǎn)亮。在程序編程上采用查詢,查詢P0口P0。0到P0。7的八個(gè)端口呈低電平,即查詢是哪個(gè)選手先按鍵,然后將選手號(hào)碼的字節(jié)數(shù)據(jù)送至串行口輸出并在數(shù)碼管上顯現(xiàn)出來(lái)。2. 蜂鳴器是利用三極管處于開關(guān)狀態(tài)是的導(dǎo)通與截止工作,在三極管導(dǎo)通時(shí)蜂鳴器工作,三極管截止時(shí)蜂鳴器不工作。三極管采用8550 PNP型基極接于P1。2口置其低電平時(shí)三極管導(dǎo)通,置其高電平時(shí)三極管截止。3. 數(shù)碼管采用共陽(yáng)極七段顯示,其內(nèi)部發(fā)光二極管為共陽(yáng)極接高電平,當(dāng)對(duì)應(yīng)發(fā)光二極管一端為低電平時(shí)發(fā)光二極管點(diǎn)亮,顯示的數(shù)字或字符由送入的字節(jié)數(shù)據(jù)控制,字節(jié)數(shù)據(jù)的輸出采用串形口工作模式0,8位串行字節(jié)數(shù)據(jù)的輸出通過(guò)RXD端口送出,TXD端用于送出同步移位脈沖,作為外接器件的同步移位信號(hào)。數(shù)據(jù)的發(fā)送是在TI=0的情況下,由一寫發(fā)送緩沖器的指令開始CPU執(zhí)行完該指令,串行口即將8位數(shù)據(jù)從RXD端送出,同時(shí)TXD端發(fā)出同步移位脈沖。8位數(shù)據(jù)發(fā)送完畢后由硬件置位TI=1,通過(guò)查詢TI位來(lái)確定是否發(fā)送完一組數(shù)據(jù),TI=1表示發(fā)送緩沖器已空,當(dāng)要發(fā)送下一組數(shù)據(jù)時(shí)用軟件使TI清零,然后即可發(fā)送下一組數(shù)據(jù)。4. 軟件設(shè)計(jì)分析首先在程序的開始為選手設(shè)置了一段違規(guī)程序,該程序的作用是為了防止選手在主持人沒(méi)有按下?lián)尨疰I時(shí),有的選手已經(jīng)提前搶答了,本次搶答為無(wú)效搶答,并有報(bào)警和記錄下該位選手的選號(hào),做違規(guī)處理,如果選手超出了在規(guī)定的提前搶答次數(shù),則該選手將被取消以后的搶答資格。如果在主持按下?lián)尨疰I時(shí)再搶答,該次搶答被視為有效搶答,在主持按下回答問(wèn)題的鍵時(shí)選手就可以在規(guī)定的時(shí)間內(nèi)回答問(wèn)題了圖1-2<1> 選手查詢程序:ORG 0000HSTART:CLR AMOV A,#0FFHMOV P0,ALOP:JNB P2。4,LPJNB P0。0,SA1JNB P0。1,SA2JNB P0。2,SA3JNB P0。3,SA4JNB P0。4,SA5JNB P0。5,SA6JNB P0。6,SA7JNB P0。7,SA8SJMP LOPSA1:AJMP SB1SA2:AJMP SB2SA3:AJMP SB3SA4:AJMP SB4SA5:AJMP SB5SA6:AJMP SB6SA7:AJMP SB7SA8:AJMP SB8LP:MOV R0,#9LOP1:LCALL LEDLCALL DELJNB P0。0,SIP1JNB P0。1,SIP2JNB P0。2,SIP3JNB P0。3,SIP4JNB P0。4,SIP5JNB P0。5,SIP6JNB P0。6,SIP7JNB P0。7,SIP8DEC R0CJNE R0,#0,LOP1MOV R0,#0LCALL LEDLCALL DELSJMP LOPSIP1:AJMP DIP1SIP2:AJMP DIP2SIP3:AJMP DIP3SIP4:AJMP DIP4SIP5:AJMP DIP5SIP6:AJMP DIP6SIP7:AJMP DIP7SIP8:AJMP DIP8SB1:MOV R2,#1LCALL LED1LCALL DESJMP LP1SB2:MOV R2,#2LCALL LED1LCALL DESJMP LP1SB3:MOV R2,#3LCALL LED1LCALL DESJMP LP1SB4:MOV R2,#4LCALL LED1LCALL DESJMP LP1SB5:MOV R2,#5LCALL LED1LCALL DESJMP LP1SB6:MOV R2,#6LCALL LED1LCALL DESJMP LP1SB7:MOV R2,#7LCALL LED1LCALL DESJMP LP1SB8:MOV R2,#8LCALL LED1LCALL DESJMP LP1LP1:JNB P2。4,LOP2SJMP LP1DIP1:MOV R2,#1LCALL LED1LCALL DESJMP LH1DIP2:MOV R2,#2LCALL LED1LCALL DESJMP LH1DIP3:MOV R2,#3LCALL LED1LCALL DESJMP LH1DIP4:MOV R2,#4LCALL LED1LCALL DESJMP LH1DIP5:MOV R2,#5LCALL LED1LCALL DESJMP LH1DIP6:MOV R2,#6LCALL LED1LCALL DESJMP LH1DIP7:MOV R2,#7LCALL LED1LCALL DESJMP LH1DIP8:MOV R2,#8LCALL LED1LCALL DESJMP LH1LH1:JNB P2。4,LOOPSJMP LH1LOP2:MOV A,#11HMOV SBUF,AJNB TI,$CLR TILCALL DELAJMP LOP<2> 串行輸出程序:該部分程序的設(shè)計(jì)利用了單片機(jī)的串行模式0輸出,該輸出方式占用IO口少??梢允∪ピS多IO口作為功能的擴(kuò)展使用。在該模式下,我們采用了輸出查詢的方式,就是要借助發(fā)送標(biāo)志TI,當(dāng)程序執(zhí)行到發(fā)送標(biāo)志位時(shí),查詢其標(biāo)志位TI的值,只要TI的值是0程序就繼續(xù)查詢,知道查詢到TI為1時(shí)才結(jié)束,然后在進(jìn)入下一組數(shù)據(jù)的發(fā)送。由于串行輸出時(shí)送進(jìn)去的數(shù)都是十進(jìn)制數(shù),以致計(jì)算機(jī)不能識(shí)別,所以還要把送進(jìn)去的十進(jìn)制數(shù)轉(zhuǎn)化成而進(jìn)制數(shù),這樣才能輸出。因此在輸出程序前必須有拆字程序,把原來(lái)送進(jìn)去的十進(jìn)制數(shù)轉(zhuǎn)化成二進(jìn)制數(shù),然后在輸出并通過(guò)數(shù)碼管顯示出來(lái)。但是如果在顯示選手選號(hào)與顯示選手回答問(wèn)題所用的到計(jì)同用一段串行輸出程序時(shí)就會(huì)造成程序的混亂,所以在此處設(shè)計(jì)了兩段初始值不同的顯示程序,從而可能增加了程序的煩瑣化。LED1:MOV A,R2MOV B,#10DIV ABMOV R1,AMOV R3,BMOV A,R1MOV DPTR,#TABMOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIMOV A,R3MOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIRET。LED:MOV A,R0MOV B,#10DIV ABMOV R1,AMOV R3,BMOV A,R1MOV DPTR,#TABMOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIMOV A,R3MOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIRETDE:CLR P1。2LCALL DEL01SETB P1。2LCALL DEL01RETTAB:DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90HRETEND<3>倒計(jì)時(shí)程序該程序?yàn)檫x手回答問(wèn)題時(shí)的30秒倒計(jì)時(shí)程序,其中前25秒為正常的倒計(jì)時(shí),在后5秒倒計(jì)時(shí)時(shí)伴隨有報(bào)警聲,用于提示選手回答問(wèn)題的剩余時(shí)間。如果該選手在正常的倒計(jì)時(shí)內(nèi)沒(méi)有完成問(wèn)題的回答,那么倒計(jì)時(shí)將被清零。LOOP:MOV R0,#30LPP:LCALL LEDLCALL DELJNB P2。4,LOP2DEC R0CJNE R0,#5,LPPMOV R0,#5LPP1:JNB P2。4,LOP2LCALL LEDLCALL DEDEC R0CJNE R0,#0,LPP1MOV R0,#0LCALL LEDLCALL DELLJMP START<4>延時(shí)程序該系統(tǒng)設(shè)計(jì)了兩段延時(shí)程序,一段1秒延時(shí),是為了30秒倒計(jì)時(shí)調(diào)用和程序中一秒延時(shí)所用;另一段為0。5秒延時(shí),用于報(bào)警。程序的設(shè)計(jì)中報(bào)警時(shí)間為一秒,但是由于在硬件的設(shè)計(jì)時(shí)只設(shè)計(jì)了一個(gè)按鍵,這樣就會(huì)造成連續(xù)按鍵時(shí)會(huì)使所設(shè)定的報(bào)警聲不斷的響,這是設(shè)計(jì)中不允許的,所以在軟件編程時(shí)設(shè)計(jì)了一個(gè)0。5秒的延時(shí),被報(bào)警時(shí)所調(diào)用,這樣就使報(bào)警聲能很清楚地區(qū)分出來(lái)了DEL:MOV R6,#20 DEL01:MOV R6,#10DEL1:MOV R5,#100 DEL11:MOV R5,#100DEL2:MOV R4,#250 DEL21:MOV R4,#250DJNZ R4,$ DJNZ R4,$DJNZ R5,DEL2 DJNZ R5,DEL21DJNZ R6,DEL1 DJNZ R6,DEL11RET RET<5>報(bào)警程序該段程序主要是用于本系統(tǒng)中的所有報(bào)警使用,報(bào)警時(shí)間延時(shí)為1秒鐘。DE:CLR P1。2LCALL DEL01SETB P1。2LCALL DEL01RET三、制作過(guò)程五、參考文獻(xiàn)曾峰,鞏海洪,曾波,電子工業(yè)出版社,印刷電路板PCB設(shè)計(jì)與制作 2005.8梅海鳳,王艷秋,張軍,汪毓鐸,清華大學(xué)出版社 單片機(jī)原理與接口技術(shù) 2004.2北京交通大學(xué)出版社第二個(gè)文獻(xiàn):基于51單片機(jī)八路搶答器設(shè)計(jì)程序及電路圖基于51單片機(jī)八路搶答器設(shè)計(jì)程序及電路圖說(shuō)明:本人的這個(gè)設(shè)計(jì)改進(jìn)后解決了前一個(gè)版本中1號(hào)搶答優(yōu)先的問(wèn)題,并增加了錦囊的設(shè)置,當(dāng)參賽選手在回答問(wèn)題時(shí)要求使用錦囊,則主持人按下?lián)尨痖_始鍵,計(jì)時(shí)重新開始。;八路搶答器電路請(qǐng)看下圖是用ps仿真的,已經(jīng)測(cè)試成功<單片機(jī)八路搶答器電路圖>;============================================================;================單片機(jī)八路搶答器程序 =====================;================ 51hei =======================;================ 2008 年 5月 =======================;============================================================OK EQU 20H;搶答開始標(biāo)志位RING EQU 22H;響鈴標(biāo)志位ORG 0000HAJMP MAINORG 0003HAJMP INT0SUBORG 000BHAJMP T0INTORG 0013HAJMP INT1SUBORG 001BHAJMP T1INTORG 0040HMAIN: MOV R1,#30;初設(shè)搶答時(shí)間為30sMOV R2,#60;初設(shè)答題時(shí)間為60sMOV TMOD,#11H;設(shè)置未定時(shí)器/模式1MOV TH0,#0F0HMOV TL0,#0FFH;越高發(fā)聲頻率越高,越尖MOV TH1,#3CHMOV TL1,#0B0H;50ms為一次溢出中斷SETB EASETB ET0SETB ET1SETB EX0SETB EX1;允許四個(gè)中斷,T0/T1/INT0/INT1CLR OKCLR RINGSETB TR1SETB TR0;一開始就運(yùn)行定時(shí)器,以開始顯示FFF.如果想重新計(jì)數(shù),重置TH1/TL1就可以了;=====查詢程序=====START: MOV R5,#0BHMOV R4,#0BHMOV R3,#0BHACALL DISPLAY;未開始搶答時(shí)候顯示FFFJB P3.0,NEXT;dddddddACALL DELAYJB P3.0,NEXT;去抖動(dòng),如果"開始鍵"按下就向下執(zhí)行,否者跳到非法搶答查詢ACALL BARK;按鍵發(fā)聲MOV A,R1MOV R6,A;送R1->R6,因?yàn)镽1中保存了搶答時(shí)間SETB OK;搶答標(biāo)志位,用于COUNT只程序中判斷是否查詢搶答MOV R7,#01H ;讀搶答鍵數(shù)據(jù)信號(hào)標(biāo)志,這里表示只讀一次有用信號(hào)MOV R3,#0AH;搶答只顯示計(jì)時(shí),滅號(hào)數(shù)AJMP COUNT;進(jìn)入倒計(jì)時(shí)程序,"查詢有效搶答的程序"在COUNT里面NEXT: JNB P1.0,F(xiàn)ALSE1JNB P1.1,F(xiàn)ALSE2JNB P1.2,F(xiàn)ALSE3JNB P1.3,F(xiàn)ALSE4JNB P1.4,F(xiàn)ALSE5JNB P1.5,F(xiàn)ALSE6JNB P1.6,F(xiàn)ALSE7JNB P1.7,F(xiàn)ALSE8AJMP START;=====非法搶答處理程序=====FALSE1: MOV R3,#01HAJMP ERRORFALSE2: MOV R3,#02HAJMP ERRORFALSE3: MOV R3,#03HAJMP ERRORFALSE4: MOV R3,#04HAJMP ERRORFALSE5: MOV R3,#05HAJMP ERRORFALSE6: MOV R3,#06HAJMP ERRORFALSE7: MOV R3,#07HAJMP ERRORFALSE8: MOV R3,#08HAJMP ERROR;=====INT0搶答時(shí)間R1調(diào)整程序=====INT0SUB:MOV A,R1MOV B,#0AHDIV ABMOV R5,AMOV R4,BMOV R3,#0AHACALL DISPLAY;先在兩個(gè)時(shí)間LED上顯示R1JNB P3.4,INC0;P3.4為+1s鍵,如按下跳到INCOJNB P3.5,DEC0;P3.5為-1s鍵,如按下跳到DECOJNB P3.1,BACK0;P3.1為確定鍵,如按下跳到BACKOAJMP INT0SUBINC0: MOV A,R1CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。MOV R1,#00HACALL DELAY1AJMP INT0SUBADD0: INC R1ACALL DELAY1AJMP INT0SUBDEC0: MOV A,R1JZ SETR1;如果R1為0, R1就置99,DEC R1ACALL DELAY1AJMP INT0SUBSETR1: MOV R1,#63HACALL DELAY1AJMP INT0SUBBACK0: RETI;=====INT1回答時(shí)間R2調(diào)整程序=====INT1SUB:MOV A,R2MOV B,#0AHDIV ABMOV R5,AMOV R4,BMOV R3,#0AHACALL DISPLAYJNB P3.4,INC1JNB P3.5,DEC1JNB P3.1,BACK1AJMP INT1SUBINC1: MOV A,R2CJNE A,#63H,ADD1MOV R2,#00HACALL DELAY1AJMP INT1SUBADD1: INC R2ACALL DELAY1AJMP INT1SUBDEC1: MOV A,R2JZ SETR2DEC R2ACALL DELAY1AJMP INT1SUBSETR2: MOV R2,#63HACALL DELAY1AJMP INT1SUBBACK1: RETI;=====倒計(jì)時(shí)程序搶答倒計(jì)時(shí)和回答倒計(jì)時(shí)都跳到改程序=====REPEAT:MOV A,R2 ;使用錦囊時(shí)重新計(jì)時(shí)MOV R6,ACLR RINGCOUNT: MOV R0,#00H;重置定時(shí)器中斷次數(shù)MOV TH1,#3CHMOV TL1,#0B0H;重置定時(shí)器RECOUNT:MOV A,R6;R6保存了倒計(jì)時(shí)的時(shí)間,之前先將搶答時(shí)間或回答時(shí)間給R6MOV B,#0AHDIV AB;除十分出個(gè)位/十位MOV 30H,A;十位存于30HMOV 31H,B;個(gè)位存于31HMOV R5,30H;取十位MOV R4,31H;取個(gè)位MOV A,R6SUBB A,#07HJNC LARGER;大于5s跳到LARGER,小于等于5s會(huì)提醒MOV A,R0CJNE A,#0AH,F(xiàn)ULL;1s中0.5s向下運(yùn)行CLR RINGAJMP CHECKFULL: CJNE A,#14H,CHECK;下面是1s的情況,響并顯示號(hào)數(shù)并清R0,重新計(jì)SETB RINGMOV A,R6JZ QUIT;計(jì)時(shí)完畢MOV R0,#00HDEC R6;一秒標(biāo)志減1AJMP CHECKLARGER: MOV A,R0CJNE A,#14H,CHECK;如果1s向下運(yùn)行,否者跳到查"停/顯示"DEC R6;計(jì)時(shí)一秒R6自動(dòng)減1MOV R0,#00HCHECK: JNB P3.1,QUIT;如按下停止鍵退出JNB OK,CHECKK ;只在回答倒計(jì)時(shí)才有效AJMP NEXTTCHECKK:JNB P3.0,REPEAT ;判斷是否使用錦囊NEXTT: ACALL DISPLAYJB OK,ACCOUT;如果是搶答倒計(jì)時(shí),如是則查詢搶答,否者跳過(guò)查詢繼續(xù)倒數(shù)這里起到鎖搶答作用AJMP RECOUNTACCOUT:MOV A,36HJNB ACC.0,TRUE1JNB ACC.1,TRUE2JNB ACC.2,TRUE3JNB ACC.3,TRUE4JNB ACC.4,TRUE5JNB ACC.5,TRUE6JNB ACC.6,TZ1JNB ACC.7,TZ2AJMP RECOUNTTZ1:JMP TRUE7TZ2:JMP TRUE8QUIT: CLR OK;如果按下了"停止鍵"執(zhí)行的程序CLR RINGAJMP START;=====正常搶答處理程序=====TRUE1: ACALL BARKMOV A,R2MOV R6,A;搶答時(shí)間R2送R6MOV R3,#01HCLR OK;因?yàn)榇痤}的計(jì)時(shí)不再查詢搶答,所以就鎖了搶答AJMP COUNTTRUE2:ACALL BARKMOV A,R2MOV R6,AMOV R3,#02HCLR OKAJMP COUNTTRUE3:ACALL BARKMOV A,R2MOV R6,AMOV R3,#03HCLR OKAJMP COUNTTRUE4:ACALL BARKMOV A,R2MOV R6,AMOV R3,#04HCLR OKAJMP COUNTTRUE5:ACALL BARKMOV A,R2MOV R6,AMOV R3,#05HCLR OKAJMP COUNTTRUE6: ACALL BARKMOV A,R2MOV R6,AMOV R3,#06HCLR OKAJMP COUNTTRUE7:ACALL BARKMOV A,R2MOV R6,AMOV R3,#07HCLR OKAJMP COUNTTRUE8:ACALL BARKMOV A,R2MOV R6,AMOV R3,#08HCLR OKAJMP COUNT;=====犯規(guī)搶答程序=====ERROR: MOV R0,#00HMOV TH1,#3CHMOV TL1,#0B0HMOV 34H,R3;犯規(guī)號(hào)數(shù)暫存與34HHERE: MOV A,R0CJNE A,#06H,F(xiàn)LASH;0.3s向下運(yùn)行->滅并停響CLR RINGMOV R3,#0AHMOV R4,#0AHMOV R5,#0AH;三燈全滅AJMP CHECK1FLASH: CJNE A,#0CH,CHECK1;下面是0.8s的情況,響并顯示號(hào)數(shù)并清R0,重新計(jì)SETB RINGMOV R0,#00HMOV R3,34H;取回號(hào)數(shù)MOV R5,#0BHMOV R4,#0BH;顯示FF和號(hào)數(shù)AJMP CHECK1CHECK1: JNB P3.1,QUIT1ACALL DISPLAYAJMP HEREQUIT1: CLR RINGCLR OKAJMP START;=====顯示程序=====DISPLAY:MOV DPTR,#DAT1;查表顯示程序,利用P0口做段選碼口輸出/P2低三位做位選碼輸出,MOV A,R3MOVC A,@A+DPTRMOV P2,#0feHMOV P0,AACALL DELAY2MOV DPTR,#DAT2MOV A,R5MOVC A,@A+DPTRMOV P2,#0fdHMOV P0,AACALL DELAY2MOV A,R4MOVC A,@A+DPTRMOV P2,#0fbHMOV P0,AACALL DELAY2RETDAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H;"滅","1","2","3","4","5","6","7","8","9","滅","F"DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H;第一個(gè)為零,其他與上相同,因?yàn)槭蝗绻麨榱泔@示熄滅;====加減時(shí)間延時(shí)起到不會(huì)按下就加N個(gè)數(shù)======DELAY1: MOV 35H,#08HLOOP0: ACALL DISPLAYDJNZ 35H,LOOP0RET;=====延時(shí)4236個(gè)機(jī)器周期去抖動(dòng)用到=====DELAY: MOV 32H,#12HLOOP: MOV 33H,#0AFHLOOP1: DJNZ 33H,LOOP1DJNZ 32H,LOOPRET;=====延時(shí)4236個(gè)機(jī)器周期顯示用到=====DELAY2: MOV 32H,#43HLOOP3: MOV 33H,#1EHMOV A,R7 ;每隔60~70個(gè)機(jī)器周期讀一次P1口,全為1時(shí)為無(wú)效數(shù)據(jù),繼續(xù)讀,有一個(gè)不為1時(shí),轉(zhuǎn)到正常搶答處理JNZ AAAA1 ;沒(méi)讀到有效數(shù)據(jù)時(shí)繼續(xù)轉(zhuǎn)到AAAA1LOOP2: DJNZ 33H,LOOP2DJNZ 32H,LOOP3RET;=====讀搶答按鍵數(shù)據(jù)口程序=====;由于在讀搶答數(shù)據(jù)口的時(shí)候,單片機(jī)首先進(jìn)入倒計(jì)時(shí)程序,再調(diào)用顯示程序,最后才檢測(cè)按鍵口;然而在檢測(cè)按鍵口時(shí)動(dòng)態(tài)掃描要調(diào)用三次4ms延時(shí)程序.這樣就會(huì)導(dǎo)致讀數(shù)據(jù)口出現(xiàn)滯后,造成1號(hào)優(yōu)先最高.8號(hào)最低.;故采用在延時(shí)子程序中加了讀數(shù)據(jù)口程序.保證了靈敏度和可靠性AAAA1: MOV A,P1CJNE A,#0FFH,AA1 ;當(dāng)不全為1時(shí)的數(shù)據(jù)為有效數(shù)據(jù)AA0: MOV 36H,A ;將有效數(shù)據(jù)送到36H暫存AJMP LOOP2AA1: DEC R7AJMP AA0;=====發(fā)聲程序=====BARK: SETB RINGACALL DELAY1ACALL DELAY1CLR RING;按鍵發(fā)聲RET;=====TO溢出中斷響鈴程序=====T0INT: MOV TH0,#0ECHMOV TL0,#0FFHJNB RING,OUT;CPL P3.6;RING標(biāo)志位為1時(shí)候P3.6口不短取反使喇叭發(fā)出一定頻率的聲音OUT: RETI;=====T1溢出中斷計(jì)時(shí)程序=====T1INT: MOV TH1,#3CHMOV TL1,#0B0HINC R0RETIEND僅供參考。
相關(guān)推薦
- 2016-05-05文字轉(zhuǎn)語(yǔ)音芯片(單片機(jī)用)
熱門搜索
- 2018-07-318月8號(hào)成都出發(fā)去色達(dá),自駕游,有2個(gè)位置可以結(jié)伴
- 2018-07-31這地方熱嗎?莫干山不錯(cuò)的,下渚湖怎樣熱不熱
- 2018-07-31兒童超過(guò)120m要買票嗎
- 2018-07-31準(zhǔn)備去大理旅游三天,從昆明出發(fā) 求大神推薦路線
- 2018-07-31從廈大學(xué)生公寓到南普陀寺怎么走,要多長(zhǎng)時(shí)間到?
- 2018-07-31問(wèn)一哈從宜賓到濟(jì)南,怎么走最劃算