📄 temperasm.asm
字号:
.global _xx
date_size .set 0ah
_xx .usect ".out", date_size
.text
PARMS:
dsadd0 .word 0c00000h
dsaddr1 .word 0c00001h
destaddr2 .word _xx
.text
.global _temper
;测温程序
_temper:
;ldp PARMS
;ldi @dsaddr1, ar1 ;定时入口
;call set
call rsreset; 复位传感器
ldi 0fh, r3
subi r2, r3;检测有无传感器
bnz tss2 ;有传感器
br tss20 ;无传感器
tss2: ldi 0cch, r7;跳过rom匹配
call tswrite
ldi 044h, r7;转换命令
call tswrite
ldi 8235h, r1;延时1s
and 0ffffh, r1
call delay15
ldi 8235h, r1;延时1s
and 0ffffh, r1
call delay15
call rsreset
ldi 0fh, r3
subi r2, r3;检测有无传感器
bnz tss1 ;有传感器
br tss20 ;无传感器
tss1: ldi 0cch, r7;跳过rom匹配
call tswrite
ldi 0beh, r7;读命令
call tswrite
call tsread ;读温度值
tss20:
rets ;定时返回
;复位
rsreset:
ldi @dsaddr1, ar1
call logic1 ;write
call set
call clear ;发复位脉冲
ldi 28h, r1;延时600us
call delay15
call logic2; 释放总线
ldi 3h, r1 ;延时45us等待
call delay15
ldi *ar1, ar0
and 1, ar0
ldi 1, r3
cmpi ar0, r3
bnz tsr2
br tsr3
tsr2: ldi 00h, r2;有传感器
br tsr4
tsr3: ldi 0fh, r2;无传感器 r2为标志
br tsr5
tsr4: ldi 28h, r1;延时600us
;ldi 1dh, r1;延时435us
call delay15
tsr5: ;call set
rets
;写入子程序
tswrite:ldi @dsaddr1, ar1
ldi r7, r3 ; R7?
ldi 08h, r6;循环8次,写1个字节
tsw1: call set
call delay2 ;高电平延时2us
call clear ;产生写信? ;ldi 1, r1
;call delay15
call delay2 ; 延时2us
ldi r3, r4
and 1, r4;取最低位数
sti r4, *ar1;命令字按位依次送给ds18b20
;ldi 1, r1;延时15us, ds18b20read
ldi 3, r1;延时45us, ds18b20read
call delay15
;call set
;ldi 3, r1;延时约45us保证持续写>60us ???
;call delay15
ror r3 ;rotate right
subi 1, r6;判断是否传完1个字节
bnz tsw1
call set ;发送完毕,置1
rets
;读出子程序
tsread:;ldp PARMS
ldi @destaddr2, ar2;存储从ds18b20收到的9个字节到806000h开始的单元
ldi 09h, r5;读9个寄存器
tsrd1: ldi 08h, r6;循环8次,读1个字节
ldi 0, r3
tsrd2: ldi @dsaddr1, ar1
call set
call delay2 ;高电平延时2us
call clear ;产生读信号
call delay2 ;低电平延时2us
call logic2 ;释放总线
;ldi 1, r1;延时15us ,(maybe too long)
;call delay15
call delay2
call delay2
;call delay2
;call delay2
ldi *ar1, r4
and 1, r4
or r4, r3
ror r3
ldi 4, r1;延时约45ns保证持续读>60ns,delay60 seconds
call delay15
subi 1, r6;判断是否读完1个字节
bnz tsrd2
call set ;发送完毕,置1
ldi 24, r2
tsrd3: ror r3
subi 1, r2
bnz tsrd3
; ldi -24, r4;放在r3低8位
; ash r4, r3
sti r3, *ar2++(1)
subi 1, r5;判断是否读完9个寄存器
bnz tsrd1
rets
;延时子程序(15us)
delay15: push r0
push r1
delay151: ldi 1b9h, r0 ;15us
del15: subi 1, r0
bnz del15
subi 1, r1 ;delay R1*15us
bnz delay151
pop r1
pop r0
rets
;延时2us
delay2: push r0
ldi 3Ah, r0 ;延时2us
del2: subi 1, r0
bnz del2
pop r0
rets
; logical control
logic1: ldi @dsadd0, ar3;select74l244,write data
ldi 0h, r0
sti r0, *ar3
rets
logic2: ldi @dsadd0, ar3;close74l244,read data
ldi 7h, r0
sti r0, *ar3
rets
;set/clear dsadd1
set: call logic1
ldi 1, r0
sti r0, *ar1
rets
clear: call logic1
ldi 0, r0
sti r0, *ar1
rets
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -