程序編寫使用的是匯編語言,還有一些小問題,就是調溫之后顯示的溫度值不改變,需要按幾下復位鍵之后顯示才會改變。

單片機源程序如下:
- TEMPER_L EQU 36H ;存放讀出溫度低位數據
- TEMPER_H EQU 35H ;存放讀出溫度高位數據
- TEMPER_NUM EQU 60H ;存放轉換后的溫度值
- FLAG1 BIT 00H
- DQ BIT P3.2 ;一線總線控制端口
- ORG 0000H
- LJMP MAIN
- ORG 0100H
- MAIN:
- MOV SP,#70H
- LCALL GET_TEMPER ;從DS18B20讀出溫度數據
- LCALL TEMPER_COV ;轉換讀出的溫度數據并保存
-
- LCALL SHUJU
- LCALL HEX2BCD
- LCALL LOOP
- LCALL DISPLAY
- LCALL TAB
- SJMP [ DISCUZ_CODE_3 ]nbsp; ;完成一次數字溫度采集
-
- ;-------讀出轉換后的溫度值
- GET_TEMPER:
- SETB DQ ; 定時入口
- BCD: LCALL INIT_1820
- JB FLAG1,S22
- LJMP BCD ; 若DS18B20不存在則返回
- S22: LCALL DELAY1
- MOV A,#0CCH ; 跳過ROM匹配------0CC
- LCALL WRITE_1820
- MOV A,#44H ; 發出溫度轉換命令
- LCALL WRITE_1820
- NOP
- LCALL DELAY
- LCALL DELAY
- CBA: LCALL INIT_1820
- JB FLAG1,ABC
- LJMP CBA
- ABC: LCALL DELAY1
- MOV A,#0CCH ; 跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ; 發出讀溫度命令
- LCALL WRITE_1820
- LCALL READ_18200 ;READ_1820
- RET
- ;-------讀DS18B20的程序,從DS18B20中讀出一個字節的數據
- READ_1820:
- MOV R2,#8
- RE1: CLR C
- SETB DQ
- NOP
- NOP
- CLR DQ
- NOP
- NOP
- NOP
- SETB DQ
- MOV R3,#7
- DJNZ R3,$
- MOV C,DQ
- MOV R3,#23
- DJNZ R3,$
- RRC A
- DJNZ R2,RE1
- RET
- ;-------寫DS18B20的程序
- WRITE_1820:
- MOV R2,#8
- CLR C
- WR1: CLR DQ
- MOV R3,#6
- DJNZ R3,$
- RRC A
- MOV DQ,C
- MOV R3,#23
- DJNZ R3,$
- SETB DQ
- NOP
- DJNZ R2,WR1
- SETB DQ
- RET
- ;-------讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
- READ_18200:
- MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
- MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
- RE00: MOV R2,#8
- RE01: CLR C
- SETB DQ
- NOP
- NOP
- CLR DQ
- NOP
- NOP
- NOP
- SETB DQ
- MOV R3,#7
- DJNZ R3,$
- MOV C,DQ
- MOV R3,#23
- DJNZ R3,$
- RRC A
- DJNZ R2,RE01
- MOV @R1,A
- DEC R1
- DJNZ R4,RE00
- RET
- ;-------將從DS18B20中讀出的溫度數據進行轉換
- TEMPER_COV:
- MOV A,#0F0H
- ANL A,TEMPER_L ; 舍去溫度低位中小數點后的四位溫度數值
- SWAP A
- MOV TEMPER_NUM,A
- MOV A,TEMPER_L
- JNB ACC.3,TEMPER_COV1 ; 四舍五入去溫度值
- INC TEMPER_NUM
-
- TEMPER_COV1:
- MOV A,TEMPER_H
- ANL A,#07H
- SWAP A
- ADD A,TEMPER_NUM
- MOV TEMPER_NUM,A ; 保存變換后的溫度數據
- RET
- ;-------DS18B20初始化程序
- INIT_1820:
- CLR DQ
- MOV R0,#0FBH
- TSR1: DJNZ R0,TSR1 ; 延時
- SETB DQ
- MOV R0,#25H ;96US-25H
- TSR2: DJNZ R0,TSR2
- TSR3: SETB FLAG1 ; 置標志位,表示DS1820存在
- TSR6: DJNZ R0,TSR6 ; 延時
- TSR7: SETB DQ
- RET
- ;-------重新寫DS18B20暫存存儲器設定值
- RE_CONFIG:
- JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,轉RE_CONFIG1
- RET
- RE_CONFIG1:
- MOV A,#0CCH ; 發SKIP ROM命令
- LCALL WRITE_1820
- MOV A,#4EH ; 發寫暫存存儲器命令
- LCALL WRITE_1820
-
- MOV A,#00H ; TH(報警上限)中寫入00H
- LCALL WRITE_1820
- MOV A,#00H ; TL(報警下限)中寫入00H
- LCALL WRITE_1820
- MOV A,#7FH ; 選擇12位溫度分辨率
- LCALL WRITE_1820
- RET
- ;------------------延時子程序
- DELAY:
- MOV R7,#00H
- MIN: DJNZ R7,YS500
- RET
- YS500: LCALL YS500US
- LJMP MIN
- YS500US:MOV R6,#00H
- DJNZ R6,$
- RET
- DELAY1: MOV R7,#20H
- DJNZ R7,$
- RET
- SHUJU:
- MOV R0, #0H
- MOV R1, TEMPER_NUM
- CALL HEX2BCD ;調用子程序把R0 R1中的數字,轉換成BCD碼,送到R2 R3 R4;-------下面,把萬千百十個位,分別存入R4 R3 R2 R1 R0
- MOV A, R4
- MOV B, #16
- DIV AB ;除以16,目的是分離出高、低四位
- MOV 42H, A ;存放十位
- MOV 43H, B ;存放個位;
- MOV A, R2
- MOV R4, A ;存放萬位;
- MOV A, R3
- MOV B, #16
- DIV AB
- MOV 40H, A
- MOV 41H, B
- SJMP DISPLAY
- HEX2BCD: CLR A ;把R0 R1中的數字,轉換成BCD碼,送到R2 R3 R4
- MOV R2, A ;先清零
- MOV R3, A
- MOV R4, A
- MOV R5, #16 ;共轉換十六位數
- LOOP: CLR C
- MOV A,R1 ;從待轉換數的高端移出一位到Cy
- RLC A
- MOV R1,A
- MOV A, R0 ;搜索
- RLC A
- MOV R0,A
- MOV A,R4 ;送到BCD碼的低端
- ADDC A,R4 ;帶進位加。自身相加,相當于左移一位
- DA A ;十進制調整,變成BCD碼
- MOV R4,A
- MOV A,R3
- ADDC A,R3
- DA A
- MOV R3,A
- MOV A,R2
- ADDC A,R2
- MOV R2, A
- DJNZ R5, LOOP ;共轉換十六位數
- RET
-
-
- DISPLAY:MOV R1,#40H
- INC R1
- INC R1
- MOV R5,#0F1H
- MOV A,R5
- MOV P0,#0FFH
- MOV P2,A
- MOV A,@R1
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV P0,A
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- INC R1
- MOV R5,#0F2H
- MOV A,R5
- MOV P0,#0FFH
- MOV P2,A
- MOV A,@R1
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV R2,#80H
- ADD A,R2
- MOV P0,A
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
-
-
- AJMP DISPLAY
-
-
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
-
- END
-
復制代碼
所有資料51hei提供下載:
由于有會員測試打不開,已經被管理刪除
|