單片機(jī)各個案例,程序的設(shè)計方案~~_第1頁
單片機(jī)各個案例,程序的設(shè)計方案~~_第2頁
單片機(jī)各個案例,程序的設(shè)計方案~~_第3頁
單片機(jī)各個案例,程序的設(shè)計方案~~_第4頁
單片機(jī)各個案例,程序的設(shè)計方案~~_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE82第二部份MCS—51單片機(jī)設(shè)計應(yīng)用程序?qū)嵗?閃爍LED小燈的設(shè)計例2數(shù)碼管時鐘電路的設(shè)計例38×8點陣LED字符顯示器的設(shè)計例4八路輸入模擬信號的數(shù)值顯示電路的設(shè)計例5單鍵學(xué)習(xí)型遙控器的設(shè)計例6十五路電器遙控的設(shè)計例7自行車?yán)锍?速度計的設(shè)計例8自動往返行駛小汽車的設(shè)計例9遙控小汽車的設(shè)計例10汽車行駛信息發(fā)送與接收器的設(shè)計例11數(shù)控調(diào)頻發(fā)射臺的設(shè)計例12可在線修改程序的單片機(jī)W78B516E設(shè)計實例例13電子定時器的設(shè)計

閃爍LED小燈的設(shè)計本設(shè)計的閃爍小燈控制器,可使小燈輪流點亮、逐點點亮、間隔閃亮,如要控制交流彩燈可在P1端口加接繼電器或可控硅接口電路.可應(yīng)用在廣告彩燈控制器、舞臺燈光控制器等領(lǐng)域.1系統(tǒng)硬件電路的設(shè)計上圖為該控制器的電路原理圖,其中單片機(jī)采用AT89C2051,P1口作LED發(fā)光管輸出控制用,P3.0—P3.2口為閃爍方式控制開關(guān)K1、K2、K3按鍵接口,P3。3口的按鍵作備用,限流電阻為310Ω,發(fā)光管工作電流約為10mA,采用12MHz晶振。2系統(tǒng)主要程序的設(shè)計(1)主體程序通過掃描P3.0—P3。2端口,判斷是否有按鍵按下,然后在20H內(nèi)存單元的低三位的對應(yīng)位置1標(biāo)志,確定應(yīng)執(zhí)行的閃爍功能。當(dāng)20H.0為1時,發(fā)光管輪流點亮;當(dāng)20H.1為1時,發(fā)光管逐點點亮;當(dāng)20H.2為1時,發(fā)光管間隔閃亮.在主程序?qū)?0H的低三位進(jìn)行位值判定后,轉(zhuǎn)入相應(yīng)的閃爍控制程序。上電初始化時對20H的最低位置1,系統(tǒng)進(jìn)入輪流點亮方式.(2)鍵掃描子程序因按鍵較少,采用直接端口掃描鍵開關(guān),用軟件延時消抖確認(rèn)后對20H內(nèi)存單元相應(yīng)的位置1并把其余位清零。(3)閃爍控制程序閃爍控制程序用來控制P1口的發(fā)光管發(fā)光變化方式,其中執(zhí)行功能程序0(FUN0)時的P1口輸出值變化為11111110—延時-11111101—延時—11111011—延時—11110111—延時-11101111—延時-11011111—延時—10111111-延時-01111111—延時-結(jié)束轉(zhuǎn)主程序。執(zhí)行功能程序1(FUN1)時的P1口輸出變化為11111110-延時—11111100—延時—11111000—延時—11110000—延時—11100000—延時—11000000—延時—10000000—延時—00000000—延時—結(jié)束轉(zhuǎn)主程序.執(zhí)行功能程序2(FUN2)時的P1口輸出變化為10101010—延時—01010101—延時—結(jié)束轉(zhuǎn)主程序。(4)延時子程序延時子程序有10ms和0.5s兩個,用以作鍵掃描消抖及發(fā)光管閃爍延時,發(fā)光管閃爍的快慢可由R4寄存器內(nèi)的初值進(jìn)行改變.3主程序流程圖YYYYNNN開始20H.2=1?20H.1=1?20H.0=1?初始化調(diào)用鍵掃描子程序(KEYWORK)轉(zhuǎn)入功能程序2(FUN2)轉(zhuǎn)入功能程序1(FUN1)轉(zhuǎn)入功能程序0(FUN0)圖1-2主程序流程圖本控制器在使用中當(dāng)要改變閃爍的方式時,可按下相應(yīng)的功能按鍵,當(dāng)一個完整的閃爍循環(huán)結(jié)束后轉(zhuǎn)入新的閃爍方式.由于鍵掃描是在閃爍循環(huán)結(jié)束時進(jìn)行,因此,功能開關(guān)按下的時間應(yīng)較長才能被讀入,改進(jìn)的方法是把DL05S延時子程序用鍵掃描子程序來替代,那么只要一按下按鍵即可被鍵掃描程序讀入,讀者可以試試其區(qū)別.以下是LED小燈閃爍控制器完整源程序:;************;;小燈控制程序;;************;;;************;;中斷入口程序;;************;;ORG0000H;程序執(zhí)行開始地址LJMPSTART;跳至START執(zhí)行ORG0003H;外中斷0中斷入口地址RETI;中斷返回(不開中斷)ORG000BH;定時器T0中斷入口地址RETI;中斷返回(不開中斷)ORG0013H;外中斷1中斷入口地址RETI;中斷返回(不開中斷)ORG001BH;定時器T1中斷入口地址RETI;中斷返回(不開中斷)ORG0023H;串行口中斷入口地址RETI;中斷返回(不開中斷);;************;;初始化程序;;************;;CLEAR:MOV20H,#00H;20H單元內(nèi)存清0(閃爍標(biāo)志清0)SETB00H;20H.0位置1(上電時自動執(zhí)行閃爍功能1)RET;子程序返回;;************;;主程序;;************;;START:ACALLCLEAR;調(diào)用初始化子程序MAIN:LCALLKEYWORK;調(diào)用鍵掃描子程序JB00H,FUN0;20H。0位為1時執(zhí)行FUN0JB01H,F(xiàn)UN1;20H。1位為1時執(zhí)行FUN1JB02H,FUN2;20H。2位為1時執(zhí)行FUN2JB03H,MAIN;備用AJMPMAIN;返回主程序MAIN;;************;;功能程序;;************;;第1種閃爍功能程序FUN0:MOVA,#0FEH;累加器賦初值FUN00:MOVP1,A ;累加器值送至P1口LCALLDL05S;延時JNBACC.7,MAIN;累加器最高位為0時轉(zhuǎn)MAINRLA;累加器A中數(shù)據(jù)循環(huán)左移1位AJMPFUN00;轉(zhuǎn)FUN00循環(huán);;第2種閃爍功能程序FUN1:MOVA,#0FEH;累加器賦初值FUN11:MOVP1,A;累加器值送至P1口LCALLDL05S;延時JZMAIN;A為0轉(zhuǎn)MAINRLA;累加器A中數(shù)據(jù)循環(huán)左移1位ANLA,P1;A同P1口值相與AJMPFUN11;轉(zhuǎn)FUN11循環(huán);;第3種閃爍功能程序FUN2:MOVA,#0AAH;累加器賦初值MOVP1,A;累加器值送至P1口LCALLDL05S;延時CPLA;A中各位取反MOVP1,A;累加器值送至P1口LCALLDL05S;延時AJMPMAIN;轉(zhuǎn)MAIN;************;;掃鍵程序;;************;;KEYWORK:MOVP3,#0FFH;置P3口為輸入狀態(tài)JNBP3。0,KEY0;讀P3.0口,若為0轉(zhuǎn)KEY0JNBP3。1,KEY1;讀P3。1口,若為0轉(zhuǎn)KEY1JNBP3.2,KEY2;讀P3.2口,若為0轉(zhuǎn)KEY2JNBP3。3,KEY3;讀P3.3口,若為0轉(zhuǎn)KEY3RET;子程序返回;;閃爍功能0鍵處理程序KEY0:LCALLDL10MS;延時10毫秒消抖JBP3。0,OUT0;P3.0為1,子程序返回(干擾)SETB00H;20H。0位置1(執(zhí)行閃爍功能1標(biāo)志)CLR01H;20H。1位清0CLR02H;20H。2位清0CLR03H;20H。3位清0OUT0:RET;子程序返回;;閃爍功能1鍵處理程序KEY1:LCALLDL10MSJBP3。1,OUT1SETB01H;20H。1位置1(執(zhí)行閃爍功能2標(biāo)志)CLR00HCLR02HCLR03HOUT1:RET;;閃爍功能2鍵處理程序KEY2:LCALLDL10MSJBP3。2,OUT2SETB02H;20H。2位置1(執(zhí)行閃爍功能3標(biāo)志)CLR01HCLR00HCLR03HOUT2:RET;;閃爍功能(備用)鍵處理程序KEY3:LCALLDL10MSJBP3。3,OUT3SETB03H;20H。3位置1(執(zhí)行備用閃爍功能標(biāo)志)CLR01HCLR02HCLR00HOUT3:RET;;************;;延時程序;;************;;0.5毫秒延時子程序,執(zhí)行一次時間為513微秒DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RET;;10毫秒延時子程序(調(diào)用20次0.5毫秒延時子程序)DL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RET;;延時子程序,改變R4寄存器初值可改變閃爍的快慢(時間為15×25毫秒)DL05S:MOVR4,#0FHLOOP3:LCALLDL25MSDJNZR4,LOOP3RET;;25毫秒延時子程序,用調(diào)用掃鍵子程序延時,可快速讀出功能按鍵值DL25MS:MOVR5,#0FFHLOOP4:LCALLKEYWORKDJNZR5,LOOP4RETEND;程序結(jié)束

