结构推理 已知fosc=12MHz,试编制程序:使T0每计满500个外部输入脉冲(设10ms内,外部输入脉冲数少于500个)后,在P1.0输出一个脉宽10ms(由T1定时)的正脉冲。
【正确答案】根据题目要求,将T0用作计数器方式1,T1用作定时器方式1。
   ①计算定时/计数器初值
   T0初值=216-500=65536-500=65036=FE0CH
   T1初值=216-10000μs/1μs=65536-10000=55536=D8F0H
   ②设置TMOD:TMOD=00010101B
   ③编制程序如下:
       ORG   0000H      ;复位地址
       LJMP  STAT       ;转初始化
       ORG   000BH      ;10中断入口地址
       LJMP  IT0        ;转T0中断服务程序
       ORG   001BH      ;T1中断入口地址
       LJMP  IT1        ;转T1中断服务程序
       ORG   0100H      ;初始化程序首地址
   STAT:MOV  SP,#60H    ;置堆栈
       MOV   TMOD,#15H  ;置T0计数器方式1,T1定时器方式1
       MOV   TH0,#0FEH  ;置T0初值,计数500
       MOV   TL0,#0CH   ;
       MOV   TH1,#0D8H  ;置T1初值,定时10ms

       MOV   TL1,#0F0H  ;
       SETB  PT0            ;置T0为高优先级
       MOV   IE,#10001010B  ;T0、T1开中
       SETB  TR0            ;T0启动
       CLR   P1.0           ;P1.0输出低电平
       LJMP  MAIN           ;转主程序,并等待中断
       ORG   0200H          ;T0中断服务程序
   IT0:SETB  P1.0           ;P1.0输出正脉冲
       SETB  TR1            ;启动T1定时10ms
       MOV   TH0,#0FEH      ;重置T0初值,计数500
       MOV   TL1,#0CH       ;
       RETI                 ;T0中断返回
       ORG   0300H          ;T1中断服务程序首地址
   IT1:CLR   P1.0           ;停输出脉冲
       CLR   TR1            ;T1停
       MOV   TH0,#0D8H      ;重置T1初值,定时10ms
       MOV   TL1,#0F0H      ;
       RETI                 ;T1中断返回
【答案解析】