stc89c52RC芯片定时器和两段共阳极数码管实现1s秒表计时0-99,按下一个按钮后立刻由正计时变为倒计时c语言程序
时间: 2024-03-15 07:46:00 浏览: 163
以下是一个简单的C语言程序,使用STC89C52RC芯片的定时器和两个共阳极数码管实现0-99秒的计时器。该程序可以在按下一个按钮后,立即从正计时更改为倒计时模式。
```c
#include <reg52.h>
#define DIGIT_PORT P0 // 数码管的端口
#define BTN P1_0 // 按钮的端口
unsigned char code digit_table[] = { // 数码管的显示表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
unsigned char seconds = 0; // 秒数
unsigned char mode = 0; // 计时器模式:0代表正计时,1代表倒计时
unsigned char digit1 = 0; // 数码管第一位
unsigned char digit2 = 0; // 数码管第二位
void display(unsigned char digit) { // 数码管显示函数
DIGIT_PORT = digit_table[digit];
}
void timer0_isr() interrupt 1 { // 定时器中断服务函数
TH0 = (65536 - 1000) / 256; // 重新加载计时器初值
TL0 = (65536 - 1000) % 256;
if (mode == 0) { // 正计时模式
seconds++; // 秒数加1
if (seconds >= 100) { // 秒数超过99,清零
seconds = 0;
}
} else { // 倒计时模式
if (seconds == 0) { // 倒计时结束
mode = 0; // 切换为正计时模式
} else {
seconds--; // 秒数减1
}
}
digit1 = seconds / 10; // 计算数码管第一位
digit2 = seconds % 10; // 计算数码管第二位
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1:16位自动重载定时器
TH0 = (65536 - 1000) / 256; // 计时器初值
TL0 = (65536 - 1000) % 256;
EA = 1; // 打开总中断
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
while (1) {
if (BTN == 0) { // 按钮按下
while (BTN == 0); // 等待按钮释放
mode = !mode; // 切换计时器模式
seconds = 0; // 重新计数
digit1 = 0; // 数码管第一位清零
digit2 = 0; // 数码管第二位清零
}
display(digit1); // 数码管显示第一位
DIGIT_PORT |= 0x80; // 打开数码管第二位的显示
display(digit2); // 数码管显示第二位
DIGIT_PORT &= ~0x80; // 关闭数码管第二位的显示
}
}
```
在该程序中,我们使用定时器0来进行计时,并使用数码管显示计时结果。当按下按钮时,程序会切换计时器模式,从正计时更改为倒计时。在倒计时模式下,程序会在计时结束时自动切换回正计时模式。
阅读全文