51單片機入門程序9 ;工程名稱:用位指令CLR和SETB指令實現P2.0所接LED的亮滅(用12MHZ晶振) ;編寫日期:2009.7.4 ;編寫者:藍柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: CLR P2.0 ;清零位指令CLR,即讓P2.0恒定輸出0,位指令是針對一根引腳的指令 LCALL YS ;調用延時子程序,讓LED亮起來1秒種 SETB P2.0 ;置1位指令SETB,即讓P2.0恒定輸出1,位指令是針對一根引腳的指令 LCALL YS ;調用延時子程序,讓LED滅掉1秒種 LJMP MAIN YS: MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的設計一般都是因為主程序要調用它, ;調用完是要返回到主程序繼續運行下一個語句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51單片機入門程序10 ;工程名稱:用查表指令MOVC A,@A+DPTR實現P1端口LED的全亮全滅 ;編寫日期:2009.7.4 ;編寫者:藍柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV R7,#0 ;查表程序要用到軟件計數器來計調出表中數據的次數(或個數) ;但是在用軟件計數器前先清零,這是給軟件計數器R7清零 MOV DPTR,#LIULIU ; 把表格的首地址放入寄存器DPTR, ;注意了DPTR里的地址是永恒不變的 LOOP:MOV A,R7 ;把軟件計數器里的數據送給累加器A,為查表作些準備 MOVC A,@A+DPTR ;查表,把查到的數據送到A MOV P1,A ;把A里的數送到P1端口顯示 ACALL YS ;調用延時子程序,顯示一小段時間 INC R7 ;軟件計數器自動加1 CJNE R7,#2,LOOP ;R7里的數到2了沒,到了順序往下運行,沒到轉移到LOOP處 MOV R7,#0 ;軟件計數器清零,也就是上面程序已經調出表里的最后一個數據 AJMP LOOP ;回到LOOP處重新把表里的第一個數調出來顯示 LIULIU: DB 00000000B,11111111B ;DB 00H ,0FFH 注意了如果是用十六進制表示時,#號后面不能 ;直接跟十六進制里面的那幾個英文字母,要用0隔開 YS: ;延時子程序,如果是用12MHZ作為時鐘電路的話,那么延時時間為1秒 MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的設計一般都是因為主程序要調用它, ;調用完是要返回到主程序繼續運行下一個語句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51單片機入門程序11 ;工程名稱:讓單個數碼管顯示5這個數字 ;編寫日期:2009.7.4 ;編寫者:藍柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: CLR P2.7 ;數碼管的硬件連接參看課本第六章,這個語句是讓數碼管亮起來的條件 MOV P0,#92H ;這個語句是讓數碼管顯示5,92H是數碼管顯示5的代碼,參看課本79頁 AJMP MAIN ;循環 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51單片機入門程序12 ;工程名稱:個位數碼管計數顯示0-9(數碼管靜態顯示,結合仿真板) ;編寫日期:2009.7.4 ;編寫者:藍柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: CLR P2.7 ;先讓數碼管能夠亮起來 MOV R7, #0 ;查表程序要用到軟件計數器來計調出表中數據的次數(或個數) ;但是在用軟件計數器前先清零,這是給軟件計數器R7清零 MOV DPTR, #LIULIU ;把表格的首地址放入寄存器DPTR, ;注意了DPTR里的地址是永恒不變的 LOOP:MOV A, R7 ;把軟件計數器里的數據送給累加器A,為查表作些準備 MOVC A,@A+DPTR ;查表,把查到的數據送到A MOV P0,A ;把A里的數送到P0端口顯示 ACALL YS ;調用延時子程序,顯示一小段時間 INC R7 ;軟件計數器自動加1 CJNE R7,#10,LOOP ;R7里的數到10了沒,到了順序往下運行,沒到轉移到LOOP處 MOV R7,#0 ;軟件計數器清零,也就是上面程序已經調出表里的最后一個數據 AJMP LOOP ;回到LOOP處重新把表里的第一個數調出來顯示 LIULIU:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ; 0 1 2 3 4 5 6 7 8 9 YS: ;延時子程序,如果是用12MHZ作為時鐘電路的話,那么延時時間為1秒 MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的設計一般都是因為主程序要調用它, ;調用完是要返回到主程序繼續運行下一個語句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51單片機入門程序13 ;工程名稱:讓數碼管顯示數字12(數碼管動態顯示,結合仿真板和課本第七章電路圖) ;編寫日期:2009.7.4 ;編寫者:藍柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H ;偽指令,規定下面的指令保存在程序存儲器的0000H單元 AJMP MAIN ;跳轉到主程序,以保留0003H開始的中斷入口地址 ORG 0050H ;偽指令 MAIN: SETB P2.7 ; 十位數碼管熄滅 CLR P2.6 ;個位數碼管亮 MOV A,#02H ;個位要顯示的數據送累加器A MOV DPTR,#TABLE1 ; DPTR用于保存表的首地址 MOVC A,@A+DPTR ; 查表指令,取出DPTR所對應表中的第A個數據(此處A為累加器, ;同時應注意數據的序號從0開始編號),即取出要顯示數據的段碼A4H MOV P0,A ;將取得的段碼A4H送到P0口顯示 ACALL YS ; 調用延時程序 SETB P2.6 ; 個位數碼管熄滅 CLR P2.7 ; 十位數碼管亮 MOV A,#01H ;十位要顯示的數據送累加器A MOV DPTR,#TABLE1 ; DPTR用于保存表的首地址(即到哪一個表中取數) MOVC A,@A+DPTR ; 查表指令,取出DPTR所對應的表中的第A個數據(此處A為累加器,;同時應注意數據的序號從0開始編號),即取出要顯示數據的段碼F9H MOV P0,A ;將取得的段碼F9H送到P0口顯示 ACALL YS ;調用延時程序 AJMP MAIN ;跳回交替繼續顯示 ;0 1 2 3 4 5 6 7 8 9 TABLE1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共陽數碼管段碼表 YS: ;延時子程序,如果是用12MHZ作為時鐘電路的話,那么延時時間為1秒 MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的設計一般都是因為主程序要調用它, ;調用完是要返回到主程序繼續運行下一個語句的 END ;補充說明: ;1.數碼管顯示時一定要看好硬件連接,還要考慮數碼管公共端要有恒定的有效電平 ;2.用到查表指令的程序一般思路是這樣,首先編寫出只運行一次的條件,如軟件計數器 ;清零,把表的首地址放入DPTR和設置數碼管公共端的有效電平等。然后是把軟件計數器 ;里的數送到A,然后查表,接著就顯示延時,再接著就是計數器自動加1,跟著就是 ;CJNE判斷,后面就是循環了 ;3.數碼管的靜態顯示一般是指給數碼管的公共端一個恒定的有效電平,數碼管就一直 ;處于顯示狀態。數碼管的動態顯示是指雖然數碼管的公共端的有效電平 ;時有改變,但是改變的速度太快,利用人眼的視覺暫留效果我們看到的是不變動的 ;顯示。其實不管是靜態顯示還是動態顯示,只要大家能夠把硬件接好 ;然后會編出相應的程序出來就可以了 |