运用汇编语言用51单片机连接ds18b20芯片让其把温度显示到lcd数码管上的程序
时间: 2024-02-15 10:02:39 浏览: 88
ds18.rar_数码管 ds18
以下是一个基于汇编语言的51单片机连接DS18B20芯片并将温度显示在LCD数码管上的程序:
```
; 51单片机连接DS18B20并将温度显示在LCD数码管上的程序
; 作者:AI助手
; 定义连接DS18B20芯片的IO引脚
sbit DQ = P3^4
; 定义LCD数码管的引脚
sbit RS = P2^0
sbit RW = P2^1
sbit EN = P2^2
sbit D0 = P0^0
sbit D1 = P0^1
sbit D2 = P0^2
sbit D3 = P0^3
; 定义DS18B20芯片的命令字
#define SKIP_ROM 0xCC
#define CONVERT_T 0x44
#define READ_SCRATCHPAD 0xBE
; 定义LCD显示的初始位置
#define LCD_LINE1 0x80
#define LCD_LINE2 0xC0
; 定义温度变量
TEMP db ?
; 主程序
main:
; 初始化DS18B20芯片
mov DQ, #1
call ds18b20_reset
call ds18b20_write_byte, SKIP_ROM
call ds18b20_write_byte, CONVERT_T
; 等待温度转换完成
call delay_ms, 750
; 读取温度值
mov DQ, #1
call ds18b20_reset
call ds18b20_write_byte, SKIP_ROM
call ds18b20_write_byte, READ_SCRATCHPAD
call ds18b20_read_byte, TEMP
; 显示温度值
call lcd_init
call lcd_write_string, "Temperature:"
call lcd_set_cursor, LCD_LINE2
call lcd_write_hex, TEMP
; 程序结束
sjmp $
; DS18B20芯片复位函数
ds18b20_reset:
mov A, #0
clr C
mov DQ, #0
acall delay_us, 480
mov DQ, #1
acall delay_us, 60
jc ds18b20_reset
ret
; DS18B20芯片写字节函数
ds18b20_write_byte:
push ACC
push DPL
push DPH
mov R7, #8
ds18b20_write_bit:
mov ACC, DPL
anl ACC, #0x01
mov C, ACC
mov ACC, #0
mov DQ, ACC
acall delay_us, 2
mov ACC, C
jnc ds18b20_write_skip
mov ACC, #0x0F
ds18b20_write_skip:
mov DQ, ACC
acall delay_us, 60
mov DPL, DPL.1
rl DPH
djnz R7, ds18b20_write_bit
pop DPH
pop DPL
pop ACC
ret
; DS18B20芯片读字节函数
ds18b20_read_byte:
push ACC
push DPL
push DPH
mov R7, #8
ds18b20_read_bit:
mov ACC, #0
mov DQ, ACC
acall delay_us, 2
mov ACC, #0xFF
mov DQ, ACC
acall delay_us, 10
mov ACC, DPL
rlc ACC
mov DPL, ACC
mov ACC, DPH
rlc ACC
mov DPH, ACC
djnz R7, ds18b20_read_bit
pop DPH
pop DPL
pop ACC
ret
; LCD初始化函数
lcd_init:
mov RS, #0
mov RW, #0
mov D0, #0x38
acall lcd_write_cmd
mov D0, #0x0C
acall lcd_write_cmd
mov D0, #0x06
acall lcd_write_cmd
mov D0, #0x01
acall lcd_write_cmd
ret
; LCD写命令函数
lcd_write_cmd:
mov RS, #0
mov RW, #0
mov EN, #1
acall delay_us, 1
mov EN, #0
ret
; LCD写数据函数
lcd_write_data:
mov RS, #1
mov RW, #0
mov EN, #1
acall delay_us, 1
mov EN, #0
ret
; LCD写字符串函数
lcd_write_string:
mov R0, #0
mov R1, DPL
lcd_write_string_loop:
mov A, @R1
cjne A, #0, lcd_write_string_next
ret
lcd_write_string_next:
mov D0, A
acall lcd_write_data
inc R0
inc R1
sjmp lcd_write_string_loop
; LCD设置光标函数
lcd_set_cursor:
mov D0, DPL
orl D0, #0x80
acall lcd_write_cmd
ret
; LCD写16进制数函数
lcd_write_hex:
push ACC
push B
push DPL
push DPH
mov B, #4
lcd_write_hex_loop:
mov ACC, DPL
swap ACC
mov DPL, ACC
mov ACC, DPH
swap ACC
mov DPH, ACC
mov A, DPL
anl A, #0x0F
add A, #0x30
acall lcd_write_data
djnz B, lcd_write_hex_loop
pop DPH
pop DPL
pop B
pop ACC
ret
; 微秒级延时函数
delay_us:
push ACC
push B
mov B, #2
delay_us_loop:
djnz B, $
djnz ACC, delay_us_loop
pop B
pop ACC
ret
; 毫秒级延时函数
delay_ms:
push ACC
push B
mov B, #250
delay_ms_loop:
mov ACC, #184
delay_ms_loop_1:
djnz ACC, delay_ms_loop_1
djnz B, delay_ms_loop
pop B
pop ACC
ret
```
注意,以上代码只是一个简单的例子,具体实现可能因硬件连接、LCD型号、DS18B20芯片型号等因素而略有不同。
阅读全文