89C51单片机用T1查询控制P2口8个LED依次循环点亮代码
时间: 2024-10-20 11:03:35 浏览: 34
基于-AT89C51单片机数字温度测量显示系统设计和制作.doc
89C51单片机使用定时器T1查询的方式控制P2口LED灯循环点亮的原理通常涉及中断技术和位操作。下面是一个简化的示例代码,假设我们已经配置了T1为模式2,计数从0到255,并设置了外部中断INT0触发。
```c
#include <reg52.h> // 包含89C51头文件
// LED状态寄存器
sbit LEDs = P2^0; // 第一个LED映射到P2.0
void main() {
TMOD = 0x01; // 设置T1为模式2(16位自动重装定时器)
TH1 = 0xFE; // 定义一个大于1ms的初值(256*12MHz / 256 = 1ms)
TL1 = 0xFD;
ET1 = 1; // 开启T1溢出中断
EA = 1; // 全局中断使能
TR1 = 1; // 启动T1计时
while(1) {
while(!TF1); // 等待T1溢出标志TF1变为1
TF1 = 0; // 清除溢出标志
// 查询当前T1计数值,对8取模得到LED编号
int led_idx = (TH1 + TL1) % 8;
LEDs = 1 << led_idx; // 将LED对应位置高
__delay_ms(50); // 暂停一段时间让LED亮起
LEDs = 0; // 关闭当前LED
}
}
// T1溢出中断服务函数
void interrupt 1(void) interrupt 1 using 1 {
if (IE || IT1) { // 判断是否允许T1中断
P2 &= ~LEDs; // 清除P2口对应的LED
TF1 = 1; // 设置T1溢出标志
}
}
阅读全文