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

📄 no5.asm

📁 AVR-AT90S8535,HD8279,等开发的洁净空调专用DDC系统,包括AD/DA,PID计算等.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;************* 宏方科技  HFKJAVR.asm  ************************
;*
;* 标题:AT90S8535 集散式洁净空调自动控制系统
;* 版本:	        1.0
;* 最后更新日期:	2002.12.13
;* 支援                 TEL: 8102124 & 8106097
;*
;*************************************************************
.include"8535def.inc"
.equ	label=$0900

.org	0x00
rjmp	reset                                                                                                                                                                                                                                                		  

.org	INT0addr		;键盘中断服务子程序
rjmp	EXT_INT0		

.org	URXCaddr		;UART接收结束中断
rjmp	UART_RXC

.org	OVF1addr		;timerl溢出中断
rjmp	TIMER1
;reti

	
.org	0x0020			;
;*****************************
;************中断*************
;*****************************
TIMER1:				;TIMER1溢出中断子程序
	push	r4
	push	r5
	push	r6
	push	r7
	push	r8
	push	r9
	push	r16
	push	r17
	push	r18
	push	r19
	push	r20
	push	r21
	push	r24
	push	r28
	push	r29
	push	r30
	push	r31
	in	r24,SREG	;保存状态寄存器
	sei
	
	ldi	r16,$e1		;重置TIMER1时间常数
	ldi	r17,$7c
	out	tcnt1h,r16
	out	tcnt1l,r17
	rcall	display
	lds	r16,$011a	;DO OUT
	rcall	doout
	lds	r16,$010a	;判断周期1是否到
	lds	r17,$0063
	inc	r17
	cp	r16,r17
	brne	timer10
	rcall	valjs1		;冷水 热水阀值计算
	lds	r16,$00d9	;冷水 AO1
	ldi	r17,2
	rcall	aoout
	lds	r16,$00da	;热水 AO2
	ldi	r17,4
	rcall	aoout
	clr	r17
timer10:sts	$0063,r17

	lds	r16,$010b	;判断周期2是否到
	lds	r17,$0064
	inc	r17
	cp	r16,r17
	brne	timer11
	rcall	valjs2		;冷水 加湿阀值计算
	lds	r16,$00d9	;冷水 AO1
	ldi	r17,2
	rcall	aoout
	lds	r16,$00db	;加湿 AO3
	ldi	r17,8
	rcall	aoout
	clr	r17
timer11:sts	$0064,r17
	
	out	sreg,r24
	pop	r31
	pop	r30
	pop	r29
	pop	r28
	pop	r24
	pop	r21
	pop	r20
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	pop	r9
	pop	r8
	pop	r7
	pop	r6
	pop	r5
	pop	r4
	reti

UART_RXC:			;通讯中断子程序

	push	r16		;压栈
	push	r17
	push	r18
	push	r19
	push	r23
	push	r24
	push	r28
	push	r29
	in	r18,SREG	;保存状态寄存器
	ldi	r19,$ff		;无数据测试次数255次
	
rdlp1:	sbis	usr,7	
	rjmp	rdlp2
	ldi	r19,$ff
rdlp3:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	rdlp4
	in	r17,udr		;读串口数据到r17
	ldi	r19,$ff	
	rjmp	zh1	
rdlp2:	dec	r19	
	cpi	r19,$00
	breq	qt1
	rjmp	rdlp1	
qt1:	rjmp	qt

rdlp4:	dec	r19
	cpi	r19,$00
	breq	qt1
	rjmp	rdlp3 
zh1:	cpi	r17,$ff		;站号起位1
	brne	qt1
rdlp5:	sbis	usr,7	
	rjmp	rdlp6
	ldi	r19,$ff
rdlp7:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	rdlp8
	in	r17,udr		;读串口数据到r17
	ldi	r19,$ff	
	rjmp	zh2	
rdlp6:	dec	r19	
	cpi	r19,$00
	breq	qt1
	rjmp	rdlp5
rdlp8:	dec	r19
	cpi	r19,$00
	breq	qt1
	rjmp	rdlp7 
zh2:	cpi	r17,$ff		;站号起位2
	brne	qt1
	
rdlp9:	sbis	usr,7	
	rjmp	rdlp10
	ldi	r19,$ff
rdlp11:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	rdlp12
	in	r17,udr		;读串口数据到r17
	ldi	r19,$ff	
	rjmp	zh3	
rdlp10:	dec	r19	
	cpi	r19,$00
	breq	qt1
	rjmp	rdlp9
rdlp12:	dec	r19
	cpi	r19,$00
	breq	qt
	rjmp	rdlp11 
zh3:	ldi	r29,$01		;站号
	ldi	r28,$4c		;SRAM中站号地址
	ld	r16,y
	ldi	r16,$01
	cpse	r17,r16		;是本站则跳行
	rjmp	qt		;非本站,退出
	
rdlp13:	sbis	usr,7	
	rjmp	rdlp14
	ldi	r19,$ff
rdlp15:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	rdlp16
	in	r17,udr		;读串口数据到r17
	ldi	r19,$ff	
	rjmp	zh4	
rdlp14:	dec	r19	
	cpi	r19,$00
	breq	qt
	rjmp	rdlp13
rdlp16:	dec	r19
	cpi	r19,$00
	breq	qt
	rjmp	rdlp15 
zh4:	cpi	r17,$00		;站号停位1
	brne	qt
	
rdlp17:	sbis	usr,7	
	rjmp	rdlp18
	ldi	r19,$ff
rdlp19:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	rdlp20
	in	r17,udr		;读串口数据到r17
	ldi	r19,$ff	
	rjmp	zh5	
rdlp18:	dec	r19	
	cpi	r19,$00
	breq	qt
	rjmp	rdlp17
rdlp20:	dec	r19
	cpi	r19,$00
	breq	qt
	rjmp	rdlp19 
zh5:	cpi	r17,$00		;站号停位2
	brne	qt
	ldi	r16,$ff
	rcall	redt		;调用发送数据子程序(站号确认成功$ff)
	
rdlp21:	sbis	usr,7	
	rjmp	rdlp22
	ldi	r19,$ff
rdlp23:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	rdlp24
	in	r17,udr		;读串口数据到r17
	ldi	r19,$ff	
	rjmp	zh6	
rdlp22:	dec	r19	
	cpi	r19,$00
	breq	qt
	rjmp	rdlp21
rdlp24:	dec	r19
	cpi	r19,$00
	breq	qt
	rjmp	rdlp23 		;读控制命令.
zh6:	rcall	datapd		;调判断控制命令执行命令子过程;

qt:	out	sreg,r18	;退出通讯中断
	
	pop	r29
	pop	r28
	pop	r24
	pop	r23
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	reti
	
redt:				;发送成功返回数据子程序
loop3:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loop3
	out	udr,r16		;上传数据给PC机确认成功.
	ret
	
datapd:				
	cpi	r17,$fe
	brne	cop1			
	rcall	txdt		;Fe指令为上传数据
	ret
cop1:	cpi	r17,$fd
	brne	cop2			
	;rcall			;Fd指令启动DDC,风机
	ldi	r16,$00
	rcall	redt		;命令执行后返回PC数据
	ret
cop2:	cpi	r17,$fc
	brne	cop3			
	;rcall			;Fc指令停止DDC,风机
	ldi	r16,$11
	rcall	redt		;命令执行后返回PC数据
	ret	
cop3:	cpi	r17,$fb
	brne	cop4			
	rcall	xgml		;Fb指令修改程序参数
	ret
cop4:	cpi	r17,$fa
	brne	cop5			
	;rcall			;Fa指令锁定DDC
	ldi	r16,$33
	rcall	redt		;命令执行后返回PC数据
	ret	
cop5:	cpi	r17,$f9
	brne	cop6			
	;rcall			;F9指令臭氧灭菌
	ldi	r16,$44
	rcall	redt		;命令执行后返回PC数据
	ret	
cop6:	cpi	r17,$f8
	;brne	cop7			
	;rcall			;F8指令其它功能待定
	ldi	r16,$55
	rcall	redt		;命令执行后返回PC数据
	ret			
	
xgml:	ldi	r29,$01		;修改参数子程序
	ldi	r28,$50
xgml0:
rdlp25:	sbis	usr,7	
	rjmp	rdlp26
	ldi	r19,$ff
rdlp27:	sbic	usr,4		;低电平跳行,高电平帧错误
	rjmp	rdlp28
	in	r17,udr		;读串口数据到r17
	ldi	r19,$ff	
	rjmp	zh7	
rdlp26:	dec	r19	
	cpi	r19,$00
	breq	qt
	rjmp	rdlp25
rdlp28:	dec	r19
	cpi	r19,$00
	breq	qt
	rjmp	rdlp27 
zh7:	st	y+,r17
	cpi	r28,$6e
	brne	xgml0

	ldi	r28,$50
xgml1:	ldd	r17,y+15
	ld	r16,y+
	cpse	r17,r16
	rjmp	xgml2
	cpi	r28,$5f
	brne	xgml1
	ldi	r16,$fb
	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	xgml2
	ldi	r16,$22		;接收数据成功,可以修改参数,返回33
	rcall	redt		;命令执行后返回PC数据	
	
	ldi	r28,$40 
xgml3:	ldd	r17,y+10
	ld	r16,y+
	cpse	r17,r16
	rjmp	xgml4
xgml5:	cpi	r28,$4f
	brne	xgml3
	;rcall	cansujs		;^^^^^^^^^^^^^^^^^^^^
	ret
xgml4:	mov	r24,r28
	subi	r24,$41		;对应EEP地址为0x0100开始
	mov	r23,r17
	rcall	EEWrite
	dec	r28
	st	y+,r17		;更新SRAM中的EEP参数
	rjmp	xgml5
	
xgml2:	
	ldi	r16,$00
	rcall	redt		;命令执行后返回PC数据修改参数失败,返回00
	ret
	
txdt:	ldi	r29,$01		;上传数据子程序--PC
	ldi	r28,$00
loop5:	ld	r16,y+
loop4:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loop4
	out	udr,r16		;发送数据
	cpi	r28,$4F
	brne	loop5
loep:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loep
	ldi	r16,$ff		;
	out	udr,r16	
loep1:	sbis	usr,5		;测试USR第5位发送寄存器是否空
	rjmp	loep1
	ldi	r16,$ff		;
	out	udr,r16			
	ret		
	
EXT_INT0:
	push	r2			;键盘中断子程序
	push	r3
	push	r4
	push	r5
	push	r6
	push	r7
	push	r8
	push	r9
	push	r10
	push	r11
	push	r12
	push	r13
	push	r14
	push	r15
	push	r16		;压栈
	push	r17
	push	r18
	push	r19
	push	r20
	;push	r21
	push	r22
	;push	r23
	push	r24
	push	r25
	push	r26
	push	r27
	push	r28
	push	r29
	push	r30
	push	r31
	in	r24,SREG
	
read:	rcall	readkey		;读按键值
	cpi	r17,$c0		;启动编码
	breq	startsystem
	cpi	r17,$c8		;停止编码
	breq	stopsystem	
	cpi	r17,$d0		;设定编码
	brne	read1
	rjmp	setup
read1:	cpi	r17,$d8		;退出编码
	brne	read2
	rjmp	quit
read2:	cpi	r17,$e0		;LEFT编码
	brne	read3
	rjmp	LEFT
read3:	cpi	r17,$e8		;RIGHT编码
	brne	read4
	rjmp	RIGHT
read4:	cpi	r17,$c1		;消音
	breq	mute
	
kqt:	out	SREG,r24
	pop	r31		;弹出
	pop	r30
	pop	r29		;弹出
	pop	r28
	pop	r27		;弹出
	pop	r26
	pop	r25		;弹出
	pop	r24
	;pop	r23
	pop	r22
	;pop	r21
	pop	r20
	pop	r19
	pop	r18
	pop	r17
	pop	r16
	pop	r15
	pop	r14
	pop	r13
	pop	r12
	pop	r11
	pop	r10
	pop	r9
	pop	r8
	pop	r7
	pop	r6
	pop	r5
	pop	r4
	pop	r3
	pop	r2
	reti			;中断返回
	
startsystem:
	rcall	beep		;BEEP
	ldi	r16,01		;启动风机输出
	ldi	xh,$01
	ldi	xl,$19
	st	x,r16
	rcall	EEWrite
	rjmp	kqt
	
stopsystem:
	rcall	beep		;BEEP
	clr	r16		;停止风机输出
	ldi	xh,$01
	ldi	xl,$19
	st	x,r16
	rcall	EEWrite
	rjmp	kqt
	
mute:	rcall	beep		;报警消音
	ldi	yh,$00
	ldi	yl,$60
	ldd	r16,y+5		;$0065是否在设定参数
	cpi	r16,2		;正在修改参数
	breq	mute1
	lds	r16,$011b	;上次是否静音
	inc	r16
	sbrs	r16,0
	clr	r16
	sts	$011b,r16
	rjmp	kqt
mute1:	ldd	r16,y+6		;$0066参数位选择0-个位,1-十位,2-百位,3-千位
	inc	r16
	cpi	r16,4
	brne	mute2
	clr	r16
mute2:	std	y+6,r16
	rjmp	kqt

quit:	rcall	beep
	ldi	yh,$00
	ldi	yl,$60
	ldd	r16,y+5		;$0065是否在设定参数
	cpi	r16,0		;未修改参数
	breq	quit1
	cpi	r16,1		;正在显示通道
	brne	quit2
	clr	r16
	st	y,r16		;$0060取消通道锁定
	std	y+1,r16		;$0061通道号=0
	std	y+5,r16		;$0065参数设定计数=0
quit1:	rjmp	kqt
quit2:	ldi	r16,1
	std	y+5,r16		;$0065参数设定计数=1
	rjmp	kqt

setup:	rcall	beep		;设定按钮
	ldi	yh,$00		;y >>> $0060
	ldi	yl,$60
	ldi	zh,$01		;z >>> $0100
	ldi	zl,$00
	ldd	r16,y+5		;$0065参数设定计数器
	inc	r16		;计数器+1
	cpi	r16,1
	brne	setup1
	std	y+5,r16		;$0065参数设定计数=1
	ldi	r16,16		;通道号为16
	std	y+1,r16		;$0061
	
	ldi	r16,$78		;'t'
	std	y+7,r16		;$0067
	ldi	r16,$06		;'1'
	std	y+8,r16		;$0068
	ldi	r16,$40		;'-'
	std	y+9,r16		;$0069
	std	y+10,r16	;$006a
	std	y+11,r16	;$006b
	rjmp	kqt
setup1:	cpi	r16,2
	breq	setup2
	rjmp	setup30		;去和3比较
setup2:	std	y+5,r16		;$0065参数设定计数=2
	clr	r25
	lds	r16,$00d0	;DI0 风机状态
	cpi	r16,0
	breq	set21
	sbr	r25,2
set21:	lds	r16,$0112	;运行模式
	cpi	r16,0
	brne	set22
	sbr	r25,4
set22:	lds	r16,$00d1	;DI1 报警
	cpi	r16,0
	breq	set23
	sbr	r25,8
set23:	lds	r16,$011b	;$011b静音
	cpi	r16,0
	breq	set24
	sbr	r25,1
	
set24:	ldd	r16,y+1		;$0061取通道号
	cpi	r16,16		;t1
	brne	setup3
	ld	r2,z
	ldd	r3,z+1
	rcall	wendu
	sbr	r25,16		;指示灯
	ldi	r16,0		;小数点在3位
	rjmp	set25
setup3:	cpi	r16,17		;h1
	brne	setup4
	ldd	r2,z+2
	ldd	r3,z+3
	rcall	shidu
	sbr	r25,32
	ldi	r16,0		;小数点在3位
	rjmp	set25
setup4:	cpi	r16,18		;t2
	brne	setup5
	ldd	r2,z+4
	ldd	r3,z+5
	rcall	tehpa
	sbr	r25,16
	ldi	r16,1		;小数点在4位
	rjmp	set25
setup5:	cpi	r16,19		;Pa
	brne	setup6
	ldd	r2,z+6
	ldd	r3,z+7
	rcall	tehpa
	sbr	r25,64
	ldi	r16,1		;小数点在4位
	rjmp	set25
setup6:	cpi	r16,20		;FL
	brne	setup7
	clr	r6		;风量 0~1023 百立方
	ldd	r4,z+8
	ldd	r5,z+9
	rcall	htd3
	sbr	r25,128
	ldi	r16,2		;无小数
	rjmp	set26
setup7:	cpi	r16,21		;S1
	brne	setup8
	ldd	r4,z+10
	rjmp	set26	
setup8:	cpi	r16,22		;S2
	brne	setup9
	ldd	r4,z+11
	rjmp	set26
setup9:	cpi	r16,23		;P1
	brne	setup10
	ldd	r4,z+12
	rjmp	set27
setup10:cpi	r16,24		;I1
	brne	setup11
	ldd	r4,z+13
	rjmp	set27	
setup11:cpi	r16,25		;D1
	brne	setup12
	ldd	r4,z+14
	rjmp	set27	
setup12:cpi	r16,26		;P2
	brne	setup13
	ldd	r4,z+15
	rjmp	set27
setup13:cpi	r16,27		;I2
	brne	setup14
	ldd	r4,z+16
	rjmp	set27	
setup14:cpi	r16,28		;D2
	brne	setup15
	ldd	r4,z+17
	rjmp	set27
setup15:cpi	r16,29		;MODLE
	brne	setup16
	ldd	r4,z+18
	rjmp	set26	
setup16:cpi	r16,30		;SN
	brne	setup17
	ldd	r4,z+19
	rjmp	set26	
setup17:cpi	r16,31		;UBR
	brne	setup18
	ldd	r4,z+20
	rjmp	set26	
setup18:cpi	r16,32		;t1下限
	brne	setup19
	ldd	r2,z+21
	clr	r3
	rcall	wendu
	sbr	r25,16		;指示灯
	ldi	r16,0		;小数点在3位
	rjmp	set25
setup19:cpi	r16,33		;t1上限
	brne	setup20
	ldd	r2,z+22
	clr	r3
	rcall	wendu
	sbr	r25,16		;指示灯
	ldi	r16,0		;小数点在3位
	rjmp	set25	
setup20:cpi	r16,34		;h1下限
	brne	setup21
	ldd	r2,z+23
	clr	r3
	rcall	shidu1
	sbr	r25,32		;指示灯
	ldi	r16,0		;小数点在3位
	rjmp	set25
setup21:ldd	r2,z+24		;h1上限
	clr	r3
	rcall	shidu1
	sbr	r25,32		;指示灯
	ldi	r16,0		;小数点在3位
	
set25:	std	y+12,r8		;$006c
	std	y+13,r9		;$006d
	rjmp	set28	
set26:	clr	r6
	clr	r5
	rcall	htd3
	std	y+12,r7		;$006c
	std	y+13,r8		;$006d
	ldi	r16,2		;无小数
	rjmp	set28
set27:	clr	r6
	clr	r5
	rcall	htd3
	std	y+12,r7		;$006c
	std	y+13,r8		;$006d
	ldi	r16,1		;一位小数
set28:	std	y+14,r25	;$006e指示灯
	std	y+15,r16	;$006f小数点
	rjmp	kqt
	
setup30:ldi	r16,1
	std	y+5,r16		;$0065参数设定计数=1
	clr	r16
	std	y+6,r16		;参数位数选择=0
	ldi	xh,$01
	ldd	r16,y+1		;$0061取通道号
	cpi	r16,16		;t1
	brne	setup31
	rcall	wendubh
	st	z,r6
	std	z+1,r7
	ldi	xl,0
	rcall	eewrite
	mov	r16,r7
	ldi	xl,1
	rcall	eewrite
	rjmp	kqt
setup31:cpi	r16,17		;h1
	brne	setup32
	ldd	r6,y+12
	ldd	r7,y+13
	ldi	r16,$e8
	sub	r6,r16
	ldi	r16,$03
	sbc	r7,r16		;-10%
	rcall	shidubh
	std	z+2,r6
	std	z+3,r7
	ldi	xl,2
	rcall	eewrite
	mov	r16,r7
	ldi	xl,3
	rcall	eewrite
	rjmp	kqt
setup32:cpi	r16,18		;t2
	brne	setup33
	rcall	tehpabh
	std	z+4,r6
	std	z+5,r7
	ldi	xl,4
	rcall	eewrite
	mov	r16,r7
	ldi	xl,5
	rcall	eewrite
	rjmp	kqt	
setup33:cpi	r16,19		;Pa
	brne	setup34
	rcall	tehpabh

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -