已知8051单片机的振荡频率为 6NHz,使用定时器 TO方式1定时0.1s,控制发光二极管循环移动闪烁。分别采用中断法和查询法写出程序
时间: 2024-10-18 21:24:52 浏览: 42
8051单片机基于6MHz的振荡器,为了设置定时器T0工作于方式1并计时0.1秒(即100毫秒),我们需要计算溢出周期,然后编写对应的中断法和查询法程序。
首先,我们确定T0方式1的一个机器周期时间(对于8051来说是12个状态周期,每个周期大约等于晶振频率的1/12):
```c
const int machineCycle = 6 * 1000000 / 12; // 每个机器周期的时间
```
对于0.1秒,需要的计数次数(溢出次数)为:
```c
const int countFor100ms = 6000000 / machineCycle; // 计数到溢出所需次数
```
**中断法(Timer Overflow Interrupt)**:
1. 设置定时器T0的工作方式1:TF0=0, IE0=1 (打开中断允许),TH0 = (countFor100ms >> 8), TL0 = countFor100ms & 0xFF;
2. 开启外部中断INT0(如果需要);
3. 中断服务函数ISR(TIMER0):
- 清除溢出标志TF0;
- 控制LED灯的状态改变;
4. 主程序:
- 进入等待中断状态(如:进入RETI指令)。
**查询法(Polling)**:
1. 初始化定时器 T0 同样 TH0 = (countFor100ms >> 8), TL0 = countFor100ms & 0xFF;
2. 循环检查TF0是否溢出:
- TF0 = 0; // 清零溢出标志
- 判断TF0是否为1(溢出),若为1,则执行LED控制操作;
- 然后延时一定时间后再次检查(比如延时几条指令);
3. 主程序不断轮询。
阅读全文