PA0作为中断请求输入端,PA1作为推挽输出,输出速度50MHz, 接1个灯(高电平驱动) 主程序实现的功能: LED灯亮。中断服务程序实现的功能: LED灯闪5次。
时间: 2023-06-14 22:06:33 浏览: 162
推挽输出与开漏输出的区别(zt) .doc
以下是一个示例程序,基于单片机8051,使用Keil C编译器:
```
#include <reg52.h>
// 定义端口
sbit LED = P1^1; // LED 灯连接的是 P1.1 引脚
// 定义中断服务程序
void ISR() interrupt 0 {
int i;
for (i = 0; i < 5; i++) {
LED = 0; // LED 灯亮
TH0 = 0x3C; // 重新赋值定时器计数器
TL0 = 0xAF;
TR0 = 1; // 启动定时器
while (!TF0); // 等待定时器溢出
TF0 = 0; // 清除定时器溢出标志
LED = 1; // LED 灯灭
TH0 = 0x3C; // 重新赋值定时器计数器
TL0 = 0xAF;
TR0 = 1; // 启动定时器
while (!TF0); // 等待定时器溢出
TF0 = 0; // 清除定时器溢出标志
}
}
// 主函数
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3C; // 定时器计数器初值
TL0 = 0xAF;
TR0 = 1; // 启动定时器
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启中断总开关
while (1) {
LED = 1; // LED 灯亮
}
}
```
程序的运行流程如下:
1. 在主函数中,将定时器0配置为工作在模式1,即16位定时器计数器,每次计数器溢出后自动重载初值,并产生中断请求。然后启动定时器0,允许中断请求,并开启中断总开关。
2. 进入主循环,将LED灯置为高电平,即灭灯。
3. 当中断请求输入端PA0产生中断请求时,处理器跳转到中断服务程序ISR()中执行。在ISR()中,通过定时器0产生500ms的时间延迟,然后将LED灯置为低电平,即亮灯,再通过定时器0产生500ms的时间延迟,最后将LED灯置为高电平,即灭灯,再通过定时器0产生500ms的时间延迟。这样就产生了一个闪烁的效果。
4. 中断服务程序执行完毕后,处理器回到主函数中继续执行。由于主函数中没有其它操作,所以程序将一直停留在这里,直到中断请求再次触发。
阅读全文