lcd1602c显示温度语言编程,单片机+lcd1602显示温度汇编语言程序-精确到0.0625度
;這是關于單個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黑下載附件…………
總結
以上是生活随笔為你收集整理的lcd1602c显示温度语言编程,单片机+lcd1602显示温度汇编语言程序-精确到0.0625度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs,express链式反应
- 下一篇: WinRAR和WinZIP 密码找回