📄 no5.asm
字号:
;************* 宏方科技 HFKJAVR.asm ************************
;*
;* 标题:AT90S8535 集散式洁净空调自动控制系统
;* 版本: 1.0
;* 最后更新日期: 2002.11.01
;* 支援 TEL: 8102124 & 8106097
;*
;*************************************************************
.include"8535def.inc"
.def temp = r19 ;十六进制转换暂存器
.def count = r8 ;十六进制转换计数器
.def res1 = r4
.def res2 = r5 ;res1、res2存放结果的十六进制
.def cnt1d = r6
.def cnt2d = r7 ;cnt1、dcnt2d存放结果的十进制
.org 0x00
.equ label=$0200
rjmp RESET ;
;.org 0x01 ;通用中断
;INTT0: RJMP GINT ;
;.org 0x06 ;timerl
;INTTT: RJMP TINT ;
.org 0x020 ;
RESET:
SYS: ldi R16,low(RAMEND) ;设置堆栈
out SPL,R16
ldi R16,high(RAMEND)
out SPH,R16
ldi r16,$28 ;8279写控制寄存器
out portd,r16
ldi r16,$d1
out portb,r16
sbi portd,4
; ldi r20,0X30
; rcall Delay
;wdr ;看门狗复位
;ldi R16,$0F ;0b00001111
;out WDTCR,R16 ;狗周期2048MS
ldi R16,$F8 ;0B11111000
out DDRA,R16 ;A口0~2输入,3~7输出
sbi porta,2
ldi R16,$FA ;0B11111110
out DDRD,R16 ;D口0/2输入,1/3~7输出
ldi R16,$FF ;0B11111111
out DDRC,R16 ;C口输出
out DDRB,R16 ;B口输出
ldi R16,$85 ;设置ADC转换,中断触发,ADC为单次模式且32M分频
out adcsr,R16
clr R16
out admux,R16 ;ADC 0通道
;sbi adcsr,6 ;启动ADC
ldi r16,$98 ;初始化COM
out ucr,r16 ;设置UART控制寄存器---UCR
ldi r16,25
out ubrr,r16 ;设置UART波特率
;ldi r16,$40 ;INT0可用,INT1屏蔽
;out GIMSK,R16
;ldi r16,$3 ;INT0上升沿触发
;out mcucr,r16
cbi portd,4
ldi r16,$00 ;8279键盘显示方式初始
out portb,r16
sbi portd,4
nop
cbi portd,4
ldi r16,$22 ;8279时钟分频=2
out portb,r16
sbi portd,4
clr r17
main: sbi adcsr,6 ;启动ADC
rcall ADC1
rcall zhcwsd ;转换成温度
sbrc r17,0 ;r17的0位清0跳行
rcall zhcsd ;转换成湿度
mov res1,m16ua
mov res2,m16ub
rcall htd3 ;16进制转10进制
rcall display
cpi r17,$07
brne addre1 ;不等于7则跳转
clr r17 ;等于7
sbic admux,0 ;内地址
rjmp addre2 ;如果admux=1则置0
sbi admux,0 ;如果admux=0则置1
rjmp addre3
addre2: cbi admux,0
rjmp addre3
addre1: inc r17
addre3: mov r18,r17
andi r18,$01
cpi r18,$01
brne addre4
sbi porta,3
rjmp addre5
addre4: cbi porta,3
addre5: mov r18,r17
andi r18,$02
cpi r18,$02
brne addre6
sbi porta,4
rjmp addre7
addre6: cbi porta,4
addre7: mov r18,r17
andi r18,$04
cpi r18,$04
brne addre8
sbi porta,5
rjmp addre9
addre8: cbi porta,5
addre9: ldi r20,0X56 ;延时1秒
rcall Delay
rjmp main
;********* 子程序区 *********
;**** ADC转换子程序
ADC1: sbic adcsr,adsc ;转换结束跳行否则等待
rjmp ADC1
in r2,adcl ;把转换结果送r2,r3
in r3,adch
sbic pina,2 ;读开关量
ldi r18,$0 ;开关量关
ldi r18,$1 ;开关量开
ldi r27,$01 ;传数据到SRAM 0100 处
mov r26,r17
st x,r18 ;传开关量到 0100
sbic admux,0
rjmp admux1
adiw r26,$10 ;传A0数据到SRAM 0110 处
rjmp chuan
admux1: adiw r26,$20 ;传A1数据到SRAM 0120 处
chuan: st x+,r2 ;传低位数据
st x,r3 ;传高位数据
ret
;**** 数据转换成温湿度
zhcwsd: mov mc16ul,r2 ;T=D*40/1023=D*50/11*10/3*4/31*2
mov mc16uh,r3
clr mp16uh
ldi mcnt16u,50
mov mp16ul,mcnt16u
rcall mpy16u
mov mp16ul,m16ua
mov mp16uh,m16ub
ldi mcnt16u,11
mov mc16ul,mcnt16u
clr mc16uh
rcall div16u
mov mc16ul,m16ua
mov mc16uh,m16ub
ldi mcnt16u,10
mov mp16ul,mcnt16u
clr mp16uh
rcall mpy16u
mov mp16ul,m16ua
mov mp16uh,m16ub
ldi mcnt16u,3
mov mc16ul,mcnt16u
clr mc16uh
rcall div16u
mov mc16ul,m16ua
mov mc16uh,m16ub
ldi mcnt16u,4
mov mp16ul,mcnt16u
clr mp16uh
rcall mpy16u
mov mp16ul,m16ua
mov mp16uh,m16ub
ldi mcnt16u,31
mov mc16ul,mcnt16u
clr mc16uh
rcall div16u
zhcsd: mov mc16ul,m16ua ;湿度10~90%,应多乘2
mov mc16uh,m16ub
ldi mcnt16u,2
mov mp16ul,mcnt16u
clr mp16uh
rcall mpy16u
ret
;**** 16位无符号乘法
.def mc16uL =r9 ;被乘数低字节
.def mc16uH =r10 ;被乘数高字节
.def mp16uL =r11 ;乘数低字节
.def mp16uH =r12 ;乘数高字节
.def m16ua =r11 ;结果 字节 0 (LSB)
.def m16ub =r12 ;结果 字节 1
.def m16u2 =r13 ;结果 字节 2
.def m16u3 =r14 ;结果 字节 3 (MSB)
.def mcnt16u =r21 ;循环计数
mpy16u: clr m16u3 ;清2.3
clr m16u2
ldi mcnt16u,16 ;
lsr mp16uH
ror mp16uL
m16u_1: brcc noad8 ;C清零转
add m16u2,mc16uL ;加被乘数到2
adc m16u3,mc16uH ;加被乘数到3
noad8: ror m16u3 ;带进位右循环
ror m16u2 ;带进位右循环
ror m16ub ;带进位右循环
ror m16ua ;带进位右循环
dec mcnt16u ;计数减1
brne m16u_1 ;不为零转
ret
;***** 16位无符号除法
.def drem16uL=r13 ;余数 低位
.def drem16uH=r14 ;余数 高位
.def dres16uL=r11 ; 商 低位
.def dres16uH=r12 ; 商 高位
.def dd16uL =r11 ;被除数 低位
.def dd16uH =r12 ;被除数 高位
.def dv16uL =r9 ;除数 低位
.def dv16uH =r10 ;除数 高位
.def dcnt16u =r21
div16u: clr drem16uL ;清除余数低位
sub drem16uH,drem16uH ;清除余数高位
ldi dcnt16u,17 ;循环计数
d16u_1: rol dd16uL ;带进位左移
rol dd16uH
dec dcnt16u ;decrement counter
brne d16u_2 ;不为0转
ret ;return
d16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uH
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uH,dv16uH ;
brcc d16u_3 ;if result negative
add drem16uL,dv16uL ;restore remainder
adc drem16uH,dv16uH
clc ;clear carry to be shifted into result
rjmp d16u_1 ;else
d16u_3: sec ;set carry to be shifted into result
rjmp d16u_1
;**** 16进制转10进制子程序
htd3: ldi temp,16
mov count,temp
clr temp
clr cnt1d
clr cnt2d
clc
loopd:
rol res1
rol res2
rol cnt1d
rol cnt2d
dec count
brne c
ret
c: rcall adjn
rjmp loopd
adjn:
push count
mov count,cnt1d
rcall adjd1
mov cnt1d,count
mov count,cnt2d
rcall adjd1
mov cnt2d,count
pop count
ret
adjd1:
ldi temp,3
add temp,count
sbrc temp,3
mov count,temp
ldi temp,$30
add temp,count
sbrc temp,7
mov count,temp
ret
;**** LED数显子程序
display:sbi portd,5 ;初始化8279控制字
cbi portd,4
ldi r23,$90
out portb,r23
sbi portd,4
cbi portd,5
ldi zh,high(label*2) ;0~15通道号切换
mov zl,r17
sbic admux,0
rjmp dis1
rjmp dis0
dis1: adiw zl,$08
dis0: lpm
out portb,r0
cbi portd,4
nop
sbi portd,4
mov r16,cnt2d
swap r16
rcall outpd
ldi zl,$10
mov r16,cnt2d
andi r16,$0f
add zl,r16
lpm
out portb,r0
cbi portd,4
nop
sbi portd,4
mov r16,cnt1d
swap r16
rcall outpd
mov r16,cnt1d
rcall outpd
sbi portd,5 ;向8279传送数据结束
ret
outpd: ldi zl,low(label*2)
andi r16,$0f
add zl,r16
lpm
out portb,r0
cbi portd,4
nop
sbi portd,4
ret
;**** 延时子程序
delay: push r20 ;2t
l0: push r20 ;2t
l1: push r20 ;2t
l2: push r20 ;2t
l3: dec r20 ;1t
brne l3 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l2 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l1 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l0 ;1T/2T
pop r20 ;2t
ret ;4t
;**** 数据区
.cseg
.org $0200
.dw 0x063f,0x4f5b,0x6d66,0x077d
.dw 0x6f7f,0x7c77,0x5e39,0x7179
.dw 0x86bf,0xcfdb,0xede6,0x87fd
.dw 0xefff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -