结构推理 已知fosc=12MHz,试编写程序,在P1.0输出脉冲,每秒产生一个脉宽1ms正脉冲,每分产生一个脉宽10ms正脉冲。
【正确答案】本题有4组定时:1ms、10ms和1s、60s。1ms用T0方式1;10ms用1ms计数10次;1s用T1方式1定时50ms计数20次;60s用1s计数60次。基本定时是1ms和50ms。
   ①计算定时/计数器初值:
   T0初值=216-1000μs/1μs=65536-1000=64536=FC18H
   T1初值=216-50000μs/1μs=65536-50000=15536=3CB0H
   ②设置TMOD:TMOD=00010001B
   ③编制程序如下:
       ORG   0000H        ;复位地址
       LJMP  STAT         ;转初始化程序
       ORG   000BH        ;T0中断入口地址
       LJMP  IT0          ;转T0中断服务程序
       ORG   001BH        ;T1中断入口地址
       LJMP  IT1          ;转T1中断服务程序
       ORG   0100H        ;初始化程序首地址
   STAT:MOV  SP,#60H      ;置堆栈
       MOV   TMOD,#11H    ;置T0、T1定时器方式1
       MOV   TH0,#0FCH    ;置T0初值,定时1ms
       MOV   TL0,#18H     ;
       MOV   TH1,#3CH     ;置T1初值,定时50ms
       MOV   TL1,#0B0H    ;
       MOV   IP,#00000010B;置T0为高优先级
       MOV   IE,#10001010B;T0、T1开中
       SETB  TR1          ;T1启动
       MOV   R5,#10      ;置10ms计数器初值
       MOV   R6,#20      ;置1s计数器初值
       MOV   R7,#60      ;置60s计数器初值
       CLR   F0          ;清10ms脉冲标志
       CLR   P1.0        ;P1.0取低

       MP   MAIN        ;转主程序,并等待中断
       ORG  0200H       ;T1中断服务程序首地址
   IT1:MOV  TH1,#3CH    ;重置T1初值50ms
       MOV  TL1,#0B0H   ;
       DJNZ R6,IT11     ;判1s到否?未到转返回
       SETB P1.0        ;1s到,P1.0输出脉冲
       SETB TR0         ;T0启动,定时1ms
       MOV  R6,#20      ;重置1s计数器初值
       DJNZ R7,IT11     ;判60s到否?未到转返回
       MOV  R7,#60      ;60s到,重置60s计数器初值
       SETB F0          ;置10ms脉冲标志
   IT11:RETI            ;T1中断返回
       0RG  0300H       ;T0中断服务程序首地址
   IT0:MOV  TH1,#0FCH   ;有10ms脉冲标志,重置T0初值1ms
       MOV  TL1,#18H    ;
       JNB  F0,IT01     ;无10ms脉冲标志,输出1ms脉冲
       DJNZ R5,IT02     ;判10ms到否?未到转返回
       MOV  R5,#10      ;10ms到,重置10ms计数器初值
       CLR  F0          ;清10ms脉冲标志
   IT01:CLR TR0         ;T0停
       CLR  P1.0        ;停输出脉冲
   IT02:RETI            ;T0中断返回
【答案解析】