找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2985|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)入門程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71407 發(fā)表于 2014-12-31 14:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
;工程名稱:點(diǎn)亮單片機(jī)P1端口所接的八盞LED ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H ;ORG是偽指令,大概的意思是程序從地址0000H處開始保存程序 MAIN: ;主程序開始的標(biāo)號(hào),標(biāo)號(hào)可以自己任意定義,標(biāo)號(hào)就是地址 MOV P1,#00000000B ;給P1端口送數(shù)00000000B,點(diǎn)亮P1端口的LED AJMP MAIN ;跳轉(zhuǎn)到標(biāo)號(hào)MAIN處運(yùn)行,AJMP是控制短轉(zhuǎn)移指令 ;AJMP在這里有循環(huán)的作用,即讓單片機(jī)不斷給P1端口送數(shù) END ;匯編結(jié)束指令 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51單片機(jī)入門程序2 ;工程名稱:熄滅單片機(jī)P1端口所接的八盞LED ;編寫日期:2009.7.4 ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H ;ORG是偽指令,大概的意思是程序從地址0000H處開始保存程序 MAIN: ;主程序開始的標(biāo)號(hào),標(biāo)號(hào)可以自己任意定義,標(biāo)號(hào)就是地址 MOV P1,#11111111B ;給P1端口送數(shù)11111111B,熄滅P1端口的LED SJMP MAIN ;跳轉(zhuǎn)到標(biāo)號(hào)MAIN處運(yùn)行,SJMP是無(wú)條件短轉(zhuǎn)移指令 ;AJMP在這里有循環(huán)的作用,即讓單片機(jī)不斷給P1端口送數(shù) END ; 匯編結(jié)束指令 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;51單片機(jī)入門程序3 ;工程名稱:點(diǎn)亮單片機(jī)P1.0和P1.7所接的LED ;編寫日期:2009.7.4 ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P1,#01111110B ;給P1端口送數(shù)01111110B,右邊的0是P1.0腳對(duì)應(yīng)的代碼 ;左邊的0是P1.7腳對(duì)應(yīng)的代碼,要記住這種對(duì)應(yīng)關(guān)系 LJMP MAIN ;跳轉(zhuǎn)到標(biāo)號(hào)MAIN處運(yùn)行,LJMP是控制長(zhǎng)轉(zhuǎn)移指令 ;AJMP在這里有循環(huán)的作用,即讓單片機(jī)不斷給P1端口送數(shù) END ; 匯編結(jié)束指令 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;51單片機(jī)入門程序4 ;工程名稱:讓單片機(jī)P1端口的LED不斷的亮滅起來(lái) ;編寫日期:2009.7.4 ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P1,#00000000B ;給P1端口送數(shù)00000000B,先點(diǎn)亮P1端口的LED ACALL YS ;調(diào)用延時(shí)子程序,讓LED亮一小段時(shí)間 MOV P1,#11111111B ;給P1端口送數(shù)11111111B,熄滅P1端口的LED ACALL YS ;調(diào)用延時(shí)子程序,讓LED滅一小段時(shí)間 AJMP MAIN ;跳轉(zhuǎn)到標(biāo)號(hào)MAIN處運(yùn)行,反復(fù)讓LED一亮一滅 YS: ;延時(shí)子程序YS,功能是能讓LED亮起來(lái)或者滅掉一小段時(shí)間 MOV R1,#200 ;讓燈亮滅時(shí)間的長(zhǎng)短也就是延時(shí)的長(zhǎng)短跟#號(hào)后面的數(shù)據(jù)有關(guān) D: MOV R2,#200 ;延時(shí)長(zhǎng)點(diǎn)#號(hào)后面的數(shù)據(jù)就大點(diǎn),延時(shí)短點(diǎn)#號(hào)后面的數(shù)據(jù) T: MOV R3,#200 ;就小點(diǎn),但#號(hào)后面最大的數(shù)據(jù)是255 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的設(shè)計(jì)一般都是因?yàn)橹鞒绦蛞{(diào)用它, ;調(diào)用完是要返回到主程序繼續(xù)運(yùn)行別的語(yǔ)句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51單片機(jī)入門程序5 ;工程名稱:讓單片機(jī)P1端口的LED實(shí)現(xiàn)跑馬燈效果,循環(huán)移位點(diǎn)亮一盞LED ;編寫日期:2009.7.4 ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P1,#11111110B;點(diǎn)亮P1.0所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.0所接的燈亮一小段時(shí)間 MOV P1,#11111101B;點(diǎn)亮P1.1所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.1所接的燈亮一小段時(shí)間 MOV P1,#11111011B;點(diǎn)亮P1.2所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.2所接的燈亮一小段時(shí)間 MOV P1,#11110111B;點(diǎn)亮P1.3所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.3所接的燈亮一小段時(shí)間 MOV P1,#11101111B;點(diǎn)亮P1.4所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.4所接的燈亮一小段時(shí)間 MOV P1,#11011111B;點(diǎn)亮P1.5所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.5所接的燈亮一小段時(shí)間 MOV P1,#10111111B;點(diǎn)亮P1.6所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.6所接的燈亮一小段時(shí)間 MOV P1,#01111111B;點(diǎn)亮P1.7所接的燈 ACALL YS ;調(diào)用延時(shí)子程序,讓P1.7所接的燈亮一小段時(shí)間 LJMP MAIN ;循環(huán).這回用長(zhǎng)調(diào)用指令LJMP,當(dāng)程序比較長(zhǎng)的時(shí)候就用LJMP YS: ;延時(shí)子程序YS,功能是能讓LED亮起來(lái)或者滅掉一小段時(shí)間 MOV R1,#200 ;讓燈亮滅時(shí)間的長(zhǎng)短也就是延時(shí)的長(zhǎng)短跟#號(hào)后面的數(shù)據(jù)有關(guān) D: MOV R2,#200 ;延時(shí)長(zhǎng)點(diǎn)#號(hào)后面的數(shù)據(jù)就大點(diǎn),延時(shí)短點(diǎn)#號(hào)后面的數(shù)據(jù) T: MOV R3,#200 ;就小點(diǎn),但#號(hào)后面最大的數(shù)據(jù)是255 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ī)入門程序6 ;工程名稱:實(shí)現(xiàn)跑馬燈效果,循環(huán)移位點(diǎn)亮一盞LED,運(yùn)用左移指令 ;編寫日期:2009.7.4 ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV A,#11111110B ;先把數(shù)11111110B送到累加器A, LOOP: MOV P1,A ;把A里面的數(shù)11111110B送到P1端口輸出顯示 ACALL YS ;顯示一小段時(shí)間 RL A ;把A里的數(shù)11111110B左移一位 AJMP LOOP ;回到LOOP處循環(huán),即把左移后得到新的數(shù)碼再顯示,再刷新A YS: ;延時(shí)子程序YS,功能是能讓LED亮起來(lái)或者滅掉一小段時(shí)間 MOV R1,#200 ;讓燈亮滅時(shí)間的長(zhǎng)短也就是延時(shí)的長(zhǎng)短跟#號(hào)后面的數(shù)據(jù)有關(guān) D: MOV R2,#200 ;延時(shí)長(zhǎng)點(diǎn)#號(hào)后面的數(shù)據(jù)就大點(diǎn),延時(shí)短點(diǎn)#號(hào)后面的數(shù)據(jù) T: MOV R3,#200 ;就小點(diǎn),但#號(hào)后面最大的數(shù)據(jù)是255 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ī)入門程序7 ;工程名稱:讓單片機(jī)P0和P2端口所接的燈同時(shí)全亮全滅 ;編寫日期:2009.7.4 ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P0,#00000000B ;同時(shí)點(diǎn)亮兩個(gè)端口的LED的時(shí)候, MOV P2,#00000000B ;兩個(gè)MOV語(yǔ)句間不用調(diào)用延時(shí)子程序 LCALL YS ;調(diào)用延時(shí)子程序,讓P0 P2口的LED同時(shí)亮一小段時(shí)間 MOV P0,#11111111B ;同時(shí)熄滅兩個(gè)端口的LED的時(shí)候, MOV P2,#11111111B ;兩個(gè)MOV語(yǔ)句間不用調(diào)用延時(shí)子程序 LCALL YS ;調(diào)用延時(shí)子程序,讓P0 P2口的LED同時(shí)滅一小段時(shí)? LJMP MAIN ;循環(huán) YS: ;延時(shí)子程序YS,功能是能讓LED亮起來(lái)或者滅掉一小段時(shí)間 MOV R1,#200 ;讓燈亮滅時(shí)間的長(zhǎng)短也就是延時(shí)的長(zhǎng)短跟#號(hào)后面的數(shù)據(jù)有關(guān) D: MOV R2,#200 ;延時(shí)長(zhǎng)點(diǎn)#號(hào)后面的數(shù)據(jù)就大點(diǎn),延時(shí)短點(diǎn)#號(hào)后面的數(shù)據(jù) T: MOV R3,#200 ;就小點(diǎn),但#號(hào)后面最大的數(shù)據(jù)是255 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ī)


