已知某单片机系统每隔20ms测一次温度 8位温度A/D值存在特殊功能寄存器SBUF中 试分别
问题详情
已知某单片机系统每隔20ms测一次温度,8位温度A/D值存在特殊功能寄存器SBUF中,试分别求其1s和1min内的平均值,分别存30H和31H。
参考答案
程序如下:
(1) 1s平均值
AVRIS:MOV R2,#0 ;低8位累加寄存器清0
MOV R3,#0 ;高8位累加寄存器清0
MOV R4,#50 ;置平均次数
ALOP: MOV A,SBUF ;读8位温度A/D值
ADD A,R2 ;低8位累加
MOV R2,A ;回存
CLR A ;高8位与进位累加
ADDC A,R3 ;
MOV R3,A ;回存
LCALL DY20ms ;延时20ms
DJNZ R4,ALOP ;判50次累加完否?未完继续
MOV A,R3 ;50次累加完,求平均值,被除数→A、B
MOV B,R2 ;
MOV R0,#30H ;置商间址
MOV R6,#0 ;置除数50,除数→R6R5
MOV R5,#50 ;
LCALL SUM ;(A、B)÷(R6、R5)=商@R0,余数A
CJNE A,#25,NEXT ;四舍五入
NEXT: JC GRET ;C=1,<25,舍
INC 30H ;C=0,≥25,入
GRET:RET ;
(2) 1min平均值
AVRlm:MOV 31H,#0 ;商累加寄存器清0
MOV 32H,#0 ;余数累加寄存器清0
MOV 33H,#60 ;置平均次数
AMVR: LCALL AVRIS ;求1s温度平均值
MOV A,30H ;读1s温度平均值
MOV B,#60 ;置除数(平均次数)
DIV AB ;1s温度平均值除以60
ADD A,31H ;商累加
MOV 31H,A ;回存
MOV A,B ;
ADD A,32H ;余数累加
MOV 32H,A ;回存
CLR C ;
SUBB A,#60 ;
JC CON ;余数累加<60,余数累加寄存器不变
INC 31H ;余数累加≥60,商累加寄存器+1
MOV 32H,A ;余数累加器减去60后差→32H
CON:
DJNZ 33H,AMVR ;判60次累加完否?未完继续
MOV A,32H ;余数累加四舍五入
CJNE A,#30,NEXT ;
NEXT: JC GRET ;C=1,<30,舍
INC 31H ;C=0,≥30,入
GREI: RET ;