51单片机数字湿度计汇编语言程序
时间: 2023-11-08 18:03:55 浏览: 178
以下是51单片机数字湿度计汇编语言程序的基本框架,你可以根据自己的具体需求进行修改:
```
; 51单片机数字湿度计汇编语言程序
; 包含DHT11传感器读取和LCD1602液晶显示屏驱动程序
; 定义常量
DHT11 equ P3.7 ; DHT11传感器数据线引脚
; 定义变量
dat: db 5 dup(0) ; 存储DHT11传感器读取的数据
str: db 16 dup(0) ; 存储字符串
; DHT11传感器开始信号
DHT11_Start:
clr DHT11 ; 主机将总线拉低至少18ms
mov R2,#30
l1: djnz R2,$
setb DHT11 ; 主机将总线拉高,等待DHT11响应
l2: jnb DHT11,l2
l3: jb DHT11,l3
; 读取DHT11传感器数据
DHT11_Read:
mov R1,#8
mov R0,#0
l4: jnb DHT11,l4
nop
nop
rlc dat
jnb DHT11,$
l5: jb DHT11,l5
djnz R1,l4
mov R1,#8
mov R0,#0
l6: jnb DHT11,l6
nop
nop
rlc dat+1
jnb DHT11,$
l7: jb DHT11,l7
djnz R1,l6
mov R1,#8
mov R0,#0
l8: jnb DHT11,l8
nop
nop
rlc dat+2
jnb DHT11,$
l9: jb DHT11,l9
djnz R1,l8
mov R1,#8
mov R0,#0
l10: jnb DHT11,l10
nop
nop
rlc dat+3
jnb DHT11,$
l11: jb DHT11,l11
djnz R1,l10
mov R1,#8
mov R0,#0
l12: jnb DHT11,l12
nop
nop
rlc dat+4
jnb DHT11,$
l13: jb DHT11,l13
djnz R1,l12
; 主程序
Main:
; 初始化LCD1602液晶显示屏
call LCD_Init
l14: ; 循环读取DHT11传感器数据
; 发送开始信号
call DHT11_Start
; 读取数据
call DHT11_Read
; 提取湿度和温度值
mov A,dat
mov hum,A
mov A,dat+2
mov temp,A
; 数据校验
mov A,dat+1
orl A,dat+3
jz l14
; 清屏
call LCD_Clear
; 格式化字符串
mov R0,#0
mov R1,#16
mov R2,#0
l15: mov A,R0
add A,#'H'
mov str+R2,A
inc R2
mov A,R0
add A,#'u'
mov str+R2,A
inc R2
mov A,R0
add A,#'m'
mov str+R2,A
inc R2
mov A,#':'
mov str+R2,A
inc R2
mov A,hum
div AB,#10
mov A,B
add A,#'0'
mov str+R2,A
inc R2
mov A,dat
anl A,#0x0f
add A,#'0'
mov str+R2,A
inc R2
mov A,#'.'
mov str+R2,A
inc R2
mov A,hum
anl A,#0x0f
add A,#'0'
mov str+R2,A
inc R2
mov A,#'%'
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
mov A,#0
mov str+R2,A
inc R2
; 写入字符串
mov R0,#0
mov R1,#16
mov R2,#0
l16: mov A,str+R2
mov R4,#1
mov R5,#0
l17: mov R3,#5
l18: djnz R3,$
djnz R5,l18
djnz R4,l17
mov P0,A
setb P2.5
clr P2.6
setb P2.6
djnz R1,l16
; 延时500ms
mov R0,#50
l19: mov R1,#110
l20: djnz R1,$
djnz R0,l19
; 跳转到循环开始
sjmp l14
; LCD1602液晶显示屏初始化程序
LCD_Init:
mov R0,#0x38 ; 2行显示,5x7点阵,8位数据
call LCD_Cmd
mov R0,#0x0c ; 显示开,光标不显示
call LCD_Cmd
mov R0,#0x06 ; 每次输入后光标右移,整屏不动
call LCD_Cmd
mov R0,#0x01 ; 清屏
call LCD_Cmd
ret
; LCD1602液晶显示屏命令写入程序
LCD_Cmd:
mov P0,A
clr P2.5
clr P2.6
setb P2.6
ret
; LCD1602液晶显示屏数据写入程序
LCD_Data:
mov P0,A
setb P2.5
clr P2.6
setb P2.6
ret
; LCD1602液晶显示屏清屏程序
LCD_Clear:
mov R0,#0x01
call LCD_Cmd
ret
; LCD1602液晶显示屏写入字符串程序
LCD_Write_String:
mov R2,#0 ; 行号
mov R3,#0 ; 列号
mov R4,#0 ; 字符串指针
l21: mov A,#0x80 ; 第一行
orl A,R2
call LCD_Cmd
mov A,R3
add A,#0x40 ; 第一行第二行地址偏移
call LCD_Cmd
mov A,str+R4
cjne A,#0,l22
ret
l22: call LCD_Data
inc R3
inc R4
djnz R1,l21
ret
; 延时函数
delay:
mov R0,#1
mov R1,#1
l23: djnz R1,$
djnz R0,l23
ret
; 主程序入口
org 0
sjmp Main
```
上述代码依赖于 `LCD1602` 的液晶显示屏驱动程序,你需要自行编写该程序并将其包含在代码中。同时,由于 DHT11 传感器的数据通信是时序严格的,因此需要使用 `nop` 指令进行空操作来调整时序。
阅读全文