例2數(shù)碼管時鐘電路的設(shè)計LED數(shù)碼管時鐘電路采用24小時計時方式,時、分、秒用六位數(shù)碼管顯示.采用AT89C2051單片機(jī),可使用3V電池供電,使用一個按鍵開關(guān),可進(jìn)入調(diào)時、省電(不顯示LED數(shù)碼管)和正常顯示三種狀態(tài)。1時鐘電路硬件的設(shè)計電路如上圖2-1,采用AT89C2051單片機(jī)最小化應(yīng)用設(shè)計,LED顯示采用動態(tài)掃描方式實現(xiàn),P1口輸出段碼數(shù)據(jù),P3.0—P3。5口作掃描輸出,P3。7接按鈕開關(guān)。為了提供LED數(shù)碼管的驅(qū)動電流,用三極管9012作電源驅(qū)動輸出。為了提高秒計時的精確性,采用12MHz晶振.2系統(tǒng)主要程序的設(shè)計(1)主程序本設(shè)計中計時采用定時器T0中斷完成,其余狀態(tài)循環(huán)調(diào)用顯示子程序,當(dāng)P3。7端口開關(guān)按下時,轉(zhuǎn)入調(diào)時功能程序。其主程序執(zhí)行流程見圖2-2。(2)顯示子程序數(shù)碼管顯示的數(shù)據(jù)存放在內(nèi)存單元70H—75H中,其中70H—71H存放秒數(shù)據(jù),72H—73H存放分?jǐn)?shù)據(jù),74H—75H存放時數(shù)據(jù),每一地址單元內(nèi)均為十進(jìn)制BCD碼。由于采用軟件動態(tài)掃描實現(xiàn)數(shù)據(jù)顯示功能,顯示用十進(jìn)制BCD碼數(shù)據(jù)的對應(yīng)段碼存放在ROM表中,顯示時,先取出70H—75H某一地址中的數(shù)據(jù),然后查得對應(yīng)的顯示用段碼從P1口輸出,P3口將對應(yīng)的數(shù)碼管選中,就能顯示該地址單元的數(shù)據(jù)值。YYYYYNNNN1秒到?T0中斷保護(hù)現(xiàn)場秒單元加1秒單元清零,分加1圖2—3T0中斷服務(wù)程序=60秒?=60分?分單元清零,時加1=24時?時單元清零恢復(fù)現(xiàn)場,中斷返回YYNP3.7=0?開始顯示單元清零T0、T1設(shè)為16位計數(shù)器模式允許T0中斷調(diào)用顯示子程序進(jìn)入調(diào)時程序圖2—2主程序流程圖(3)定時器T0中斷服務(wù)程序定時器T0用于時間計時。定時溢出中斷周期設(shè)為50ms,中斷累計20次(即1秒)時對秒計數(shù)單元進(jìn)行加1操作。時間計數(shù)單元地址分別在70H-71H(秒)、76H—77H(分)、78H—79H(時),7AH單元內(nèi)存放“熄滅符"數(shù)據(jù)(#0AH)。在計數(shù)單元中采用十進(jìn)制BCD碼計數(shù),滿60進(jìn)位,T0中斷服務(wù)程序執(zhí)行流程見圖2—3。(4)T1中斷服務(wù)程序T1中斷服務(wù)程序用于指示調(diào)整單元數(shù)字的亮閃,在時間調(diào)整狀態(tài)下,每過0.3秒,將對應(yīng)單元的顯示數(shù)據(jù)換成“熄滅符”數(shù)據(jù)(#0AH).這樣在調(diào)整時間時,對應(yīng)調(diào)整單元的顯示數(shù)據(jù)會間隔閃亮。(5)調(diào)時功能程序調(diào)時功能程序的設(shè)計方法是:按下按鍵,若按下時間小于1秒,進(jìn)入省電狀態(tài)(數(shù)碼管不亮,時鐘不停),否則進(jìn)入調(diào)分狀態(tài),等待操作.此時計時器停止走動。當(dāng)再按下按鈕時,若按下時間小于0.5秒,則時間加1分,若按下時間大于0。5秒,則進(jìn)入小時調(diào)整狀態(tài)。在小時調(diào)整狀態(tài)下,當(dāng)按鍵按下的時間大于0。5秒時退出調(diào)整狀態(tài),時鐘繼續(xù)走動。以下是LED數(shù)碼管時鐘電路的完整源程序:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AT89C2051時鐘程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器T0、T1溢出周期為50MS,T0為秒計數(shù)用,T1為調(diào)整時閃爍用,;P3。7為調(diào)整按鈕,P1口為字符輸出口,采用共陽顯示管。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中斷入口程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG0000H;程序執(zhí)行開始地址LJMPSTART;跳到標(biāo)號START執(zhí)行ORG0003H;外中斷0中斷程序入口RETI;外中斷0中斷返回ORG000BH;定時器T0中斷程序入口 LJMPINTT0;跳至INTTO執(zhí)行ORG0013H;外中斷1中斷程序入口 RETI;外中斷1中斷返回 ORG001BH;定時器T1中斷程序入口 LJMPINTT1;跳至INTT1執(zhí)行 ORG0023H;串行中斷程序入口地址 RETI ;串行中斷程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START:MOVR0,#70H ;清70H—7AH共11個內(nèi)存單元MOVR7,#0BH ;CLEARDISP:MOV@R0,#00H ;INCR0;DJNZR7,CLEARDISP;MOV20H,#00H ;清20H(標(biāo)志用)MOV7AH,#0AH;放入“熄滅符”數(shù)據(jù)MOV TMOD,#11H;設(shè)T0、T1為16位定時器MOVTL0,#0B0H ;50MS定時初值(T0計時用)MOVTH0,#3CH ;50MS定時初值MOVTL1,#0B0H ;50MS定時初值(T1閃爍定時用)MOVTH1,#3CH ;50MS定時初值SETBEA;總中斷開放SETBET0;允許T0中斷SETBTR0;開啟T0定時器MOVR4,#14H;1秒定時用初值(50MS×20)START1:LCALLDISPLAY;調(diào)用顯示子程序JNB P3。7,SETMM1;P3.7口為0時轉(zhuǎn)時間調(diào)整程序SJMPSTART1;P3.7口為1時跳回START1SETMM1:LJMPSETMM;轉(zhuǎn)到時間調(diào)整程序SETMM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1秒計時程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中斷服務(wù)程序INTT0:PUSHACC;累加器入棧保護(hù)PUSHPSW;狀態(tài)字入棧保護(hù)CLRET0;關(guān)T0中斷允許CLRTR0;關(guān)閉定時器T0MOVA,#0B7H;中斷響應(yīng)時間同步修正ADDA,TL0;低8位初值修正MOVTL0,A;重裝初值(低8位修正值)MOVA,#3CH;高8位初值修正ADDCA,TH0;MOVTH0,A;重裝初值(高8位修正值)SETBTR0;開啟定時器T0DJNZR4,OUTT0;20次中斷未到中斷退出ADDSS:MOV R4,#14H;20次中斷到(1秒)重賦初值MOV R0,#71H;指向秒計時單元(71H-72H)ACALLADD1;調(diào)用加1程序(加1秒操作)MOVA,R3;秒數(shù)據(jù)放入A(R3為2位十進(jìn)制數(shù)組合)CLR C;清進(jìn)位標(biāo)志CJNE A,#60H,ADDMM;ADDMM:JC OUTT0;小于60秒時中斷退出ACALLCLR0;大于或等于60秒時對秒計時單元清0MOV R0,#77H;指向分計時單元(76H-77H)ACALLADD1;分計時單元加1分鐘MOV A,R3;分?jǐn)?shù)據(jù)放入ACLRC;清進(jìn)位標(biāo)志CJNEA,#60H,ADDHH;ADDHH:JC OUTT0;小于60分時中斷退出ACALLCLR0;大于或等于60分時分計時單元清0MOV R0,#79H;指向小時計時單元(78H—79H)ACALLADD1;小時計時單元加1小時MOVA,R3;時數(shù)據(jù)放入ACLRC;清進(jìn)位標(biāo)志CJNEA,#24H,HOUR;HOUR:JCOUTT0;小于24小時中斷退出ACALLCLR0;大于或等于24小時小時計時單元清0OUTT0:MOV72H,76H;中斷退出時將分、時計時單元數(shù)據(jù)移MOV73H,77H;入對應(yīng)顯示單元MOV74H,78H;MOV75H,79H;POP PSW;恢復(fù)狀態(tài)字(出棧)POPACC;恢復(fù)累加器SETBET0;開放T0中斷RETI;中斷返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;閃動調(diào)時程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中斷服務(wù)程序,用作時間調(diào)整時調(diào)整單元閃爍指示INTT1:PUSHACC;中斷現(xiàn)場保護(hù)PUSHPSW;MOVTL1,#0B0H;裝定時器T1定時初值MOVTH1,#3CH ;DJNZR2,INTT1OUT ;0。3秒未到退出中斷(50MS中斷6次)MOVR2,#06H ;重裝0。3秒定時用初值CPL02H ;0.3秒定時到對閃爍標(biāo)志取反JB02H,FLASH1 ;02H位為1時顯示單元“熄滅”MOV72H,76H;02H位為0時正常顯示MOV73H,77H;MOV74H,78H;MOV75H,79H;INTT1OUT:POPPSW ;恢復(fù)現(xiàn)場POPACC;RETI;中斷退出FLASH1:JB01H,F(xiàn)LASH2;01H位為1時,轉(zhuǎn)小時熄滅控制MOV72H,7AH;01H位為0時,“熄滅符"數(shù)據(jù)放入分MOV73H,7AH;顯示單元(72H—73H),將不顯示分?jǐn)?shù)據(jù)MOV74H,78H;MOV75H,79H;AJMPINTT1OUT;轉(zhuǎn)中斷退出FLASH2:MOV72H,76H;01H位為1時,“熄滅符”數(shù)據(jù)放入小時MOV73H,77H;顯示單元(74H—75H),小時數(shù)據(jù)將不顯示MOV74H,7AH;MOV75H,7AH;AJMPINTT1OUT;轉(zhuǎn)中斷退出;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;加1子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1:MOV A,@R0;取當(dāng)前計時單元數(shù)據(jù)到ADEC R0;指向前一地址SWAP A;A中數(shù)據(jù)高四位與低四位交換ORL A,@R0;前一地址中數(shù)據(jù)放入A中低四位ADD A,#01H;A加1操作DA A;十進(jìn)制調(diào)整MOV R3,A;移入R3寄存器ANL A,#0FH;高四位變0MOV @R0,A;放回前一地址單元MOV A,R3;取回R3中暫存數(shù)據(jù)INC R0;指向當(dāng)前地址單元SWAP A;A中數(shù)據(jù)高四位與低四位交換ANL A,#0FH;高四位變0MOV @R0,A;數(shù)據(jù)放入當(dāng)削地址單元中RET;子程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清零程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;對計時單元復(fù)零用CLR0:CLR A;清累加器MOV @R0,A;清當(dāng)前地址單元DEC R0;指向前一地址MOV @R0,A;前一地址單元清0RET;子程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;時鐘調(diào)整程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;當(dāng)調(diào)時按鍵按下時進(jìn)入此程序SETMM:cLR ET0;關(guān)定時器T0中斷CLR TR0;關(guān)閉定時器T0LCALL DL1S;調(diào)用1秒延時程序JB P3.7,CLOSEDIS;鍵按下時間小于1秒,關(guān)閉顯示(省電)MOV R2,#06H;進(jìn)入調(diào)時狀態(tài),賦閃爍定時初值SETB ET1;允許T1中斷SETB TR1;開啟定時器T1SET2:JNB P3。7,SET1;P3。7口為0(鍵未釋放),等待SETB 00H;鍵釋放,分調(diào)整閃爍標(biāo)志置1SET4:JB P3.7,SET3;等待鍵按下LCALL DL05S;有鍵按下,延時0.5秒JNB P3.7,SETHH;按下時間大于0.5秒轉(zhuǎn)調(diào)小時狀態(tài)MOV R0,#77H;按下時間小于0.5秒加1分鐘操作LCALL ADD1;調(diào)用加1子程序MOV A,R3;取調(diào)整單元數(shù)據(jù)CLR C;清進(jìn)位標(biāo)志CJNE A,#60H,HHH;調(diào)整單元數(shù)據(jù)與60比較HHH:JC SET4;調(diào)整單元數(shù)據(jù)小于60轉(zhuǎn)SET4循環(huán)LCALL CLR0;調(diào)整單元數(shù)據(jù)大于或等于60時清0CLR C;清進(jìn)位標(biāo)志AJMP SET4;跳轉(zhuǎn)到SET4循環(huán)CLOSEDIS:SETB ET0;省電(LED不顯示)狀態(tài).開T0中斷SETB TR0;開啟T0定時器(開時鐘)CLOSE:JB P3.7,CLOSE;無按鍵按下,等待。LCALL DISPLAY;有鍵按下,調(diào)顯示子程序延時削抖JB P3.7,CLOSE;是干擾返回CLOSE等待WAITH:JNB P3.7,WAITH;等待鍵釋放LJMP START1;返回主程序(LED數(shù)據(jù)顯示亮)SETHH:CLR 00H;分閃爍標(biāo)志清除(進(jìn)入調(diào)小時狀態(tài))SETHH1:JNB P3。7,SET5;等待鍵釋放SETB01H;小時調(diào)整標(biāo)志置1SET6:JB P3.7,SET7;等待按鍵按下LCALL DL05S;有鍵按下延時0。5秒JNB P3.7,SETOUT;按下時間大于0。5秒退出時間調(diào)整MOV R0,#79H;按下時間小于0。5秒加1小時操作LCALL ADD1;調(diào)加1子程序MOV A,R3;CLR C;CJNE A,#24H,HOUU;計時單元數(shù)據(jù)與24比較HOUU:JC SET6;小于24轉(zhuǎn)SET6循環(huán)LCALL CLR0;大于或等于24時清0操作AJMP SET6;跳轉(zhuǎn)到SET6循環(huán)SETOUT:JNB P3.7,SETOUT1;調(diào)時退出程序.等待鍵釋放LCALL DISPLAY;延時削抖JNB P3。7,SETOUT;是抖動,返回SETOUT再等待CLR 01H;清調(diào)小時標(biāo)志CLR 00H;清調(diào)分標(biāo)志CLR 02H;清閃爍標(biāo)志CLR TR1;關(guān)閉定時器T1CLR ET1;關(guān)定時器T1中斷SETB TR0;開啟定時器T0SETB ET0;開定時器T0中斷(計時開始)LJMP START1;跳回主程序SET1:LCALLDISPLAY;鍵釋放等待時調(diào)用顯示程序(調(diào)分)AJMPSET2;防止鍵按下時無時鐘顯示SET3:LCALLDISPLAY;等待調(diào)分按鍵時時鐘顯示用AJMPSET4SET5:LCALLDISPLAY;鍵釋放等待時調(diào)用顯示程序(調(diào)小時)AJMPSETHH1;防止鍵按下時無時鐘顯示SET7:LCALLDISPLAY;等待調(diào)小時按鍵時時鐘顯示用AJMPSET6SETOUT1:LCALLDISPLAY;退出時鐘調(diào)整時鍵釋放等待AJMPSETOUT;防止鍵按下時無時鐘顯示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;顯示程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;顯示數(shù)據(jù)在70H-75H單元內(nèi),用六位LED共陽數(shù)碼管顯示,P1口輸出段碼數(shù)據(jù),P3口作;掃描控制,每個LED數(shù)碼管亮1MS時間再逐位循環(huán)。DISPLAY:MOV R1,#70H;指向顯示數(shù)據(jù)首址MOV R5,#0FEH;掃描控制字初值PLAY:MOV A,R5;掃描字放入AMOV P3,A;從P3口輸出MOV A,@R1;取顯示數(shù)據(jù)到AMOV DPTR,#TAB;取段碼表地址MOVC A,@A+DPTR;查顯示數(shù)據(jù)對應(yīng)段碼MOV P1,A;段碼放入P1口LCALL DL1MS;顯示1MSINC R1;指向下一地址MOV A,R5;掃描控制字放入AJNB ACC.5,ENDOUT;ACC.5=0時一次顯示結(jié)束RL A;A中數(shù)據(jù)循環(huán)左移MOV R5,A;放回R5內(nèi)AJMP PLAY;跳回PLAY循環(huán)ENDOUT:SETB P3。5;一次顯示結(jié)束,P3口復(fù)位MOV P1,#0FFH;P1口復(fù)位RET;子程序返回TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共陽段碼表“0”“1"“2”“3”“4"“5”“6"“7”“8”“9”“不亮”;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延時程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1MS延時程序,LED顯示程序用DL1MS:MOV R6,#14HDL1:MOV R7,#19HDL2:DJNZ R7,DL2DJNZ R6,DL1RET;20MS延時程序,采用調(diào)用顯示子程序以改善LED的顯示閃爍現(xiàn)象DS20MS:ACALL DISPLAYACALL DISPLAYACALL DISPLAYRET;延時程序,用作按鍵時間的長短判斷DL1S:LCALLDL05SLCALLDL05SRETDL05S:MOVR3,#20H;8毫秒*32=0。196秒DL05S1:LCALLDISPLAYDJNZR3,DL05S1RET;END;程序結(jié)束

