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