设单片机晶振频率为6MHz ,选用定时器/计数器T0工作方式1,定时100ms产生一次中断,使接在P1.0上的发光二极管间隔1S亮一次,(亮1S,灭1S),亮10后停止。请计算T0的计数初值并编程。(10分)
时间: 2023-12-04 19:04:42 浏览: 1106
最新单片机仿真 用定时器T0的中断控制1位LED闪烁
5星 · 资源好评率100%
根据定时器/计数器T0工作方式1的计数公式可得:
计数初值 = 65536 - (所需计数次数 × 每次计数所需的机器周期数)
其中,所需计数次数为:
所需计数次数 = 定时时间 / 计数器溢出时间
其中,定时时间为100ms,计数器溢出时间为 1 / (晶振频率 / 12),因为工作方式1时,T0的时钟源为晶振频率 / 12。
将上述值代入计算公式可得:
所需计数次数 = 100ms / (1 / (6MHz / 12)) = 600
计数初值 = 65536 - (600 × 12) = 58336
因此,T0的计数初值为58336,编程如下:
```c
#include <reg52.h>
#define LED P1_0
void main() {
TMOD = 0x01; // T0工作方式1
TH0 = 0xE3; // 计数初值为58336
TL0 = 0xC0;
TR0 = 1; // 启动T0
ET0 = 1; // 允许T0中断
EA = 1; // 开启总中断
LED = 0; // 初始时关闭LED
while (1); // 等待中断
}
void T0_ISR() interrupt 1 {
static unsigned char cnt = 0; // 计数亮灭次数
static bit led_state = 0; // LED状态,0表示灭,1表示亮
cnt++;
if (cnt == 20) { // 亮灭10次
TR0 = 0; // 停止T0
ET0 = 0; // 禁止T0中断
} else {
if (led_state) {
LED = 0;
led_state = 0;
TH0 = 0xE3; // 重新设置计数初值
TL0 = 0xC0;
} else {
LED = 1;
led_state = 1;
TH0 = 0xE2;
TL0 = 0x9C;
}
}
TF0 = 0; // 清除T0中断标志
}
```
阅读全文