结构推理 已知某单片机系统每隔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        ;
【答案解析】