在AT89C51的P2.0外接一个BUTTON,在P1.0外接一LED。当按键未按时,LED常灭;按键按一次,LED以亮3s,灭2s方式闪烁;按键再按一次,LED常亮;按键再按一次,LED回到初始常灭的状态。(外部晶振11.0592MHZ,定时时间20ms,定时器采用T0,工作方式一,用定时器中断)
时间: 2023-06-18 18:07:01 浏览: 101
单片机与DSP中的AT89C51单片机在LED显示屏控制电路设计中的应用
这是一个比较典型的单片机实现闪烁LED的例子。下面是AT89C51的P2.0外接一个BUTTON,在P1.0外接一LED的代码实现。
```c
#include <REG51.h>
#define LED P1_0
#define BUTTON P2_0
#define TIMER_VAL 65536 - (20000/1.085) // 20ms
unsigned int timer_count = 0;
unsigned char led_mode = 0;
void timer0_isr(void) interrupt 1 {
TH0 = TIMER_VAL / 256;
TL0 = TIMER_VAL % 256;
timer_count++;
if (timer_count == 150) { // 3s
timer_count = 0;
if (led_mode == 1) {
led_mode = 2;
LED = 0;
}
} else if (timer_count == 100) { // 2s
if (led_mode == 2) {
led_mode = 1;
LED = 1;
}
}
}
void main(void) {
TMOD = 0x01; // Timer0, mode 1
TH0 = TIMER_VAL / 256;
TL0 = TIMER_VAL % 256;
TR0 = 1; // Start timer0
ET0 = 1; // Enable timer0 interrupt
EA = 1; // Enable interrupts
LED = 0;
while (1) {
if (BUTTON == 0) {
while (BUTTON == 0); // Wait for button release
switch (led_mode) {
case 0:
led_mode = 1;
LED = 1;
break;
case 1:
led_mode = 2;
break;
case 2:
led_mode = 3;
LED = 1;
break;
case 3:
led_mode = 0;
LED = 0;
break;
}
timer_count = 0;
}
}
}
```
上述代码中,定时器采用T0,工作方式一,计算出了20ms对应的定时器计数值TIMER_VAL。在timer0_isr中,每隔20ms就会执行一次,用timer_count变量统计时间,用led_mode变量控制LED的状态。在main函数中,轮询BUTTON的状态,当BUTTON被按下时,根据led_mode的状态来控制LED的状态,并重置timer_count。
阅读全文