專注電子技術(shù)學習與研究
當前位置:單片機教程網(wǎng) >> MCU設計實例 >> 瀏覽文章

51單片機仿真實例

作者:未知   來源:會員上傳   點擊數(shù):  更新時間:2014年05月20日   【字體:

l  示例6掃描與判斷(單端口)位掃描與字節(jié)(多端口)掃描

這是一個常用程序段—子程序—標準程序,通過端口掃描而獲得輸入數(shù)據(jù)或控制輸出數(shù)據(jù),達到節(jié)省位或字節(jié)的目的—節(jié)約硬件資源。
關(guān)于掃描,可以從位及其取反實現(xiàn)流水燈著手來理解?梢酝ㄟ^移位實現(xiàn)流水燈—掃描?梢酝ㄟ^字節(jié)數(shù)據(jù)(01H,02H,04H,08H,10H,20H,40H,80H—陽極管)的端口發(fā)送實現(xiàn)流水燈—掃描?梢酝ㄟ^數(shù)據(jù)表(DB 01H,02H,04H,08H,10H,20H,40H,80H—陰極管)實現(xiàn)流水燈—掃描?梢酝ㄟ^循環(huán)跳轉(zhuǎn)實現(xiàn)流水燈—掃描。掃描注意入比出查—獲得輸入要比較數(shù)據(jù)、發(fā)送輸出要檢查出口
掃描獲取端口字節(jié)
掃描輸出位移動產(chǎn)生動態(tài)效果(01、0204、08、10、2040、80),可以用字節(jié)表
掃描輸出字符字節(jié),通過延時可以變換字符以便造成數(shù)字進位效果
ORG 0000H
START:
dbuf     equ  30h  ;置存儲區(qū)首址
temp     equ  40h  ;置緩沖區(qū)首址
         org 00h
         mov 30h,#2 ;存入數(shù)據(jù)
         mov 31h,#0
         mov 32h,#1
         mov 33h,#0
         mov 34h,#7
         mov 35h,#1
         mov r0,#dbuf
         mov r1,#temp
         mov r2,#6     ;六位顯示器
         mov dptr,#segtab ;段碼表首地址
dp00:    mov a,@r0    ;取要顯示的數(shù)據(jù)
         movc a,@a+dptr ;查表取段碼
         mov @r1,a     ;段碼暫存
         inc r1
         inc r0
         djnz r2,dp00                                                          
disp0:   mov r0,#temp    ;顯示子程序
         mov r1,#6      ;掃描6次
         mov r2,#01h    ;從第一位開始
dp01:    mov a,@r0
         mov p2,a   ;段碼輸出
         mov a,r2   ;取位碼
         mov p1,a   ;位碼輸出
         acall delay  ;調(diào)用延時
         mov a,r2
         rl a
         mov r2,a
         inc r0
         djnz r1,dp01
         sjmp disp0
segtab:  db 0C0H,0F9H,0A4H,0B0H,99H,92H  ;共陽極管
         db 82H,0F8H,80H,90H,88H,88H,83H
delay:   mov r4,#29h         ;延時子程序
aa1:     mov r5,0ffh
aa:      djnz r5,aa
         djnz r4,aa1
         ret
         end
???????????????????????
************************************************************************
還可以用其他程序形式進行掃描,像循環(huán)、遞增或遞減判斷程序等。掃描技術(shù)可以用于點陣顯示,液晶板(LCD)顯示。這些都需要字符編碼、顯示延時、掃描端口以充分利用資源(節(jié)約資源)。
 
 
l  實例1—關(guān)于動態(tài)顯示—LED閃爍
 
ORG 0000H
  START: 
    MOV  A,#0FFH   ;字節(jié)傳送
    MOV  P3,A  ;字節(jié)傳送
       MOV  P1,A
       MOV C, 0A0H ;位傳送
    JNB  0A0H,GUAN ;判斷位電平低為真,則轉(zhuǎn)移;直接地址位為0轉(zhuǎn)移
       MOV  P1,#00H ;  P1口先賦#0FFH,再賦#00H,則產(chǎn)生閃爍
RET
GUAN : 
       MOV  P3,#00H ;P3口先賦#0FFH,再賦#00H,則產(chǎn)生閃爍,也可以使用取反指令
     RET   ;可以產(chǎn)生閃爍效果
 END 
其他方法(如:延時子程序)也可以實現(xiàn)動態(tài)顯示。
 
l  實例2—單個LED燈-單個按鍵的仿真
ORG  0000H   ;這是偽指令,機器并不執(zhí)行,用于程序的交流。指令執(zhí)行的起始地址,十進制用D表示,十六進制用H表示,二進制用B表示。一個字節(jié)(8位機、16位機、32位機、64位機)一次執(zhí)行。也可以按位來執(zhí)行,也就是一個bit。
ORG  00000000B與ORG  0000H作用相同。注意8位(bit)一個字節(jié)。16位的處理器需要用0000 0000H 表示。16或32位以上,使用操作系統(tǒng)(Wince、Linux等)更有效,可以利用大量的、底層的、專業(yè)化、標準化的面向控制的庫函數(shù)(如:API等)。
START:  ;這是偽指令,機器并不執(zhí)行。只是為了匯編語言講故事的可理解性
   MAIN:    ;偽指令,主程序,用于區(qū)別子程序
   PC→MOV  A,#00H   ;將立即數(shù)00000000B(常數(shù)0D)傳送給累加器ACC(專用寄存器,可用于存放計算結(jié)果等)。要通過累加器A和其它存儲地址進行數(shù)據(jù)交換。注意PC是自動移位(自動+1)到下一個語句的地址。使用該語句實質(zhì)上是讓PC具有初始位置。
PC→MOV  P1,   ;將累加器中的數(shù)(常數(shù)0D)傳送給端口P1(P1口8位全部置0,低電平, P1端口各位處于關(guān)閉狀態(tài),LED燈處于系統(tǒng)響應的準備狀態(tài)),按字節(jié)傳送數(shù)據(jù)。特別記憶:PC→表示指針所指地址,并會自動加1。
PC→MOV  C,0A0H   ;檢測P2.0口的狀態(tài),將P2.0口的狀態(tài)(由按鍵狀態(tài)決定)傳送給位累加器C,位累加器C的地址是PSW(程序狀態(tài)字寄存器)的進位標志位CY(D7H\PSW.7)。P2.0口可以是開或關(guān),也就是置1或0,高電平或低電平),按字節(jié)傳送數(shù)據(jù)。要通過位累加器C和其它存儲地址進行數(shù)據(jù)交換。該語句也可以寫成:MOV  C,P2.0,比較字節(jié)數(shù)據(jù)傳送MOV A,#00H或MOV  A,P1。
PC→MOV  P1.0C;等價于MOV  90H,C;將位累加器C地址中的值傳送給P1.0口(90H是其直接地址),也就是將P2.0口的狀態(tài)(由直接地址0A0H狀態(tài)決定)傳送給直接地址90HP1.0
PC→MOV  P1.1,C  ;等價于MOV  91H,C
PC→MOV  P1.2,C  ;等價于MOV  92HC
PC→MOV  P1.3,C  等價于MOV  93H, 等等
END ;偽指令,程序結(jié)束標志
 
l  實例3—掃描實現(xiàn)數(shù)字移動變化的仿真
l  實例4—雙數(shù)碼管雙端口數(shù)字進位仿真
 
l  實例5—雙四數(shù)碼管組雙端口數(shù)字顯示—單端口掃描移動仿真—點陣
雙四數(shù)碼管組雙端口數(shù)字顯示—單端口掃描移動仿真,可以被分解為
a)  雙四數(shù)碼管組雙端口數(shù)字顯示—單端口無掃描無移動—>數(shù)字變化(依靠數(shù)表和指針),
b)  雙四數(shù)碼管組雙端口數(shù)字顯示—單端口掃描移動—>數(shù)字不變化(依靠數(shù)表和指針),
c)   雙四數(shù)碼管組雙端口數(shù)字顯示—單端口掃描移動—>數(shù)字變化(依靠數(shù)表和指針),
關(guān)閉窗口