以51单片机为核心器件,以DS18B20数字芯片为传感器件,设计一个数字温度计;系统应能在上位机串口助手软件接收窗口上湿度、温度信息;显示精度自定义。汇编语言
时间: 2024-01-21 12:19:30 浏览: 30
由于汇编语言的具体实现会受到具体的开发环境和硬件平台限制,下面给出一个大致的实现思路和代码框架供参考。
1. 初始化DS18B20传感器
首先需要进行DS18B20传感器的初始化。在51单片机上,可以通过模拟OneWire协议来实现。具体步骤如下:
(1)发送复位信号
(2)发送跳过ROM指令
(3)发送温度转换指令
初始化过程的代码实现如下:
```assembly
INIT_DS18B20:
; 发送复位信号
CALL RESET_DS18B20
; 发送跳过ROM指令
CALL SKIP_ROM
; 发送温度转换指令
CALL CONVERT_T
RET
```
2. 读取DS18B20传感器数据
DS18B20传感器将温度数据以9位或12位精度存储在内部寄存器中,需要通过读取寄存器的方式获取温度值。读取温度值的步骤如下:
(1)发送复位信号
(2)发送跳过ROM指令
(3)发送读取温度指令
(4)读取温度数据
读取温度数据的代码实现如下:
```assembly
READ_DS18B20:
; 发送复位信号
CALL RESET_DS18B20
; 发送跳过ROM指令
CALL SKIP_ROM
; 发送读取温度指令
CALL READ_TEMP
; 读取温度数据
CALL READ_DATA
RET
```
3. 发送数据到上位机
最后需要将获取到的温度数据通过串口发送到上位机。在51单片机上,可以使用UART模块实现串口通信。具体步骤如下:
(1)初始化UART模块
(2)打开串口发送中断
(3)将温度数据转换为字符串格式
(4)发送字符串到上位机
发送数据到上位机的代码实现如下:
```assembly
SEND_DATA:
; 初始化UART模块
CALL INIT_UART
; 打开串口发送中断
CALL ENABLE_UART_TX_INTERRUPT
; 将温度数据转换为字符串格式
CALL CONVERT_TEMP_TO_STRING
; 发送字符串到上位机
CALL SEND_STRING
RET
```
完整代码实现如下:
```assembly
; DS18B20传感器的引脚定义
DS18B20_PIN EQU P1.0
; UART模块的波特率定义
UART_BAUDRATE EQU 9600
; 温度数据的精度定义
TEMP_PRECISION EQU 9
; 温度数据的缓冲区大小定义
TEMP_BUFFER_SIZE EQU 10
; 初始化DS18B20传感器
INIT_DS18B20:
; 发送复位信号
CALL RESET_DS18B20
; 发送跳过ROM指令
CALL SKIP_ROM
; 发送温度转换指令
CALL CONVERT_T
RET
; 重置DS18B20传感器
RESET_DS18B20:
; 拉低引脚,持续480us
SETB DS18B20_PIN
MOV R7, #120
DELAY:
NOP
DJNZ R7, DELAY
; 释放引脚,等待60us
CLR DS18B20_PIN
MOV R7, #15
DELAY2:
NOP
DJNZ R7, DELAY2
; 读取引脚状态,等待420us
SETB DS18B20_PIN
MOV R7, #105
DELAY3:
NOP
DJNZ R7, DELAY3
; 返回读取到的引脚状态
MOV A, DS18B20_PIN
RET
; 跳过DS18B20传感器的ROM码
SKIP_ROM:
; 发送跳过ROM指令
MOV A, #0xCC
CALL WRITE_BYTE
RET
; 发送温度转换指令
CONVERT_T:
; 发送温度转换指令
MOV A, #0x44
CALL WRITE_BYTE
; 等待转换完成
MOV R7, #20
DELAY4:
NOP
DJNZ R7, DELAY4
RET
; 读取温度数据
READ_TEMP:
; 发送读取温度指令
MOV A, #0xBE
CALL WRITE_BYTE
RET
; 读取数据
READ_DATA:
; 初始化数据缓冲区指针
MOV R6, #TEMP_BUFFER_SIZE
MOV R5, #0
; 读取温度数据
READ_LOOP:
; 读取一位数据
CALL READ_BYTE
; 将数据写入缓冲区
MOV [TEMP_BUFFER + R5], A
INC R5
; 判断是否读取完整个缓冲区
DJNZ R6, READ_LOOP
; 返回读取到的温度数据
MOV A, [TEMP_BUFFER]
RET
; 写入一个字节的数据
WRITE_BYTE:
; 初始化数据位计数器
MOV R6, #8
; 循环发送每一位数据
WRITE_LOOP:
; 获取当前数据位的值
MOV C, A.0
; 发送数据位
SETB DS18B20_PIN
MOV R7, #1
JNC SKIP_DELAY
MOV R7, #5
SKIP_DELAY:
NOP
DJNZ R7, $
CLR DS18B20_PIN
; 延时
MOV R7, #3
NOP_LOOP:
NOP
DJNZ R7, NOP_LOOP
; 移位
RLC A
; 判断是否发送完8位数据
DJNZ R6, WRITE_LOOP
RET
; 读取一个字节的数据
READ_BYTE:
; 初始化数据位计数器
MOV R6, #8
MOV A, #0
; 循环读取每一位数据
READ_LOOP:
; 获取当前数据位的值
SETB DS18B20_PIN
MOV R7, #1
JNC SKIP_DELAY2
MOV R7, #5
SKIP_DELAY2:
NOP
DJNZ R7, $
MOV C, DS18B20_PIN
; 移位
RLC A
; 判断是否读取完8位数据
DJNZ R6, READ_LOOP
RET
; 初始化UART模块
INIT_UART:
; 设置波特率
MOV TMOD, #0x20
MOV TH1, #256 - (OSC_FREQ / (UART_BAUDRATE * 12))
; 启用UART接收中断
SETB IE, #0x90
; 启用全局中断
SETB EA
RET
; 打开UART发送中断
ENABLE_UART_TX_INTERRUPT:
SETB IE, #0x20
RET
; 将温度数据转换为字符串格式
CONVERT_TEMP_TO_STRING:
; 将温度数据转换为十进制字符串
MOV A, [TEMP_BUFFER + 1]
ADD A, #0x30
MOV [TEMP_STRING + 2], A
MOV A, [TEMP_BUFFER]
ADD A, #0x30
MOV [TEMP_STRING + 1], A
; 添加小数点
MOV [TEMP_STRING + 3], #'.'
; 将小数部分转换为十进制字符串
MOV A, [TEMP_BUFFER + 2]
ADD A, #0x30
MOV [TEMP_STRING + 4], A
MOV A, [TEMP_BUFFER + 3]
ADD A, #0x30
MOV [TEMP_STRING + 5], A
; 添加单位字符
MOV [TEMP_STRING + 6], #'C'
MOV [TEMP_STRING + 7], #' '
MOV [TEMP_STRING + 8], #0
RET
; 发送字符串到上位机
SEND_STRING:
; 初始化字符串指针
MOV R6, #0
; 循环发送每一个字符
SEND_LOOP:
; 获取当前字符
MOV A, [TEMP_STRING + R6]
; 发送字符到串口
MOV SBUF, A
; 等待发送完成
WAIT:
JNB TI, WAIT
CLR TI
; 判断是否发送完整个字符串
INC R6
CJNE A, #0, SEND_LOOP
RET
; 中断处理函数:UART发送中断
UART_TX_ISR:
; 清除中断标志
CLR TI
RETI
; 中断处理函数:UART接收中断
UART_RX_ISR:
; 读取接收到的数据
MOV A, SBUF
; 判断数据是否为换行符
CJNE A, #0x0D, END_RX
; 发送温度数据到上位机
CALL SEND_DATA
END_RX:
; 清除中断标志
CLR RI
RETI
; 数据缓冲区
TEMP_BUFFER: DB 0, 0, 0, 0
TEMP_STRING: DB 'Temp: ', 0, 0, 0, 0, 0, 0, 0, 0
; 程序入口
MAIN:
; 初始化DS18B20传感器
CALL INIT_DS18B20
; 循环读取温度数据并发送到上位机
LOOP:
; 读取温度数据
CALL READ_DS18B20
; 发送温度数据到上位机
CALL SEND_DATA
; 等待一段时间
MOV R7, #10
DELAY5:
NOP
DJNZ R7, DELAY5
JMP LOOP
END
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)