例38×8點陣LED字符顯示器的設(shè)計8×8點陣LED字符顯示器能顯示“電子設(shè)計”四個文字,顯示方式可由K1、K2、K3選擇,K1為逐字顯示,K2為向上滾動顯示,K3為向左滾動顯示。1系統(tǒng)硬件的設(shè)計本字符顯示器采用AT89C52單片機(jī)作控制器,12MHZ晶振,8*8點陣共陽LED顯示器(見圖3-1)。其中P0作為字符數(shù)據(jù)輸出口,P2為字符顯示掃描輸出口,第31腳(EA)接電源,P1.0—P1。2口分別接開關(guān)K1、K2、K3,改變電阻(270)的大小可改變顯示字符的亮度,驅(qū)動用9012三極管.2系統(tǒng)主要程序的設(shè)計(1)主程序主程序在剛上電時對系統(tǒng)進(jìn)行初始化,然后讀一次鍵開關(guān)狀態(tài),由鍵標(biāo)志位值(00H、01H、02H)決定顯示的方式(主程序流程圖見3—2)。(2)初始化程序在系統(tǒng)初始化時,對四個端口進(jìn)行復(fù)位,將顯示用的字符數(shù)據(jù)從ROM表中裝入內(nèi)存單元50H—6FH中,“電子設(shè)計”每個文字占用8個地址單元。圖3-2主程序流程圖圖3-2主程序流程圖YYYNNN開始20H.2=1?20H.1=1?20H.0=1?調(diào)用鍵掃描子程序(KEYWORK)轉(zhuǎn)向左滾動顯示程序(FUN2)轉(zhuǎn)向上滾動顯示程序(FUN1)轉(zhuǎn)逐字顯示程序(FUN0)(3)顯示程序顯示程序由顯示主程序和顯示子程序組成,顯示主程序負(fù)責(zé)每次顯示時的顯示地址首址(在B寄存器中)、每個字的顯示時間(由30H中的數(shù)據(jù)決定)、下一個顯示地址的間隔(31H中的數(shù)據(jù)決定)的處理。顯示子程序則負(fù)責(zé)對指定8個地址單元的數(shù)據(jù)進(jìn)行輸出顯示,顯示一個完整文字的時間約為8ms.在顯示子程序中,1ms延時程序是用調(diào)用鍵掃描子程序的方法實現(xiàn)的。圖3—3為逐字顯示及向上滾動顯示方式時的顯示控制程序流程圖。NNYYN逐字或上移顯示開始(R4)-1=0?寄存器B、R4、R5賦初值調(diào)顯示子程序(DISPLAY)(B)=#68H?顯示首址修改:(B)+(R5)→(B)圖3-3逐字顯示及向上滾動顯示時的程序流程圖轉(zhuǎn)START1設(shè)1幀顯示時間及換幀步距利用鍵掃描程序代替顯示程序中的1ms延時程序,是為了按鍵的快速響應(yīng),又可以提高動態(tài)顯示的掃描頻率,減少文字顯示時的閃爍現(xiàn)象,.對于多個文字的大屏幕顯示,應(yīng)該使用輸出數(shù)據(jù)緩沖寄存器,才可以得到很穩(wěn)定的顯示文字。以下是8×8點陣LED字符顯示器控制源程序:

;*************************;*電子屏字符顯示器*;*“電子設(shè)計”*;*2001。10。23*;*************************;四個顯示字符數(shù)據(jù)表放在50H—6FH單元內(nèi),字符用8*8點陣,R4(30H)用于;控制顯示靜止字的時間,R5(31H)靜止字顯示跳轉(zhuǎn)地址步距,B內(nèi)放顯示首址;;************;;中斷入口程序;;************;;ORG0000H;程序執(zhí)行開始地址LJMPSTART;跳至START執(zhí)行ORG0003H;外中斷0中斷入口地址RETI;中斷返回(不開中斷)ORG000BH;定時器T0中斷入口地址RETI;中斷返回(不開中斷)ORG0013H;外中斷1中斷入口地址RETI;中斷返回(不開中斷)ORG001BH;定時器T1中斷入口地址RETI;中斷返回(不開中斷)ORG0023H;串行口中斷入口地址RETI;中斷返回(不開中斷)ORG002BH;定時器T2中斷入口地址RETI;中斷返回(不開中斷);;初始化程序CLEARMEN:MOVA,#0FFH;四端口置1MOVP1,A;MOVP2,A;MOVP3,A;MOVP0,A;MOVDPTR,#TAB;取“電子設(shè)計”字符表首址值CLRA;MOV21H,A;21H—24H內(nèi)存單元清0MOV22H,A;MOV23H,A;MOV24H,A;MOVR3,A;R3寄存器清0MOVR1,#50H;設(shè)字符表移入內(nèi)存單元首址MOVR2,#20H;設(shè)查表次數(shù)(32次)CLLOOP:MOVCA,@A+DPTR;查表將“電子設(shè)計”字符數(shù)據(jù)移入內(nèi)存單元MOV@R1,A;MOVA,R3;INCA;MOVR3,A;INCR1;DJNZR2,CLLOOP;查表32次,不到轉(zhuǎn)CLLOOP再查RET;子程序返回;;主體程序START:MOV20H,#00H;20H內(nèi)存單元清0SETB00H;20H。0位置1START1:LCALLCLEARMEN;調(diào)用上電初始化子程序JB00H,FUN0;20H。0位為1,執(zhí)行FUN0JB01H,F(xiàn)UN1;20H.1位為1,執(zhí)行FUN1JB02H,F(xiàn)UN2;20H。2位為1,執(zhí)行FUN2AJMPSTART1;跳回START1循環(huán);;鍵掃描子程序KEYWORK:MOVP1,#0FFH;置輸入狀態(tài)JNBP1.0,KEY1;P1.0為0(鍵按下)轉(zhuǎn)KEY1JNBP1.1,KEY2;P1.1為0(鍵按下)轉(zhuǎn)KEY2JNBP1。2,KEY3;P1.2為0(鍵按下)轉(zhuǎn)KEY3KEYRET:RET;無鍵按下,子程序返回;按鍵1功能處理KEY1:LCALLDL10MS;延時10MS削抖動JBP1。0,KEYRET;是干擾轉(zhuǎn)KEYRET結(jié)束SETB00H;置逐字顯示方式標(biāo)志(20H。0=1)CLR01H;CLR02H;RET;子程序返回;按鍵2功能處理KEY2:LCALLDL10MS;JBP1.1,KEYRET;SETB01H;置上移顯示方式標(biāo)志(20H.1=1)CLR00H;CLR02H;RET;;按鍵3功能處理KEY3:LCALLDL10MS;JBP1.2,KEYRET;SETB02H;置左移顯示方式標(biāo)志(20H。2=1)CLR01H;CLR00H;RET;;逐字顯示功能程序FUN0:MOV30H,#80H;1幀顯示時間控制(約1秒)MOV31H,#08H;換幀跳轉(zhuǎn)步距為8LJMPDISP1;轉(zhuǎn)顯示子程序DISP1;上移顯示功能程序FUN1:MOV30H,#0AH;1幀顯示時間控制(約80毫秒)MOV31H,#01H;換幀跳轉(zhuǎn)步距為1LJMPDISP1;轉(zhuǎn)顯示子程序DISP1;左移顯示功能程序FUN2:LJMPDISP2;;;顯示控制程序DISP1:MOVB,#50H;顯示數(shù)據(jù)首址MOVR4,30H;放入1幀顯示時間控制數(shù)據(jù)MOVR5,31H;放入跳轉(zhuǎn)步距控制數(shù)據(jù)LOOP:LCALLDISPLAY;調(diào)用顯示子程序一次DJNZR4,LOOP;1幀顯示時間未到再轉(zhuǎn)LOOP循環(huán)MOVR4,30H;1幀顯示時間到,重裝初值MOVA,B;CJNEA,#68H,CONT;不是末地址轉(zhuǎn)CONTAJMPSTART1;是末地址,一次顯示結(jié)束跳回START1CONT:ADDA,R5;次幀掃描首址調(diào)整MOVB,A;AJMPLOOP;轉(zhuǎn)LOOP進(jìn)行次幀掃描;;顯示子程序,字符數(shù)據(jù)從P0口輸出,掃描控制字從P2口輸出,顯示1幀約需8MSDISPLAY:MOVA,#0FFH;MOVP0,A;關(guān)顯示數(shù)據(jù)MOVP2,A;關(guān)掃描MOVR6,#0FEH;賦掃描字MOVR0,B;賦顯示數(shù)據(jù)首地址MOVR7,#08H;一次掃描8行DISLOOP:MOVA,@R0;取顯示數(shù)據(jù)MOVP0,A;放入P0口MOVP2,R6;掃描輸出(顯示某一行)LCALLDL1MS;亮1毫秒INCR0;指向下一行數(shù)據(jù)地址MOVA,R6;掃描字移入ARLA;循環(huán)左移一位MOVR6,A;放回R6DJNZR7,DISLOOP;8行掃描未完轉(zhuǎn)DISLOOP繼續(xù)RET;8行掃描結(jié)束;;左移顯示控制程序DISP2:MOV R5,#32 ;左移32次DISP22: LCALLDISPP;調(diào)用左移顯示控制子程序LCALLMOVH;調(diào)用高位移出處理子程序MOVHLCALLMOVH1;調(diào)用高位移出處理子程序MOVH1 DJNZ R5,DISP22;左移顯示32次控制LJMPSTART1;跳回主程序;;左移顯示控制子程序DISPP:MOVB,#50H;第一顯示字符首址MOVR4,#25H;1幀顯示時間控制DISPP1:LCALLDISPLAY;調(diào)用顯示子程序一次DJNZR4,DISPP1;1幀顯示時間不到轉(zhuǎn)DISPP再循環(huán)RET;;高位移出處理子程序.將“電子設(shè)計”四個字符數(shù)據(jù)的最高位移出至21H-24H單元內(nèi)MOVH:MOVR1,#21H;最高位移出存放單元首址MOVR0,#50H;“電子設(shè)計”字符數(shù)據(jù)首址MOVR2,#08H;每“字"移8次MOV1:MOVA,@R0;取“電子設(shè)計"字符數(shù)據(jù)CLRC;清進(jìn)位CRLCA;帶進(jìn)位循左移MOV@R0,A;放回原單元MOVA,@R1;存放單元數(shù)據(jù)入ARRCA;帶進(jìn)位循右移MOV@R1,A;放回存放單元INCR0;字符數(shù)據(jù)地址加1DJNZR2,MOV1;移8次未完轉(zhuǎn)MOV1再移MOVR2,#08H;8次移完賦初值INCR1;存放單元地址加1MOVA,R1;判斷地址是否小于25HSUBBA,#25H;JZOUT;等于25H退出AJMPMOV1;小于25H轉(zhuǎn)MOV1繼續(xù)OUT:RET;子程序結(jié)束;;高位移出處理子程序。MOVH1:MOVA,21H;21H與22H、23H、24H單元數(shù)據(jù)循交換XCHA,24H;21H與24H全交換XCHA,23H;23H與24H全交換XCHA,22H;23H與22H全交換MOV21H,A;22H與21H全交換MOVR1,#21H;以下是重新組成顯示字符數(shù)據(jù)表程序MOVR0,#50H;將21H-24H的各位分別移入50H-6FH的低位MOVR2,#08H;移位次數(shù)MOV2:MOVA,@R0;取字符數(shù)據(jù)RRA;右移MOV@R0,A;放回原單元MOVA,@R1;取原移出最高位存放單元數(shù)CLRC;清CRRCA;帶進(jìn)位循環(huán)右移MOV@R1,A;放回原單元MOVA,@R0;取字符數(shù)據(jù)RLCA;帶進(jìn)位循環(huán)左移MOV@R0,A;放回字符數(shù)據(jù)INCR0;字符數(shù)據(jù)地址加1DJNZR2,MOV2;8次未完轉(zhuǎn)MOV2再繼續(xù)MOVR2,#08H;8次完賦初值INCR1;原移出最高位存放單元地址加1MOVA,R1;判斷地址是否小于25HSUBBA,#25H;JZOUT;等于25H轉(zhuǎn)OUT退出AJMPMOV2;小于25H轉(zhuǎn)MOV2繼續(xù);;1毫秒延時子程序,采用調(diào)用掃鍵子程序延時,可快速讀出按紐的狀態(tài)DL1MS:MOVR3,#64H;100*(10+2)usLOOPK:LCALLKEYWORKDJNZR3,LOOPKRET;;0。5毫秒延時子程序DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RET;;10毫秒延時子程序DL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RET;;“電子設(shè)計”顯示用ROM數(shù)據(jù)表TAB:DB0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H;電DB0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH;子DB0B1H,0B5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論