51单片机,采用双中断实现倒计时60s
#include <reg51.h>
#define GPIO_DIG P0
sbit P3_5=P3^5;
sbit LED = P1^2;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
unsigned char num = 0;
unsigned char num2 = 60; // 倒计时从60开始
unsigned char k;
unsigned char i;
unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 0-9的显示码
unsigned char DisplayData[8] = {0}; // 用来存放要显示的8位数的值,但这里只用两位
void delayms(unsigned char xms) {
unsigned char a, b;
for (a = xms; a > 0; a–) {
for (b = 112; b > 0; b–); // 稍微调整延时以匹配您的硬件
}
}
void saomiao() {
DisplayData[0] = DIG_CODE[num2 / 10];
DisplayData[1] = DIG_CODE[num2 % 10];
for (k = 0; k < 2; k++) {
switch (k) {
case 0:
LSA = 1; LSB = 1; LSC = 1; // 选择第一位数码管(这里可能需要调整以匹配您的硬件)
GPIO_DIG = DisplayData[0];
break;
case 1:
LSA = 0; LSB = 1; LSC = 1; // 选择第二位数码管(这里可能需要调整以匹配您的硬件)
GPIO_DIG = DisplayData[1];
break;
}
delayms(1);
GPIO_DIG = 0x00; // 消隐
}
}
void timer0_isr(void) interrupt 1 { // 定时器0中断服务程序
TH0 = (65535 – 50000) / 256;
TL0 = (65536 – 50000) % 256;
P3_5= ~P3_5;
}
void timer1_isr() interrupt 3{
num2–;
if (num2==0)
{
num2=60;
/* code */
}
LED = ~LED;
}
void main(void) {
TMOD = 0x61; // 设置定时器0为模式1(16位定时器)
TH0 = (65535 – 50000) / 256;
TL0 = (65535 – 50000) % 256;
TH1=246;
TL1=246;
EA = 1; // 使能全局中断
ET1=1;
ET0 = 1; // 使能定时器0中断
TR0 = 1; // 启动定时器0
TR1=1;
while (1) {
saomiao();
}
}
// DigDisplay 函数在这里不需要,因为我们已经在saomiao中实现了动态显示逻辑。
// 如果您想将显示逻辑分离出来,可以将saomiao中的代码移动到DigDisplay中,并通过参数传递要显示的数据。
作者:猫咪小虎