線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2679
推到 Plurk!
推到 Facebook!

8051轉速錶之七段顯示器問題

答題得分者是:ScottWang
gn01673868
一般會員


發表:1
回覆:3
積分:0
註冊:2009-12-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-01-09 13:43:35 IP:140.127.xxx.xxx 訂閱
現在程式的問題是
七段顯示器會閃爍
不管怎麼調整延遲都一樣
不知道哪裡錯了
是否能請高手幫忙看一下
units equ 30H ;設定位址30H為個位數暫存器units
tens equ 31H ;設定位址31H為十位數暫存器tens
hundreds equ 32H ;設定位址32H為百位數暫存器hundreds
scancode equ 33H ;設定位址33H為掃描值暫存器scancode
org 0 ;程式由位址00H的地方開始存放
jmp start
start:
mov sp,#6fh ;設定堆疊存放位置從70H開始
mov tmod,#01100000b ;設定TMOD暫存器 (課本6-4)
;Timer1的工作模式為Mode2,且脈波源來自外部T1腳的數入脈波
;Timer0的工作模式為Mode0,且脈波源來自內部晶體振盪Fosc/12
mov th1,#0
mov tl1,#0
mov r7,#200
setb tr1
call delay1
mov a,tl1
clr tr1
jmp count
count:
mov b,#6 ;圓盤一圈洞數6放入暫存器b
div ab ;每秒訊號除以洞數6,a為商數(轉數rps),b為餘數
;==百位數==
mov b,#100 ;b放入100
div ab ;轉數除以100,a為百位數數值,b為餘數
mov hundreds,a ;百位數數值置入hundreds
;==十位數&個位數==
mov a,b ;百位數計算後的餘數放入a
mov b,#10 ;b放入10
div ab ;百位數計算後的餘數除以10,a為十位數,b為餘數
mov tens,a ;十位數數值置入tens
mov a,b ;個位數數值放入a (因暫存器不能直接移動到另一暫存器)
mov units,a ;個位數數值置入units

;==顯示七段顯示器==
mov scancode,#11111110b
mov r4,#3
mov r0,#2fh
loop:
inc r0
mov a,@r0
call accessdisplaycode
mov p0,a
mov p2,scancode
mov a,scancode
rl a
mov scancode,a
mov r6,#125 ;需作適當的時間延遲,掃描完4個顯示器大約花費
djnz r6,$ ;4 * 250us =1ms的時間
djnz r4,loop
jmp start
;==延遲副程式1==
delay1:
setb tr0
timer_loop:
mov tl0,#(2**13-5000).mod.32
mov th0,#(2**13-5000)/32
timer_wait:
jbc tf0,timer_ok
jmp timer_wait
timer_ok:
djnz r7,timer_loop
clr tr0
ret
;==取碼副程式==
accessdisplaycode:
mov dptr,#displaycodetable
movc a,@a dptr
ret
displaycodetable:
db c0h
db 0f9h
db 0a4h
db 0b0h
db 99h
db 92h
db 83h
db 0f8h
db 80h
db 98h
.end
附加檔案:4b4817873cbf2_RPM.txt
ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-01-09 17:59:29 IP:218.161.xxx.xxx 訂閱
顯示器的掃描時間,是根據人的視覺暫留而來的,大約20mS~40mS與一般鍵盤彈跳掃描差不多.

所以每一個位數的顯示時間最好需有20mS以上.
------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流,
中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓,
標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器.
接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備,
另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/
gn01673868
一般會員


發表:1
回覆:3
積分:0
註冊:2009-12-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-01-09 20:00:25 IP:140.127.xxx.xxx 訂閱

===================引 用 ScottWang 文 章===================
顯示器的掃描時間,是根據人的視覺暫留而來的,大約20mS~40mS與一般鍵盤彈跳掃描差不多.

所以每一個位數的顯示時間最好需有20mS以上.


我有嘗試著把顯示器掃描的延遲設在20ms
可是還是有問題
1~3位數會閃爍 第4位卻不會
是否和我主程式計數器延遲1秒有關?
ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-01-09 20:51:58 IP:218.161.xxx.xxx 訂閱
你可以把四位數的掃描程式寫成一個20mS~40mS的副程式,而這個副程式就當做是一個Delay的單元,以此單元再乘以倍數去達成所要的其它delay,這樣原來其它的delay與掃描程式就能共用,相容而不衝突了.


------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流,
中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓,
標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器.
接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備,
另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/
gn01673868
一般會員


發表:1
回覆:3
積分:0
註冊:2009-12-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-01-09 21:42:59 IP:140.127.xxx.xxx 訂閱

===================引 用 ScottWang 文 章===================
你可以把四位數的掃描程式寫成一個20mS~40mS的副程式,而這個副程式就當做是一個Delay的單元,以此單元再乘以倍數去達成所要的其它delay,這樣原來其它的delay與掃描程式就能共用,相容而不衝突了.


剛剛把主程式的delay先移除掉
結果顯示器顯示就ok
可是主程式不delay的話又不能計數1s內的訊號
如果秒數調低的話那計的又不準
是否有其他方法可以解決此問題呢?
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-01-10 09:14:14 IP:122.126.xxx.xxx 訂閱

[code delphi]
units equ 30H ;設定位址30H為個位數暫存器units
tens equ 31H ;設定位址31H為十位數暫存器tens
hundreds equ 32H ;設定位址32H為百位數暫存器hundreds
scancode equ 33H ;設定位址33H為掃描值暫存器scancode
read_flag equ 20h.0 ;宣告讀取旗標
org 0 ;程式由位址00H的地方開始存放
jmp start
org 0bh ;timer0中斷起始位址
jmp t0_int

start:
mov sp,#6fh ;設定堆疊存放位置從70H開始
mov tmod,#01100000b ;設定TMOD暫存器 (課本6-4)
;Timer1的工作模式為Mode2,且脈波源來自外部T1腳的數入脈波
;Timer0的工作模式為Mode0,且脈波源來自內部晶體振盪Fosc/12
mov ie,#81h ;中斷致能
main:
jb read_flag,loop
setb read_flag ;設定讀取旗標
mov th1,#0
mov tl1,#0
mov r7,#200
setb tr1
setb tr0
loop:
;==顯示七段顯示器==
mov scancode,#11111110b
mov r4,#3
mov r0,#2fh

inc r0
mov a,@r0
call accessdisplaycode
mov p0,a
mov p2,scancode
mov a,scancode
rl a
mov scancode,a
mov r6,#125 ;需作適當的時間延遲,掃描完4個顯示器大約花費
djnz r6,$ ;4 * 250us =1ms的時間
djnz r4,loop
jmp main

;==timer0中斷程式==
t0_int:
mov tl0,#(8192-5000) mod 32
mov th0,#(8192-5000)/32

djnz r7,t0_ret
mov a,tl1
clr tr1
mov b,#6 ;圓盤一圈洞數6放入暫存器b
div ab ;每秒訊號除以洞數6,a為商數(轉數rps),b為餘數

;==百位數==
mov b,#100 ;b放入100
div ab ;轉數除以100,a為百位數數值,b為餘數
mov hundreds,a ;百位數數值置入hundreds

;==十位數&個位數==
mov a,b ;百位數計算後的餘數放入a
mov b,#10 ;b放入10
div ab ;百位數計算後的餘數除以10,a為十位數,b為餘數
mov tens,a ;十位數數值置入tens
mov a,b ;個位數數值放入a (因暫存器不能直接移動到另一暫存器)
mov units,a ;個位數數值置入units

clr tr0
clr read_flag ;清除讀取旗標
t0_ret:
reti

;==取碼副程式==
accessdisplaycode:
mov dptr,#displaycodetable
movc a,@a dptr
ret

displaycodetable:
db 0c0h
db 0f9h
db 0a4h
db 0b0h
db 99h
db 92h
db 83h
db 0f8h
db 80h
db 98h

end[/code]

===================引 用 gn01673868 文 章===================

===================引 用 ScottWang 文 章===================
你可以把四位數的掃描程式寫成一個20mS~40mS的副程式,而這個副程式就當做是一個Delay的單元,以此單元再乘以倍數去達成所要的其它delay,這樣原來其它的delay與掃描程式就能共用,相容而不衝突了.


剛剛把主程式的delay先移除掉
結果顯示器顯示就ok
可是主程式不delay的話又不能計數1s內的訊號
如果秒數調低的話那計的又不準
是否有其他方法可以解決此問題呢?

gn01673868
一般會員


發表:1
回覆:3
積分:0
註冊:2009-12-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-01-13 06:06:42 IP:140.127.xxx.xxx 訂閱

===================引 用 ScottWang 文 章===================
你可以把四位數的掃描程式寫成一個20mS~40mS的副程式,而這個副程式就當做是一個Delay的單元,以此單元再乘以倍數去達成所要的其它delay,這樣原來其它的delay與掃描程式就能共用,相容而不衝突了.


感謝大大提供的意見
的確用這個方法連中斷都可以不用就可以正常顯示


ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-01-13 20:16:55 IP:59.115.xxx.xxx 訂閱
有一些技巧,可能書本找不到,而你所接觸的人也不知道,因為你的確也有在自己寫程式,所以弄懂意思後,照著技巧下去寫,你就學起來了,沒在寫程式的人,只想要現成的,告訴他這些是沒有用的,希望改天你也可以把它分享給有需要的人.
------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流,
中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓,
標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器.
接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備,
另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/
系統時間:2024-04-18 21:19:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!