入門程序8 ;工程名稱:讓單片機(jī)P0、P1、P2和P3端口所接的燈同時(shí)全亮全滅 ;編寫日期:2009.7.4 ;編寫者:藍(lán)柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P0,#00000000B MOV P2,#00000000B MOV P1,#00000000B MOV P3,#00000000B LCALL YS ;調(diào)用延時(shí)子程序 MOV P0,#11111111B MOV P2,#11111111B MOV P1,#11111111B MOV P3,#11111111B LCALL YS ;調(diào)用延時(shí)子程序 LJMP MAIN ;循環(huán) YS: ;延時(shí)子程序YS,功能是能讓LED亮起來(lái)或者滅掉一小段時(shí)間 MOV R1,#200 ;讓燈亮滅時(shí)間的長(zhǎng)短也就是延時(shí)的長(zhǎng)短跟#號(hào)后面的數(shù)據(jù)有關(guān) D: MOV R2,#200 ;延時(shí)長(zhǎng)點(diǎn)#號(hào)后面的數(shù)據(jù)就大點(diǎn),延時(shí)短點(diǎn)#號(hào)后面的數(shù)據(jù) T: MOV R3,#200 ;就小點(diǎn),但#號(hào)后面最大的數(shù)據(jù)是255 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ō)明:AJMP、SJMP、LJMP都是控制轉(zhuǎn)移類指令,功能都是一樣的, ; 但是當(dāng)你所編寫的程序比較長(zhǎng)的時(shí)候就要用LJMP。 ; ; ACALL和LCALL都是調(diào)用指令,當(dāng)程序很長(zhǎng)的時(shí)候就用LCALL ; ; 延時(shí)子程序內(nèi)部的運(yùn)作比較復(fù)雜,大家只知道延時(shí)子程序的 ; 功能是能延時(shí)一小段時(shí)間。CUP那些內(nèi)部部件把數(shù)碼送出端口之后 ; 碰到了ACALL和LCALL這些指令后CPU就暫時(shí)不往端口送數(shù)了 ; 而是轉(zhuǎn)來(lái)運(yùn)行延時(shí)子程序,子程序運(yùn)行過(guò)程大概是這樣: ; 先把一些數(shù)分別送到一些寄存器里面去,然后進(jìn)行減1判斷不為0的工作 ; 就象我們我們把一些水果送到一些房間里面去,然后在里面把這些水果吃 ; 完,再去做正式的工作 ,吃水果的過(guò)程是花費(fèi)時(shí)間滴,呵呵! ; 延時(shí)子程序基本上是固定不變的,只要是要延長(zhǎng)時(shí)間都把這段子程序輸進(jìn)去就可以了!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:71407 發(fā)表于 2014-12-31 14:40 | 只看該作者
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)就可以了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表