结构推理 设计一个串行方式2发送子程序(SMOD=0),甲机每隔1s(fosc=6MHz,用T0中断)从P1口读入8位数据串行发送,第9数据位作为奇偶校验位。接到乙机核对正确的回复信号(用00H表示)后,置P3.5=1(正确指示灯亮)。否则置P3.5=0(正确指示灯灭),再重发一遍,直至乙机发回正确回复信号。
【正确答案】程序如下:
       ORG   0000H      ;复位地址
       LJMP  ATRS       ;转初始化程序
       ORG   000BH      ;T0中断入口地址
       LJMP  IT0        ;转T0中断服务程序
       ORG   0023H      ;串行中断入口地址
       LJMP  AIS        ;转甲机串行中断服务程序
       ORG   0100H      ;初始化程序首地址
   ATRS:MOV  TMOD,#01H  ;置T0定时器方式1
       MOV   TH0,#3CH   ;置T0初值100ms
       MOV   TL0,#0B0H  ;
       SETB  PT0        ;置T0为高优先级
       MOV   SCON,#90H  ;置串行方式2,允许接收
       MOV   PCON,#00H  ;置SMOD=0
       MOV   R7,#0AH    ;置100ms计数器初值
       SETB  TR0        ;T0启动
       MOV   IE,#10010010B;T0、串口开中
       LJMP  MAIN       ;转主程序,并等待T0、串口中断
       ORG   0200H      ;T0中断服务程序首地址
   IT0:MOV   TH0,#3CH   ;重置T0初值
       MOV   TL0,#0B0H  ;
       DJNZ  R7,CRET    ;判1S到否?1S未到转返回
       MOV   R7,#0AH    ;1S到,恢复100mS计数器初值
       MOV   A,P1       ;从P1口读数据
       MOV   B,A        ;存备份
       MOV   C,PSW.0    ;奇偶标志送TB8
       MOV   TB8,C      ;
       MOV   SBUF,A     ;启动发送
   GRET:RETI            ;T0中断返回
       ORG   0300H      ;甲机串行中断服务程序首地址
   AIS:JNB   TI,AISR    ;判发送/接收中断?接收中断,转接收处理
       CLR   TI         ;发送中断,清发送中断标志
       RETI             ;串行中断返回
   AISR:CLR  RI         ;清接收中断标志
       MOV   A,SBUF     ;读乙机回复信号
       JNZ   A,AIST     ;非0有错,转重发
       SETB  P3.5       ;全0正确,正确指示灯亮
       RETI             ;中断返回
   AIST:CLR  P3.5       ;正确指示灯灭
       MOV   A,B        ;重读数据(备份)
       MOV   C,PSW.0    ;奇偶标志送TB8
       MOV   TB8,C      ;
       MOV   SBUF,A     ;重发
       RETI    ;串行中断返回
【答案解析】