打印
[其它应用]

单片机倒计时

[复制链接]
102|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keaibukelian|  楼主 | 2024-12-3 13:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>

// 数码管段码表
unsigned char code segCode[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};

// 倒计时秒数
int countdownSeconds = 60;
int tensDigit, unitsDigit;
// 标志位,用于记录倒计时状态,0为停止,1为运行,2为暂停
bit countdownStatus = 0;

// 延时函数
void delay(unsigned int i) {
while (i--);
}

// 定时器0初始化
void Timer0_Init() {
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
ET0 = 1;
EA = 1;
}

// 数码管显示函数
void Display(int tens, int units) {
P0 = segCode[tens];
P2 = P2 & 0xF8;
P2 = P2 | 0x04;
delay(100);
P0 = segCode[units];
P2 = P2 & 0xF8;
P2 = P2 | 0x02;
delay(100);
}

// 检测按键状态函数
void CheckKeys() {
if (P1_0 == 0) { // 启动键按下
delay(1000); // 去抖延时
if (P1_0 == 0 && countdownStatus == 0) {
countdownStatus = 1;
TR0 = 1; // 启动定时器0
}
}
if (P1_1 == 0) { // 暂停键按下
delay(1000);
if (P1_1 == 0 && countdownStatus == 1) {
countdownStatus = 2;
TR0 = 0; // 停止定时器0
}
}
if (P1_2 == 0) { // 复位键按下
delay(1000);
if (P1_2 == 0) {
countdownSeconds = 60;
tensDigit = 6;
unitsDigit = 0;
countdownStatus = 0;
TR0 = 0;
}
}
}

// 定时器0中断服务函数
void Timer0_ISR() interrupt 1 {
static unsigned int count = 0;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
count++;
if (count >= 20 && countdownStatus == 1) {
count = 0;
if (countdownSeconds > 0) {
countdownSeconds--;
tensDigit = countdownSeconds / 10;
unitsDigit = countdownSeconds % 10;
}
}
}

void main() {
Timer0_Init();
while (1) {
Display(tensDigit, unitsDigit);
CheckKeys();
}
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2301_81350563/article/details/144097166

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

4141

帖子

5

粉丝