51单片机60秒倒计时器
时间: 2023-12-06 22:55:47 浏览: 57
以下是51单片机基于定时器和中断实现60秒倒计时器的代码:
```c
#include <reg51.h>
#define FREQ_OSC 11059200UL // 系统时钟频率
#define TIMER0_FREQ 1000UL // 定时器0中断频率
#define TIMER0_RELOAD (65536UL - FREQ_OSC/12/TIMER0_FREQ) // 定时器0重载值
sbit LED = P1^0; // 连接到LED的IO口
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++) {
for(j=0; j<114; j++);
}
}
void init_timer0() {
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = (unsigned char)(TIMER0_RELOAD >> 8); // 高8位赋初值
TL0 = (unsigned char)(TIMER0_RELOAD & 0xFF); // 低8位赋初值
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void timer0_isr() interrupt 1 {
static unsigned char count = 0;
TH0 = (unsigned char)(TIMER0_RELOAD >> 8); // 高8位赋初值
TL0 = (unsigned char)(TIMER0_RELOAD & 0xFF); // 低8位赋初值
count++;
if(count >= TIMER0_FREQ) {
count = 0;
LED = ~LED; // 翻转LED状态
}
}
void main() {
LED = 1; // 初始化LED状态
init_timer0(); // 初始化定时器0
while(1) {
delay_ms(500); // 延时500ms
}
}
```
上述代码中,使用定时器0的模式1实现1ms中断,并且通过计数器count控制每隔1s翻转LED状态。同时在main函数中使用延时函数实现每500ms的延时,从而实现60秒倒计时。
阅读全文