以stc8h8k64u器件,基于ds18b20的温度传感器,在串口助手上显示的汇编语言地、的代码怎么写
时间: 2024-02-17 20:01:25 浏览: 107
以下是基于STC8H8K64U芯片和DS18B20温度传感器的汇编代码,用于在串口助手上显示温度值:
```
; 定义常量
DS18B20_PIN equ P1.0 ; DS18B20数据线接在P1.0口
DELAY_1US equ 1 ; 延时函数使用1us延时
DELAY_10US equ 10
DELAY_60US equ 60
DELAY_500US equ 500
; 定义变量
tempLow db 0 ; 温度低八位
tempHigh db 0 ; 温度高八位
tempSign db 0 ; 温度符号(0为正,1为负)
tempDisplay db 0 ; 用于转换温度值的变量
; 主程序
main:
; 初始化串口
mov TMOD, #0x20 ; 定时器1工作在方式2,用于串口通信
mov TH1, #0xFD ; 波特率设置为9600bps
setb TR1 ; 启动定时器1
mov SCON, #0x50 ; 串口工作在方式1,允许接收
; 读取温度值
call readTemperature ; 调用读取温度值的子程序
; 转换温度值并发送到串口
mov a, tempSign ; 判断温度符号
jnz negativeTemp
mov a, tempHigh ; 如果是正温度,则直接发送高八位
call sendByteToSerial ; 发送到串口
mov a, tempLow ; 发送低八位
call sendByteToSerial ; 发送到串口
sjmp loop
negativeTemp:
cpl a ; 如果是负温度,则先取反
add a, #1 ; 再加1
mov tempDisplay, a ; 存储转换后的温度值
mov a, tempDisplay ; 发送转换后的温度值
call sendByteToSerial ; 发送到串口
mov a, tempHigh ; 发送低八位
call sendByteToSerial ; 发送到串口
sjmp loop
loop:
sjmp loop ; 循环执行
; 子程序:读取温度值
readTemperature:
setb DS18B20_PIN ; 总线拉高
call delay_500us ; 延时500us
clr DS18B20_PIN ; 总线拉低,开始读取温度值
call delay_60us ; 延时60us
setb DS18B20_PIN ; 总线拉高,准备读取数据
call delay_10us ; 延时10us
clr P1.0 ; 检测DS18B20的回应信号
jb P1.0, $ ; 如果DS18B20没有回应,则一直循环
call delay_60us ; 延时60us
setb DS18B20_PIN ; 总线拉高,准备读取数据
; 读取温度值的高八位和低八位
mov a, #8 ; 循环8次,读取8位数据
mov tempLow, #0 ; 温度低八位清零
mov tempHigh, #0 ; 温度高八位清零
readTemperatureLoop:
call delay_10us ; 延时10us
setb P1.0 ; 准备读取数据
call delay_10us ; 延时10us
mov c, P1.0 ; 读取数据
rlc tempLow ; 将数据存储到温度低八位中
rlc tempHigh ; 将数据存储到温度高八位中
djnz a, readTemperatureLoop ; 继续读取下一位数据
ret
; 子程序:发送一个字节到串口
sendByteToSerial:
push ACC ; 保存ACC的值
mov SBUF, A ; 发送数据到串口
clr TI ; 清除发送完成标志位
sendByteToSerialLoop:
jnb TI, sendByteToSerialLoop ; 等待发送完成
pop ACC ; 恢复ACC的值
ret
; 子程序:1us延时
delay_1us:
mov R7, #2
delay_1us_loop:
nop
nop
nop
djnz R7, delay_1us_loop
ret
; 子程序:10us延时
delay_10us:
mov R6, #7
delay_10us_loop:
djnz R6, $ ; 循环7次,共耗时10us
ret
; 子程序:60us延时
delay_60us:
mov R5, #35
delay_60us_loop:
djnz R5, $ ; 循环35次,共耗时60us
ret
; 子程序:500us延时
delay_500us:
mov R4, #250
delay_500us_loop:
djnz R4, delay_1us ; 循环250次,共耗时500us
ret
```
以上代码只是一个简单的示例,仅供参考,并不能保证在所有情况下都能正常工作。如果你打算将以上代码用于实际应用中,需要仔细检查它是否符合你的需求,并进行必要的修改和调试。
阅读全文