微控制器六位數碼管電子鐘程式問題,請高手指點,分覺對給夠

時間 2022-02-01 22:00:02

1樓:匿名使用者

disp:

mov a,#dispbuf

add a,#8;如果不行試一下把這句改成 add a,#6;

dec a

mov r1,a

mov a,hour

mov b,#10

div ab

mov @r1,a

dec r1

mov a,b

mov @r1,a

dec r1

mov a,minite

mov b,#10

div ab

mov @r1,a

dec r1

mov a,b

mov @r1,a

dec r1

mov a,second

mov b,#10

div ab

mov @r1,a

dec r1

mov a,b

mov @r1,a

dec r1

ret把disp部分改成這樣,應該可以,我自己沒試過。

2樓:匿名使用者

; 定時器t0、t1溢位週期為50ms,t0為秒計數用,t1為調整時閃爍用,; p3.5為調整按鈕,p0口 為字元輸出口,p2口為位選端,採用共陽顯示管。; 時間調整方法:

按p3.5未超過1s進入省電模式,數碼管不亮,內部時鐘計時; 按p3.5超過1s進入調整模式,要調整的時間會閃動,此時,按下p3.

5超過0.5s,; 進入下位調整,按下p3.5未超過0.

5s,當前位加一;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中斷入口程式 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;org 0000h 程式執行開始地址ljmp start 跳到標號start執行org 0003h 外中斷0中斷程式入口reti 外中斷0中斷返回org 000bh 定時器t0中斷程式入口ljmp intt0 跳至intto執行org 0013h 外中斷1中斷程式入口reti 外中斷1中斷返回org 001bh 定時器t1中斷程式入口ljmp intt1 跳至intt1執行org 0023h 序列中斷程式入口地址reti 序列中斷程式返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 主 程 序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;start: mov r0,#70h 清70h-7ah共11個記憶體單元mov r7,#0bhcleardisp: mov @r0,#00hinc r0djnz r7,cleardispmov 20h,#00h 清20h(標誌用)mov 7ah,#0ah 放入"熄滅符"資料mov tmod,#11h 設t0、t1為16位定時器mov tl0,#0b0h 50ms定時初值(t0計時用)mov th0,#3ch 50ms定時初值mov tl1,#0b0h 50ms定時初值(t1閃爍定時用)mov th1,#3ch 50ms定時初值setb ea 總中斷開放setb et0 允許t0中斷setb tr0 開啟t0定時器mov r4,#14h 1秒定時用初值(50ms×20)start1:

lcall display 呼叫顯示子程式jnb p3.5,setmm1 p3.5口為0時轉時間調整程式sjmp start1 p3.

5口為1時跳回start1setmm1: ljmp setmm 轉到時間調整程式setmm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1秒計時程式 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;t0中斷服務程式intt0: push acc 累加器入棧保護push psw 狀態字入棧保護clr et0 關t0中斷允許clr tr0 關閉定時器t0mov a,#0b7h 中斷響應時間同步修正add a,tl0 低8位初值修正mov tl0,a 重灌初值(低8位修正值)mov a,#3ch 高8位初值修正addc a,th0mov th0,a 重灌初值(高8位修正值)setb tr0 開啟定時器t0djnz r4, outt0 20次中斷未到中斷退出addss:

mov r4,#14h 20次中斷到(1秒)重賦初值mov r0,#71h 指向秒計時單元(71h-72h)acall add1 呼叫加1程式(加1秒操作)mov a,r3 秒資料放入a(r3為2位十進位制陣列合)clr c 清進位標誌cjne a,#60h,addmmaddmm: jc outt0 小於60秒時中斷退出acall clr0 大於或等於60秒時對秒計時單元清0mov r0,#77h 指向分計時單元(76h-77h)acall add1 分計時單元加1分鐘mov a,r3 分資料放入aclr c 清進位標誌cjne a,#60h,addhhaddhh: jc outt0 小於60分時中斷退出acall clr0 大於或等於60分時分計時單元清0mov r0,#79h 指向小時計時單元(78h-79h)acall add1 小時計時單元加1小時mov a,r3 時資料放入aclr c 清進位標誌cjne a,#24h,hourhour:

jc outt0 小於24小時中斷退出acall clr0 大於或等於24小時小時計時單元清0outt0: mov 72h,76h 中斷退出時將分、時計時單後設資料移mov 73h,77h 入對應顯示單元mov 74h,78hmov 75h,79hpop psw 恢復狀態字(出棧)pop acc 恢復累加器setb et0 開放t0中斷reti 中斷返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 閃動調時 程 序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;t1中斷服務程式,用作時間調整時調整單元閃爍指示intt1: push acc 中斷現場保護push pswmov tl1, #0b0h 裝定時器t1定時初值mov th1, #3chdjnz r2,intt1out 0.

3秒未到退出中斷(50ms中斷6次)mov r2,#06h 重灌0.3秒定時用初值cpl 02h 0.3秒定時到對閃爍標誌取反jb 02h,flash1 02h位為1時顯示單元"熄滅"mov 72h,76h 02h位為0時正常顯示mov 73h,77hmov 74h,78hmov 75h,79hintt1out:

pop psw 恢復現場pop accreti 中斷退出flash1: jb 01h,flash2 01h位為1時,轉小時熄滅控制mov 72h,7ah 01h位為0時,"熄滅符"資料放入分mov 73h,7ah 顯示單元(72h-73h),將不顯示分資料mov 74h,78hmov 75h,79hajmp intt1out 轉中斷退出flash2: mov 72h,76h 01h位為1時,"熄滅符"資料放入小時mov 73h,77h 顯示單元(74h-75h),小時資料將不顯示mov 74h,7ahmov 75h,7ahajmp intt1out 轉中斷退出;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 加1子 程 序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;add1:

mov a,@r0 取當前計時單後設資料到adec r0 指向前一地址swap a a中資料高四位與低四位交換orl a,@r0 前一地址中資料放入a中低四位add a,#01h a加1操作da a 十進位制調整mov r3,a 移入r3暫存器anl a,#0fh 高四位變0mov @r0,a 放回前一地址單元mov a,r3 取回r3中暫存資料inc r0 指向當前地址單元swap a a中資料高四位與低四位交換anl a,#0fh 高四位變0mov @r0,a 資料放入當削地址單元中ret 子程式返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程式 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;對計時單元復零用clr0: clr a 清累加器mov @r0,a 清當前地址單元dec r0 指向前一地址mov @r0,a 前一地址單元清0ret 子程式返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 時鐘調整程式 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;當調時按鍵按下時進入此程式setmm: clr et0 關定時器t0中斷clr tr0 關閉定時器t0lcall dl1s 呼叫1秒延時程式jb p3.

5,closedis 鍵按下時間小於1秒,關閉顯示(省電)mov r2,#06h 進入調時狀態,賦閃爍定時初值setb et1 允許t1中斷setb tr1 開啟定時器t1set2: jnb p3.5,set1 p3.

5口為0(鍵未釋放),等待setb 00h 鍵釋放,分調整閃爍標誌置1set4: jb p3.5,set3 等待鍵按下lcall dl05s 有鍵按下,延時0.

5秒jnb p3.5,sethh 按下時間大於0.5秒轉調小時狀態mov r0,#77h 按下時間小於0.

5秒加1分鐘操作lcall add1 呼叫加1子程式mov a,r3 取調整單後設資料clr c 清進位標誌cjne a,#60h,hhh 調整單後設資料與60比較hhh: jc set4 調整單後設資料小於60轉set4迴圈lcall clr0 調整單後設資料大於或等於60時清0clr c 清進位標誌ajmp set4 跳轉到set4迴圈closedis: setb et0 省電(led不顯示)狀態。

開t0中斷setb tr0 開啟t0定時器(開時鐘)close: jb p3.5,close 無按鍵按下,等待。

lcall display 有鍵按下,調顯示子程式延時削抖jb p3.5,close 是干擾返回close等待waith: jnb p3.

5,waith 等待鍵釋放ljmp start1 返回主程式(led資料顯示亮)sethh: clr 00h 分閃爍標誌清除(進入調小時狀態)sethh1: jnb p3.

5,set5 等待鍵釋放setb 01h 小時調整標誌置1set6: jb p3.5,set7 等待按鍵按下lcall dl05s 有鍵按下延時0.

5秒jnb p3.5,setout 按下時間大於0.5秒退出時間調整mov r0,#79h 按下時間小於0.

5秒加1小時操作lcall add1 調加1子程式mov a,r3clr ccjne a,#24h,houu 計時單後設資料與24比較houu: jc set6 小於24轉set6迴圈lcall clr0 大於或等於24時清0操作ajmp set6 跳轉到set6迴圈setout: jnb p3.

5,setout1 調時退出程式。等待鍵釋放lcall display 延時削抖jnb p3.5,setout 是抖動,返回setout再等待clr 01h 清調小時標誌clr 00h 清調分標誌clr 02h 清閃爍標誌clr tr1 關閉定時器t1clr et1 關定時器t1中斷setb tr0 開啟定時器t0setb et0 開定時器t0中斷(計時開始)ljmp start1 跳回主程式set1:

lcall display 鍵釋放等待時呼叫顯示程式(調分)ajmp set2 防止鍵按下時無時鐘顯示set3: lcall display 等待調分按鍵時時鐘顯示用ajmp set4set5: lcall display 鍵釋放等待時呼叫顯示程式(調小時)ajmp sethh1 防止鍵按下時無時鐘顯示set7:

lcall display 等待調小時按鍵時時鐘顯示用ajmp set6setout1: lcall display 退出時鐘調整時鍵釋放等待ajmp setout 防止鍵按下時無時鐘顯示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 顯示程式 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 顯示資料在70h-75h單元內,用六位led共陽數碼管顯示,p1口輸出段碼資料,p3口作; 掃描控制,每個led數碼管亮1ms時間再逐位迴圈。display:

mov r1,#70h 指向顯示資料首址mov r5,#0feh 掃描控制字初值play: mov a,r5 掃描字放入amov p2,a 從p3口輸出mov a,@r1 取顯示資料到amov dptr,#tab 取段碼錶地址movc a,@a+dptr 查顯示資料對應段碼mov p0,a 段碼放入p1口lcall dl1ms 顯示1msinc r1 指向下一地址mov a,r5 掃描控制字放入ajnb acc.5,endout acc.

5=0時一次顯示結束rl a a中資料迴圈左移mov r5,a 放回r5內ajmp play 跳回play迴圈endout: setb p2.5 一次顯示結束,p3口復位mov p0,#0ffh p1口復位ret 子程式返回tab:

db 0c0h,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延時程式,採用呼叫顯示子程式以改善led的顯示閃爍現象ds20ms: acall displayacall displayacall displayret;延時程式,用作按鍵時間的長短判斷dl1s: lcall dl05slcall dl05sretdl05s:

mov r3,#20h 8毫秒*32=0.196秒dl05s1: lcall displaydjnz r3,dl05s1retend 程式結束

微控制器控制led燈和一位數碼管, 51微控制器 我的學習板是LED和數碼管介面都是P0,請問怎麼樣實現分別控制呢?

體積大小可以不同,因為led電流小,但是電阻值要相同。還有焊接時有沒有短路開路,晶振不影響工作,隻影響精度。微控制器,全稱單片微型計算機 英語 single chip microcomputer 又稱微控制器 microcontroller 是把 處理器 儲存器 定時 計數器 timer count...

一位數碼管連在51微控制器上,按鍵後數碼管加1,按一下加1 怎樣用組合語言編寫,求程式非常感謝

做而論道 一位數碼管連在51微控制器上,按鍵後數碼管加1,按一下加1.sp1 equ p3.2 org 0000h mov 30h,3fh 0 mov 31h,06h 1 mov 32h,5bh 2 mov 33h,4fh 3 mov 34h,66h 4 mov 35h,6dh 5 mov 36h,...

51微控制器控制數碼管並顯示,51微控制器控制8個數碼管並顯示

啟巖 數碼管段選連線到微控制器p0口,位選連線到p2口org 0000h main call display ajmp main display mov r0,0 mov r1,0x01 mov dptr,tab loop inc r0 mov a,r0 movc a,a dptr mov p0,0...