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中,并通过参数传递要显示的数据。

作者:猫咪小虎

物联沃分享整理
物联沃-IOTWORD物联网 » 51单片机,采用双中断实现倒计时60s

发表回复