單片機匯編源程序如下:
- ;這是關于單個DS18B20的測溫程序,數據腳為P3.3,晶振是11.059MHZ
- ;溫度傳感器18B20采用器件默認的12位轉化,最大轉化時間要750毫秒
- ;用1602液晶屏顯示,顯示溫度從00到99度,精確到0.0625度
- ;內存分配聲明
- TEMPER_L EQU 29H;用于保存讀出溫度的低字節
- TEMPER_H EQU 28H;用于保存讀出溫度的高字節
- T_DF EQU 27H ;FORMAT后的小數部分(decimal fraction),半字節的溫度小數(存在低四位)
- T_INTEGER EQU 26H ;FORMAT后的整數部分(integer),將兩字節的溫度整合成1字節
- FLAG1 BIT 50H;位地址50H是字節2AH的最低位,用作是否檢測到DS18B20的標志位
- A_BIT EQU 20h ;液晶十位數存放內存位置
- B_BIT EQU 21h ;液晶個位數存放內存位置
- C_BIT EQU 22H ;個位小數
- D_BIT EQU 23H ;十位小數
- E_BIT EQU 24H ;百位小數
- F_BIT EQU 25H ;千位小數
- RS BIT P2.0 ;這3位是液晶屏的控制信號,連接方式由具體硬件而定
- RW BIT P2.1
- E BIT P2.2
- ORG 0000H
- LJMP MAIN
- ORG 0100H
- MAIN:
- LCALL INIT_RS232
- CLR P1.3
- LCALL T_CONVERSION;調用讀溫度子程序
- LCALL T_FORMAT;將讀出的2字節溫度格式化
- LCALL DISPLAY;調用液晶顯示子程序
- LCALL D1S;延時1秒后再測
- LJMP MAIN
- ;--------------DS18B20的溫度轉換子程序,具體時序請參考資料-------------------
- T_CONVERSION: LCALL INIT_1820;先復位DS18B20
- JB FLAG1,T_C0
- RET ; 判斷DS1820是否存在 若DS18B20不存在則返回
- T_C0: MOV A,#0CCH ; 跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#44H ; 發出溫度轉換命令
- LCALL WRITE_1820
- LCALL D1S ;這里等待AD轉換結束,12位的話要延時750m秒
- LCALL INIT_1820;準備讀溫度前先復位
- MOV A,#0CCH ; 跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ; 發出讀溫度命令
- LCALL WRITE_1820
- LCALL READ_1820; 將讀出的溫度數據保存到28H(TEMPER_H)和29H(TEMPER_L)處
- RET
- ;------DS18B20復位初始化程序-----------------------------------------
- INIT_1820: SETB P3.3
- NOP
- CLR P3.3
- MOV R0,#2 ;主機發出延時500微秒的復位低脈沖
- INIT0: MOV R1,#250
- DJNZ R1,$
- DJNZ R0,INIT0
- SETB P3.3;然后拉高數據線
- NOP
- MOV R0, #15
- INIT1: JNB P3.3, INIT3;延時60us等待DS18B20回應
- DJNZ R0, INIT1
- LJMP INIT4 ; 超時而沒有響應
- INIT3: SETB FLAG1 ; 置標志位,表示DS1820存在
- LJMP INIT5
- INIT4: CLR FLAG1 ; 清標志位,表示DS1820不存在
- LJMP INIT6
- INIT5: MOV R0, #120
- DJNZ R0, $ ; 延時240us
- INIT6: SETB P3.3
- RET
- ;---------寫DS18B20的子程序(有具體的時序要求)-------------------------------------
- WRITE_1820: MOV R2,#8;一共8位數據
- WR0: CLR P3.3
- MOV R3,#6
- DJNZ R3,$
- RRC A
- MOV P3.3,C
- MOV R3,#20
- DJNZ R3,$
- SETB P3.3
- NOP
- NOP
- DJNZ R2,WR0
- SETB P3.3
- RET
- ;------讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據--------------------------
- READ_1820: MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
- MOV R1,#TEMPER_L ; 低位存入29H(TEMPER_L)
- RE0: MOV R2,#8
- RE1: SETB P3.3
- NOP
- NOP
- CLR P3.3
- NOP
- NOP
- SETB P3.3
- MOV R3,#5
- DJNZ R3, $
- MOV C,P3.3
- MOV R3,#20
- DJNZ R3, $
- RRC A
- DJNZ R2,RE1
- MOV @R1,A
- DEC R1 ; 高位存入28H(TEMPER_H)
- DJNZ R4,RE0
- RET
- ;-----整合讀出的兩字節溫度(關于DS18B20讀出的2字節溫度格式請參考資料)----------
- T_FORMAT: MOV A, #0FH
- ANL A, TEMPER_L
- MOV T_DF, A ;獲得小數部分(4位)
- MOV A, TEMPER_L
- SWAP A
- MOV TEMPER_L, A
- MOV A, TEMPER_H
- SWAP A
- MOV R0, #TEMPER_L
- XCHD A, @R0
- MOV T_INTEGER, A ;獲得整數部分(1字節)
- RET
- ;-------液晶顯示的子程序(顯示前先格式轉換)---------------------------------------
- DISPLAY: mov a, T_INTEGER
- mov b,#10
- div ab
- mov A_BIT,a ;十位存在A_BIT
- mov B_BIT,b ;個位存在B_BIT
- MOV A, T_DF
- MOV R0, #C_BIT
- MOV R2, #4
- D0: MOV B, #10
- MUL AB
- MOV B, #16
- DIV AB
- MOV @R0, A ;從個位小數C_BIT,到十位D_BIT,百位E_BIT,千位F_BIT
- INC R0
- MOV A, B
- DJNZ R2, D0
- ;----二進制到ASCII碼轉換--------------
- MOV A, #30H
- ORL A_BIT, A
- ORL B_BIT, A
- ORL C_BIT, A
- ORL D_BIT, A
- ORL E_BIT, A
- ORL F_BIT, A
- ;-------------------------------------
- LCALL INITIAL
- MOV A, #10000000B ; LINE1: DB 'Now is:',00H
- LCALL WRITE_INSTRUCTION
- MOV DPTR, #LINE1
- LCALL PR_STRING
- MOV A, A_BIT
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, B_BIT
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, #2EH
- LCALL TX_CHAR;'.'字符
- LCALL WRITE_LCDDATA
- MOV A, C_BIT
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, D_BIT
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, E_BIT
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, F_BIT
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, #0DFH ;下面兩個是攝氏度的數字符號
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, #43H
- LCALL TX_CHAR
- LCALL WRITE_LCDDATA
- MOV A, #0AH
- LCALL TX_CHAR
-
- mov a, #11000000B ; LINE2: DB 'WANG XUE MIN!',00H
- Lcall write_instruction
- MOV DPTR, #LINE2
- LCALL PR_STRING
- RET
- ;---液晶屏初始化,具體請參考資料-------------------------------------------------
- initial: MOV A, #01H
- LCALL WRITE_INSTRUCTION
- MOV A, #38H
- LCALL WRITE_instruction
- MOV A, #0FH
- LCALL WRITE_instruction
- MOV A, #06H
- LCALL WRITE_instruction
- RET
- ;----寫液晶指令的子程序------------------------------------------
- WRITE_instruction: MOV P0, A
- CLR RS ;寫入控制命令
- CLR RW
- CLR E
- LCALL DELAY
- SETB E
- RET
- ;----寫液晶數據的子程序---------------------------------------------
- write_lcddata: MOV P0, A
- SETB RS ;寫入數據
- CLR RW
- CLR E
- LCALL DELAY ;判斷液晶模塊是否忙
- SETB E
- RET
- ;-----寫行字符的子程序---------------------------------------------------------------
- PR_STRING: CLR A
- MOVC A, @A+DPTR
- JZ END_PR
- LCALL WRITE_LCDDATA
- INC DPTR
- LJMP PR_STRING
- END_PR: RET
- ;----查看液晶忙碌信號的子程序---------------------------------------------------------
- DELAY: MOV P0,#0FFH ;判斷液晶顯示器是否忙的子程序
- CLR RS
- SETB RW
- CLR E
- NOP
- SETB E
- JB P0.7,DELAY ;如果P1.7為高電平表示忙就循環等待
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
95060445lcd1602-18B20.rar
(15.69 KB, 下載次數: 72)
2017-12-18 17:26 上傳
點擊文件名下載附件
|