stc89c51单片机使用C语言用定时器方法编程实现使用计数器显示0~59秒的程序代码
时间: 2023-06-27 09:05:35 浏览: 693
以下是使用stc89c51单片机和C语言编写的使用计数器显示0~59秒的程序代码,使用定时器方法实现。
```c
#include <reg52.h>
#define FREQ_OSC 12000000UL // 晶振频率
#define TIMER_PRESCALER 12 // 定时器分频系数
#define TIMER_COUNTS_PER_SEC (FREQ_OSC / TIMER_PRESCALER / 65536) // 每秒定时器计数值
sbit LED = P1^0; // 连接LED的引脚
unsigned int timer_count; // 定时器计数器
unsigned char seconds; // 秒数
void timer0_isr(void) interrupt 1 // 定时器0中断服务程序
{
TH0 = (65536 - TIMER_COUNTS_PER_SEC) / 256; // 重新设置计数器初值
TL0 = (65536 - TIMER_COUNTS_PER_SEC) % 256;
timer_count++; // 计数器加1
if (timer_count >= TIMER_COUNTS_PER_SEC) // 达到1秒
{
timer_count = 0; // 重置计数器
seconds++; // 秒数加1
if (seconds > 59) // 超过59秒则从0开始
{
seconds = 0;
}
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1(16位定时器/计数器)
TH0 = (65536 - TIMER_COUNTS_PER_SEC) / 256; // 设置计数器初值(定时1秒)
TL0 = (65536 - TIMER_COUNTS_PER_SEC) % 256;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
while (1)
{
LED = 0; // LED亮
for (int i = 0; i < seconds; i++) // 延时
{
for (int j = 0; j < 10000; j++);
}
LED = 1; // LED灭
for (int i = 0; i < 60 - seconds; i++) // 延时
{
for (int j = 0; j < 10000; j++);
}
}
}
```
该程序使用定时器0产生1秒的定时器中断,并在中断服务程序中对计数器进行累加。当计数器累加到1秒时,将秒数加1,如果超过59秒则从0开始。在主函数中,通过LED的亮灭来模拟计数器的计时效果。程序通过每隔1秒更新LED的状态,来显示秒数的变化。
阅读全文