⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zh10.asm

📁 基于PROTERUS仿真的AVR例子
💻 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 + -