📄 zh10.asm
字号:
.device AT90S8535
.equ SREG =$3F
.equ sph =$3E
.equ spl =$3D
.equ TIMSK =$39
.equ PORTC =$15
.equ DDRC =$14
.equ PINC =$13
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.EQU UBRR =$09
.EQU UCR =$0A
.EQU USR =$0B
.EQU UDR =$0C
.EQU B20D =0
.EQU B21D =1
.EQU B22D =2
.DEF YL =R28
.DEF YH =R29
.CSEG
.org $0000
rjmp main
.org 0x00b
rjmp uart_rx ;接收完成中断
main: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi Yl,$60 ;Y 接收缓冲区显示指针置初值
ldi Yh,$00
ldi r16,$00
out DDRC,r16
out PORTC,r16
ldi r16,$fe
out DDRD,r16
ldi r16,$ff
out PORTD,r16
ldi r16,51
out UBRR,r16 ;波特率确定为9600b/s
ldi r16,$98
out UCR,r16 ;UART设置为发送、接收使能
sei
wait: rcall ds18b20
rcall dsent
ldi r17,8
lds r2,$0060
lds r4,$0061
lds r0,$0062
mov r9,r0
mov r3,r2
lsr r3
mov r1,r2
mov r5,r4
data: lsr r1
brcc ms
sbi PORTD,04
sbi PORTD,06
rcall ts10ms
rjmp ms1
ms: cbi PORTD,04
cbi PORTD,06
rcall ts10ms
ms1: lsr r3
brcc ms2
sbi PORTD,05
rcall ts10ms
rjmp ms3
ms2: cbi PORTD,05
rcall ts10ms
rcall ts10ms
ms3: lsr r5
brcc ms4
sbi PORTD,07
rcall ts10ms
rjmp ms7
ms4: cbi PORTD,07
rcall ts10ms
ms7: dec r17
brne data
rjmp wait
;**********************************************************
DS18B20:
RCALL RES0 ;初始化18B20
LDI R18,$CC ;跳过内部ROM 命令
RCALL W18B20
LDI R18,$44 ;启动A/D转换命令
RCALL W18B20
RCALL RES0 ;18B20 初始化
LDI R18,$CC ;跳过内部ROM 命令
RCALL W18B20
LDI R18,$BE ;读RAM 命令
RCALL W18B21
RCALL R18B20 ;读出温度的低字节并暂存
MOV R10,R19
RCALL R18B20 ;读出温度的高字节并暂存
MOV R11,R19
LDI R18,$BE ;读RAM 命令
RCALL W18B22
RCALL R18B21 ;读出温度的低字节并暂存
MOV R12,R19
RCALL R18B21 ;读出温度的高字节并暂存
MOV R13,R19
LDI R18,$BE ;读RAM 命令
RCALL W18B23
RCALL R18B22 ;读出温度的低字节并暂存
MOV R14,R19
RCALL R18B22 ;读出温度的高字节并暂存
MOV R15,R19
RET
;**********************************************************
RES0: SBI DDRC,B20D ;初始化子程序,将数据线B20D 拉低
SBI DDRC,B21D
SBI DDRC,B22D
LDI R16,240 ;并延时约480μs
DELAY: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY
LDI R16,239
DELAY1: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY1
CBI DDRC,B20D ;释放B20D 信号(即将PINB7引脚拉高)
CBI DDRC,B21D
CBI DDRC,B22D
LDI R16,240 ;并延时约480μs
DELAY2: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY2
LDI R16,239
DELAY3: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY3
RET
;**********************************************************
W18B20: LDI R19,8 ;写18B20 子程序
CLC
WB201 : CBI DDRC,B20D ;将数据线拉高
CBI DDRC,B21D
CBI DDRC,B22D
LDI R16,1 ;约1μs
DELAY4: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY4
SBI DDRC,B20D ;将数据线拉低产生写信号下降沿
SBI DDRC,B21D
SBI DDRC,B22D
LDI R16,6 ;拉低约6*1 = 6μs
DELAY5: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY5
ROR R18 ;将发送数据低位移到进位位发送
BRCC WB202
CBI DDRC,B20D ;将数据线拉高
CBI DDRC,B21D
CBI DDRC,B22D
WB202 : LDI R16,64 ;发送位延时约64μs
DELAY6: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY6
DEC R19
BRNE WB201
CBI DDRC,B20D ;将数据线拉高
CBI DDRC,B21D
CBI DDRC,B22D
RET
;**********************************************************
W18B21: LDI R19,8 ;写18B20 子程序
CLC
WB2011: CBI DDRC,B20D ;将数据线拉高
LDI R16,1 ;约1μs
DELAY19:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY19
SBI DDRC,B20D ;将数据线拉低产生写信号下降沿
LDI R16,6 ;拉低约4*3 = 6μs
DELAY20:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY20
ROR R18 ;将发送数据低位移到进位位发送
BRCC WB2021
CBI DDRC,B20D ;将数据线拉高
WB2021 :LDI R16,64 ;发送位延时约64μs
DELAY21:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY21
DEC R19
BRNE WB2011
CBI DDRC,B20D ;将数据线拉高
RET
;**********************************************************
W18B22: LDI R19,8 ;写18B20 子程序
CLC
WB2012: CBI DDRC,B21D ;将数据线拉高
LDI R16,1 ;约1μs
DELAY22:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY22
SBI DDRC,B21D ;将数据线拉低产生写信号下降沿
LDI R16,6 ;拉低约4*3 = 6μs
DELAY23:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY23
ROR R18 ;将发送数据低位移到进位位发送
BRCC WB2022
CBI DDRC,B21D ;将数据线拉高
WB2022 :LDI R16,64 ;发送位延时约64μs
DELAY24:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY24
DEC R19
BRNE WB2012
CBI DDRC,B21D ;将数据线拉高
RET
;**********************************************************
W18B23: LDI R19,8 ;写18B20 子程序
CLC
WB2013: CBI DDRC,B22D ;将数据线拉高
LDI R16,1 ;约1μs
DELAY25:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY25
SBI DDRC,B22D ;将数据线拉低产生写信号下降沿
LDI R16,6 ;拉低约4*3 = 6μs
DELAY26:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY26
ROR R18 ;将发送数据低位移到进位位发送
BRCC WB2023
CBI DDRC,B22D ;将数据线拉高
WB2023: LDI R16,64 ;发送位延时约64μs
DELAY27:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY27
DEC R19
BRNE WB2013
CBI DDRC,B22D ;将数据线拉高
RET
;**********************************************************
R18B20: LDI R19,$80 ;读18B20子程序
RB201 : CBI DDRC,B20D ;将数据线拉高
LDI R16,1 ;拉高约1μs
DELAY7: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY7
SBI DDRC,B20D ;将数据线拉低产生读信号下降沿
LDI R16,6
DELAY8: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY8
CBI DDRC,B20D ;将数据线拉高
LDI R16,8
DELAY9: NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY9
SEC
SBIS PINC,B20D
CLC
ROR R19
LDI R16,56
DELAY10:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY10
BRCC RB201
CBI DDRC,B20D ;将数据线拉高
RET
;**********************************************************
R18B21: LDI R19,$80 ;读18B20子程序
RB211 : CBI DDRC,B21D ;将数据线拉高
LDI R16,1 ;拉高约1μs
DELAY11:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY11
SBI DDRC,B21D ;将数据线拉低产生读信号下降沿
LDI R16,6
DELAY12:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY12
CBI DDRC,B21D ;将数据线拉高
LDI R16,8
DELAY13:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY13
SEC
SBIS PINC,B21D
CLC
ROR R19
LDI R16,56
DELAY14:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY14
BRCC RB211
CBI DDRC,B21D ;将数据线拉高
RET
;**********************************************************
R18B22: LDI R19,$80 ;读18B20 子程序
RB221 : CBI DDRC,B22D ;将数据线拉高
LDI R16,1 ;拉高约1μs
DELAY15:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY15
SBI DDRC,B22D ;将数据线拉低产生读信号下降沿
LDI R16,6
DELAY16:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY16
CBI DDRC,B22D ;将数据线拉高
LDI R16,8
DELAY17:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY17
SEC
SBIS PINC,B22D
CLC
ROR R19
LDI R16,56
DELAY18:NOP
NOP
NOP
NOP
NOP
NOP
DEC R16
BRNE DELAY18
BRCC RB221
CBI DDRC,B22D ;将数据线拉高
RET
;**********************************************************
dsent:
Txcx: sbis USR,5
rjmp Txcx ;UART 数据寄存器空则发送帧头
ldi R16,$7f
out UDR,R16
Txck: sbis USR,5
rjmp Txck
ldi R16,$00
out UDR,R16
Txca: sbis USR,5
rjmp Txca ;UART 数据寄存器空则发送数据帧
out UDR,r15
Txcb: sbis USR,5
rjmp Txcb
out UDR,R14
Txcc: sbis USR,5
rjmp Txcc ;UART 数据寄存器空则发送数据帧
out UDR,r13
Txcd: sbis USR,5
rjmp Txcd
out UDR,R12
Txce: sbis USR,5
rjmp Txce ;UART 数据寄存器空则发送数据帧
out UDR,r11
Txcf: sbis USR,5
rjmp Txcf
out UDR,R10
Txci: sbis USR,5
rjmp Txci ;UART 数据寄存器空则发送帧尾
ldi R16,$f7
out UDR,R16
Sendend:ret
;**********************************************************
ts10ms: ldi r25,228 ;延时2ms子程序
push r25
del2: push r25
del3: dec r25
brne del3
pop r25
dec r25
brne del2
pop r25
ret
;**********************************************************
uart_rx:
in r0,sreg ;保护标志寄存器
in r16,udr ;读串收数据寄存器
st Y+,r16 ;送接收缓冲区
out sreg,r0 ;恢复标志寄存器
reti
;**********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -