以51单片机为核心器件,以DS18B20数字芯片为传感器件,设计一个数字温度计;系统应能在上位机串口助手软件接收窗口上温度信息,使用汇编语言的代码怎么写
时间: 2024-02-15 16:02:46 浏览: 159
好的,我会为你解答这个问题。以下是基于51单片机和DS18B20数字温度传感器的数字温度计的汇编代码实现:
```
; 定义寄存器
sfr P0 = 0x80 ; 定义P0口
sfr P2 = 0xA0 ; 定义P2口
sfr DPL = 0x82 ; 定义DPL寄存器
sfr DPH = 0x83 ; 定义DPH寄存器
sfr TMOD = 0x89 ; 定义TMOD寄存器
sfr TL0 = 0x8A ; 定义TL0寄存器
sfr TH0 = 0x8C ; 定义TH0寄存器
sfr SCON = 0x98 ; 定义SCON寄存器
; 定义常量
#define DS18B20_DQ P2^0 ; 定义DS18B20的DQ引脚为P2.0
; 定义变量
TEMP DB 0 ; 定义存储温度值的变量
; 定义子程序
INIT_DS18B20 PROC ; 初始化DS18B20
MOV DS18B20_DQ, #1 ; DQ引脚电平为高
ACALL DELAY_US ; 延时
MOV DS18B20_DQ, #0 ; DQ引脚电平为低
ACALL DELAY_US ; 延时
MOV DS18B20_DQ, #1 ; DQ引脚电平为高
ACALL DELAY_US ; 延时
RET ; 返回
ENDP
WRITE_DS18B20 PROC ; 向DS18B20传输数据
MOV R7, #08H ; R7为传输位数,8位
MOV A, TEMP ; 将温度值存入A寄存器
MOV R6, #0 ; R6为移位计数器,初始化为0
LOOP:
RRC A ; 将A寄存器中的数据右移一位
MOV DS18B20_DQ, C ; 将移位后的最低位存入DQ引脚
ACALL DELAY_US ; 延时
CLR DS18B20_DQ ; DQ引脚电平为低
ACALL DELAY_US ; 延时
SETB DS18B20_DQ ; DQ引脚电平为高
ACALL DELAY_US ; 延时
DJNZ R7, LOOP ; 如果传输位数不为0,则跳转到LOOP
RET ; 返回
ENDP
READ_DS18B20 PROC ; 从DS18B20读取数据
MOV R7, #08H ; R7为读取位数,8位
MOV A, #0 ; 初始化A寄存器为0
LOOP:
CLR DS18B20_DQ ; DQ引脚电平为低
ACALL DELAY_US ; 延时
SETB DS18B20_DQ ; DQ引脚电平为高
ACALL DELAY_US ; 延时
MOV C, DS18B20_DQ ; 将DQ引脚电平值存入C
RLC A ; 将读取到的位数左移一位,并将DQ引脚电平值存入A
DJNZ R7, LOOP ; 如果读取位数不为0,则跳转到LOOP
RET ; 返回
ENDP
DELAY_US PROC ; 微秒级延时函数
; 需要根据实际情况调整延时时间
; 这里默认延时1微秒
MOV R0, #1
MOV R1, #0
DELAY_LOOP:
DJNZ R1, $
DJNZ R0, DELAY_LOOP
RET
ENDP
; 主程序
MAIN:
; 初始化串口
MOV SCON, #50H ; 8位数据,波特率9600
SETB TI ; 允许发送数据
; 初始化定时器0
MOV TMOD, #01H ; 定时器0工作在模式1
MOV TL0, #0 ; 定时器0计数器初值为0
MOV TH0, #0 ; 定时器0重装初值为0
SETB TR0 ; 启动定时器0
; 初始化DS18B20
ACALL INIT_DS18B20
; 发送读取温度命令
ACALL WRITE_DS18B20
MOV DS18B20_DQ, #1 ; DQ引脚电平为高
ACALL DELAY_US ; 延时
ACALL READ_DS18B20 ; 读取温度值
MOV TEMP, A ; 将读取到的温度值存入TEMP变量
; 发送温度值到上位机
MOV A, TEMP ; 将温度值存入A寄存器
MOV SBUF, A ; 将A寄存器中的数据发送到串口
WAIT_SEND:
JNB TI, WAIT_SEND ; 等待数据发送完成
CLR TI ; 发送完成,清除TI位
; 循环运行
SJMP MAIN
END
```
这个程序的实现思路是:首先通过INIT_DS18B20子程序初始化DS18B20,然后通过WRITE_DS18B20子程序向DS18B20传输温度读取命令,再通过READ_DS18B20子程序从DS18B20读取温度值。最后,将读取到的温度值存入TEMP变量中,并通过串口发送到上位机。程序通过定时器0定时延时,以保证程序运行的稳定性。
值得注意的是,这个程序需要根据实际情况进行调整,特别是DELAY_US子程序中的延时时间,需要根据实际情况进行设置。
阅读全文