试用定时/计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出 一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHz。
时间: 2023-07-15 13:13:51 浏览: 240
这个问题需要使用8051单片机来实现。我们可以将T1设置为计数器模式,并且将其预设为65536-12000=53536,这样每次计数到0时就代表经过了1ms。当T1计数器计数到100时,就将其转换为定时器模式,并设置计数值为120,这样经过120个1ms的时间后,T1将产生一个10ms的正脉冲。
代码如下:
```assembly
ORG 0H
MOV TMOD, 0 ; 设置T0和T1为16位计数器模式
SETB TR1 ; 启动T1计数器
MOV TH1, #0D0H ; 设置T1计数器初值为53536
MAINLOOP:
JNB TF1, $ ; 等待T1计数器溢出
CLR TF1 ; 清除T1计数器溢出标志
INC P1.0 ; 计数器加1
CJNE P1.0, #100, MAINLOOP ; 如果计数器还未到100,则继续计数
CLR TR1 ; 停止T1计数器
MOV TH1, #30H ; 设置T1计数器初值为120
SETB TR1 ; 启动T1定时器模式
JNB TF1, $ ; 等待T1定时器模式时间到达
CLR TF1 ; 清除T1计数器溢出标志
CLR P1.0 ; 输出一个10ms的正脉冲
CLR TR1 ; 停止T1定时器模式
MOV TH1, #0D0H ; 设置T1计数器初值为53536
SETB TR1 ; 启动T1计数器
SJMP MAINLOOP ; 重新开始计数循环
```
需要注意的是,在设置T1计数器初值时,我们需要将其设置为65536-计数值,因为T1计数器是一个16位的寄存器,计数范围为0~65535。同时,在输出10ms正脉冲时,我们需要先停止T1计数器,然后重新设置T1为定时器模式,并在T1定时器模式时间到达后输出正脉冲。最后,我们再重新将T1设置为计数器模式,重新开始计数循环。
阅读全文