?? mcu.asm
字號:
cjne a,#30h,FUNCTION2_3 ;如果原來的次高位也是零,繼續滅掉。
;因為本電路要求待測電阻小于999R,那
;么最多滅兩個零就夠了。
mov a,RESULT2 ;
mov RESULT1,a ;
mov a,RESULT3 ;
mov RESULT2,a ;
mov a,RESULT4 ;
mov RESULT3,a ;
FUNCTION2_3: mov a,#LCD_CLS ;清屏。
call WRCMD ;
call WRRESULT ;調用寫結果字符串子程序。
jmp FUNCTION2_1 ;
;;;;;;;;;;;;;;;;測量電阻功能子程序結束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;DS18B20子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a,b,c,dptr,bank0區r2~r6
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION3: mov a,RETURNFLAG ;檢查返回標志,決定是否返回。
jz FUNCTION3_CON ;
jmp main ;
FUNCTION3_CON: call GET_TEMPERATURE ;
mov r2,#04h ;為簡化程序編寫,溫度精確到“度”。
FUNCTION3_1: clr c ;DS18B20HIGH,DS18B20LOW聯合左移位
;4次將溫度值全部移入DS18B20HIGH,
;最高bit為符號位,補碼格式。
mov a,DS18B20LOW ;
rlc a ;
mov DS18B20LOW,a ;
mov a,DS18B20HIGH ;
rlc a ;
mov DS18B20HIGH,a ;
djnz r2,FUNCTION3_1 ;
mov r2,#00h ;
mov a,DS18B20HIGH ;
jnb acc.7,FUNCTION3_2 ;如果溫度是負值,求反加1。
mov r2,#0FFh ;設定負值比標志。
cpl a ;
inc a ;
FUNCTION3_2: mov b,#0Ah ;以下顯示數據
div ab ;
mov r6,b ;
mov b,#0Ah ;
div ab ;
mov r4,a ;
mov r5,b ;
mov a,r6 ;最低位。
mov dptr,#LCD0 ;
movc a,@a+dptr ;
mov RESULT4,a ;
mov a,r5 ;次低位。
movc a,@a+dptr ;
mov RESULT3,a ;
mov a,r4 ;最高位。
movc a,@a+dptr ;
mov RESULT2,a ;
mov a,#12h ;℃符號。
movc a,@a+dptr ;
mov RESULT5,a ;
mov a,#00h ;
mov RESULT6,a ;
mov a,r2 ;
jz FUNCTION3_3 ;
mov a,#13h ;-符號。
movc a,@a+dptr ;
mov RESULT1,a ;
jmp FUNCTION3_4 ;
FUNCTION3_3: mov a,#14h ;+符號。
movc a,@a+dptr ;
mov RESULT1,a ;
FUNCTION3_4: mov a,#LCD_CLS ;
call WRCMD ;
call WRRESULT ;
mov r4,#010h ;這部分程序有兩個作用。
D15: mov r5,#0FFh ;1:設定2次溫度采集的間隔。
D16: mov r6,#0FFh ;2:如果要返回主菜單,請在LCD
;顯示結果后約2秒內按下鍵盤任意
;鍵。(約2秒是這里設定的時間)
D17: djnz r6,D17 ;
djnz r5,D17 ;
djnz r4,D17 ;
jmp FUNCTION3 ;
;;;;;;;;;;;;;;;;DS18B20子程序結束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;一組DS18B20操作子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;===============讀取溫度子程序==================================================================
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GET_TEMPERATURE:clr EA ;使用DS18B20一定要禁止任何
;中斷產生。
call INITDS18B20 ;調用初使化DS18B20子程序。
mov a,#0CCH ;
call WRITEDS18B20 ;送入跳過ROM命令。
mov a,#44H ;
call WRITEDS18B20 ;送入溫度轉換命令。
call INITDS18B20 ;溫度轉換完全,再次初使化
;DS18B20。
mov a,#0CCH ;
call WRITEDS18B20 ;送入跳過ROM命令。
mov a,#0BEH ;
call WRITEDS18B20 ;送入讀溫度暫存器命令。
call READDS18B20 ;
mov DS18B20LOW,a ;讀出溫度值低字節存入DS18B20LOW。
call READDS18B20 ;
mov DS18B20HIGH,a ;讀出謾度值高字節存入DS18B20HIGH。
setb EA ;開啟中斷。
ret ;
;===============讀取溫度子程序結束==============================================================
;===============初始化DS18B20子程序=============================================================
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用bank0區r6,r7
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INITDS18B20: clr EA ;
L0: clr p3.4 ;置DS18B20總線低復位狀態。
mov r7,#0C8h ;
L1: clr p3.4 ;
djnz r7,L1 ;總線復位電平保持400us。
setb p3.4 ;釋放DS18B20總線。
mov r7,#1Eh ;
L4: djnz r7,L4 ;釋放DS18B20總線狀態,保持
;60us。
clr c ;清存在信號。
orl c,p3.4 ;
jc L0 ;存在嗎?不存在則重新來。
mov r6,#50h ;
L5: orl c,p3.4 ;存在脈沖之后,要變為高電平。
jc L3 ;否則DS18B20出現異常錯誤,要
djnz r6,L5 ;重新初始化。詳細時序請參考
jmp L0 ;技術文檔。
L3: mov r7,#0F0h ;
L2: djnz r7,L2 ;
ret
;===============初始化DS18B20子程序結束=========================================================
;===============寫DS18B20子程序=================================================================
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a,bank0區r3,r4
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WRITEDS18B20: clr EA ;
mov r3,#08h ;寫入DS18B20的bit數。
WR1: setb p3.4 ;
mov r4,#08h ;
rrc a ;把一個字節分成8個bit移入C。
clr p3.4 ;開始寫入DS18B20,總線要處于
;低復位狀態 。
WR2: djnz r4,WR2 ;DS18B20總線復位保持16us。
mov p3.4,c ;寫入一個bit。
mov r4,#14h ;
WR3: djnz r4,WR3 ;等待40us
djnz r3,WR1 ;寫入下一個bit 。
setb p3.4 ;重新釋放DS18B20總線 。
ret ;
;===============寫DS18B20子程序結束=============================================================
;===============讀DS18B20子程序=================================================================
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a,bank0區r4,r5,r6
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
READDS18B20: clr EA ;
mov r6,#08h ;連續讀8個bit。
RE1: clr p3.4 ;讀前總線保持為低 。
mov r4,#04h ;
nop ;
setb p3.4 ;開始讀總線釋放 。
RE2: djnz r4,RE2 ;持續8us。
mov c,p3.4 ;從DS18B20總線讀得一個bit。
rrc a ;把讀得的位值環移給a。
mov r5,#1Eh ;
RE3: djnz r5,RE3 ;持續60us。
djnz r6,RE1 ;讀下一個bit。
setb p3.4 ;重新釋放DS18B20總線。
ret ;
;===============讀DS18B20子程序=================================================================
;;;;;;;;;;;;;;;;一組DS18B20操作子程序結束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;自動計數子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a,b,dptr,bank0區r4~r7
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION4: mov a,#00h ;初始賦值。
mov AUTOCOUNTER,a ;保存在34h中。
FUNCTION4_1: mov a,RETURNFLAG ;檢查返回標志,決定是否返回。
jz FUNCTION4_CON ;
jmp main ;
FUNCTION4_CON: mov a,AUTOCOUNTER ;恢復計數值。
inc a ;加一。
cjne a,#64h,NO_ROUND1 ;如果超過99,那么返回00。
mov a,#00h ;
NO_ROUND1: mov AUTOCOUNTER,a ;
mov b,#0Ah ;
div ab ;除以10,高位(商)在a中。
;低位(余數)在b中。
mov r4,a ;
mov a,b ;先顯示低位。
mov dptr,#SEGMENT7 ;
movc a,@a+dptr ;取得該數字對應的7段數碼管的數值。
cpl a ;注意數碼管采用共陽極電路,所以求反。
mov dptr,#8500h ;7段數碼管B對應低位。
movx @dptr,a ;顯示。
mov a,r4 ;再顯示高位。
mov dptr,#SEGMENT7 ;
movc a,@a+dptr ;
cpl a ;
mov dptr,#8400h ;
movx @dptr,a ;
mov r5,#05h ;以下延遲一段時間,可自行調整。
D6: mov r6,#80h ;
D7: mov r7,#80h ;
D8: djnz r7,D8 ;
djnz r6,D7 ;
djnz r5,D6 ;
jmp FUNCTION4_1 ;循環計數。
SEGMENT7: db 3Fh ;7段數碼管字符0的abcdefg的值,
;a在最低位,最高位始終保留為0。
db 06h ;7段數碼管字符1的abcdefg的值。
db 5Bh ;7段數碼管字符2的abcdefg的值。
db 4Fh ;7段數碼管字符3的abcdefg的值。
db 66h ;7段數碼管字符4的abcdefg的值。
db 6Dh ;7段數碼管字符5的abcdefg的值。
db 7Dh ;7段數碼管字符6的abcdefg的值。
db 07h ;7段數碼管字符7的abcdefg的值。
db 7Fh ;7段數碼管字符8的abcdefg的值。
db 6Fh ;7段數碼管字符9的abcdefg的值。
; a
; ■■■■■
; ■ ■
; f■ ■b
; ■ g ■
; ■■■■■
; ■ ■
; e■ ■c
; ■ ■
; ■■■■■
; d
;;;;;;;;;;;;;;;;自動計數子程序結束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;LED顯示子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a,c,dptr,bank0區r4~r7
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION5: mov a,RETURNFLAG ;檢查返回標志,決定是否返回。
jz FUNCTION5_CON ;這段程序返回主菜單時可能反應比較慢,
jmp main ;原因是必須完成一次顯示循環才判斷是
;否返回。所以請耐心等待。
FUNCTION5_CON: mov dptr,#8600h ;沒有什么可以解釋的,就是讓LED陣列閃,
FUNCTION5_1: setb c ;爍,有一種漂亮的效果。您可以發揮自己
mov a,#00h ;的想象力,隨意創作。作者只是給出一個
mov r4,#08h ;簡單的例子。
FUNCTION5_2: movx @dptr,a ;
call F5DELAY ;
rlc a ;
djnz r4,FUNCTION5_2 ;
setb c ;
mov a,#00h ;
mov r4,#08h ;
FUNCTION5_3: movx @dptr,a ;
call F5DELAY ;
rrc a ;
djnz r4,FUNCTION5_3 ;
clr c ;
mov a,#0FFh ;
mov r4,#08h ;
FUNCTION5_4: movx @dptr,a ;
call F5DELAY ;
rlc a ;
djnz r4,FUNCTION5_4 ;
clr c ;
mov a,#0FFh ;
mov r4,#08h ;
FUNCTION5_5: movx @dptr,a ;
call F5DELAY ;
rrc a ;
djnz r4,FUNCTION5_5 ;
jmp FUNCTION5 ;
F5DELAY: mov r5,#05h ;在此調整時間間隔。
D9: mov r6,#80h ;
D10: mov r7,#80h ;
D11: djnz r7,D11 ;
djnz r6,D10 ;
djnz r5,D9 ;
ret ;
;;;;;;;;;;;;;;;;LED顯示子程序結束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;虛擬串口通信子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>資源占用報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>臨時占用a,dptr,bank0區r5~r7
;>>>>>>>>>>>>>>>報告完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;'''''''''''''''友情提示''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
;1:使用此功能,您需要有兩個必備軟件:虛擬串口軟件和串口調試軟件。
;2:請連接http://siwawa9000.gbaopan.com,獲得相關軟件和使用指南。
;'''''''''''''''提示完畢''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
FUNCTION6: call COMMINITIALIZATION ;調用串口初始化子程序。
FUNCTION6_1: mov a,RETURNFLAG ;檢查返回標志,決定是否返回。
jz FUNCTION6_CON ;
clr TR1 ;關閉定時器1。
jmp main ;
FUNCTION6_CON: clr ES ;禁止串行中斷。
clr RI ;清除接收標志位。
mov dptr,#SERIAL ;
mov a,COMINDEX ;
movc a,@a+dptr ;
jz FUNCTION6_3 ;
mov SBUF,a ;發送。這段程序的功能就是把可打
;印的ASCII字符顯示出來。
FUNCTION6_2: jnb TI,FUNCTION6_2 ;等待發送完畢。
clr TI ;清除發送中斷標志。
setb ES ;允許串行中斷。
mov a,COMINDEX ;
inc a ;
mov COMINDEX,a ;
call F6DELAY ;
jmp FUNCTION6_1 ;
FUNCTION6_3: mov COMINDEX,#00h ;
setb ES ;
jmp FUNCTION6_1 ;
F6DELAY: mov r5,#02h ;在此調整時間間隔。
D23: mov r6,#80h ;
D24: mov r7,#80h ;
D25: djnz r7,D25 ;
djnz r6,D24 ;
djnz r5,D23 ;
ret ;
;;;;;;;;;;;;;;;;虛擬串口通信子程序結束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMMINITIALIZATION:
mov TMOD,#20h ;設置定時器T1工作方式2。
mov TL1,#0F3h ;定時器計數初值,波特率2400。
mov TH1,#0F3h ;定時器重裝值。
setb EA ;允許總的中斷。
setb ES ;允許串行中斷。
mov PCON,#00h ;波特率不倍增。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -