闪烁的LED 灯(用T1定时方式!实现)。要求:用P2.0口驱动1只LED灯,以1秒为胃期闪烁。要求用T1定时方式1方式实现。不能用软件延时。分别采用查询和中断两种方式实现。
时间: 2024-12-20 11:21:43 浏览: 4
闪烁的LED灯通过T1定时器的1方式实现,可以分为查询方式和中断方式两部分。
**查询方式实现:**
1. **初始化硬件:**
- 首先需要配置P2.0口作为GPIO,将T1的溢出标志TF1设置为中断触发源,并开启外部中断INT0。
```
P2_0 = 0; // 设置P2.0为输出模式
TMOD &= ~0x0F; // 清除TMOD,选择T1工作方式1
TH1 = 0xFD; // 设置初值,让计数值接近于8792(晶振频率/128),约等于1s周期的一半
TL1 = 0xFD;
EA = 1; // 开启总中断
ET1 = 1; // 启动T1中断
```
2. **主循环:**
- 主循环内,不断检查T1是否溢出(即计数到最高位),如果溢出则点亮LED,然后清零计数器,等待下一次溢出。
```c
while(1) {
if(TF1) { // 查询T1溢出标志
TF1 = 0; // 清除溢出标志
P2_0 = !P2_0; // LED亮灭切换
}
}
```
**中断方式实现:**
1. **初始化硬件:**
- 类似查询方式,设置P2.0口、T1的工作方式和中断,但在初始化时不需要设置软件延时。
```
... (同上)
IT1 = 1 << 4; // 设置中断向量为TF1
```
2. **中断服务程序:**
- 当T1溢出时,中断服务程序被执行,LED状态改变后自动返回主循环继续执行。
```c
void interrupt() interrupt 1 using 0 { // 中断优先级0
TF1 = 0; // 清除溢出标志
P2_0 = !P2_0; // LED亮灭切换
}
```
**相关问题:**
1. 查询方式与中断方式相比,哪种更耗CPU资源?
2. 在这两种方法中,如何避免死锁问题?
3. 如果更改晶振频率,应该如何调整TH1和TL1的值以保持1秒周期?
阅读全文