找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2759|回复: 3
收起左侧

求单片机大神帮忙 这个程序怎么改成 第一次中断显示999,第二次中断开始倒计时

[复制链接]
ID:127794 发表于 2016-6-23 16:12 | 显示全部楼层 |阅读模式
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int


code unsigned char LED[] = {  // 八段数码管字形码 (共阴极)
  0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //显示字符0,1,2,3,4,5,6,7
  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, //显示字符8,9,A,B,C,D,E,F
};

sbit key=P3^3;
int flag;         //标志位
uint Count=0;//初始值


void delay(uchar z)
{
  uchar x,y;
   for(x=0;x<z;z++)
   {
            for(y=13;y>0;y--);
         { ;
         }
   }
}
void Timer0() interrupt 1
{
  static uchar Count_50;//
   TH0=0xb1;
   TL0=0xdf;//定时时间为20ms,每20ms中断一次
Count_50--;
   if(Count_50==50)//20ms*50=1秒
   {
     Count_50=0;
    Count--;
}


}

void init()//初始化
{
TMOD=0x01;
TH0=0xb1;
TL0=0xdf;//定时时间为20ms,每20ms中断一次
        ET0=1; //开T1中断
    EA=1; //开总中断
   TH0=(65536-50000)/256;
TL0=(65536-50000)%256;// TR1=1; //T1开始运行
        delay(14);

delay(15);
}

void display()
{
if(key==0)
    { delay(15);
       if(key==0)
       {
           flag++;

             if(flag==4)
             {
              flag=1;
             }
         while(!key);
             }
    }
        switch(flag)
        {
        case 1:
        Count=999;//恢复初值
        ET0=0; //关T0中断
    EA=0; //关总中断
    TR0=0; //T1不运行
        P2=0xef;        //百位
        P0=LED[Count/100];
        delay(50);
        P2=0xef;        //十位
        P0=LED[Count%100];
        delay(50);
        P2=0xef;//个位
        P0=LED[Count%10];
        delay(50);
        break;
        case 2:
        ET0=1; //开T1中断
    EA=1; //开总中断
    TR0=1; //T1开始运行
        if(Count>0)
        {
        P2=0xef;        //百位
        P0=LED[Count / 100];
        delay(50);
        P2=0xef;        //十位
        P0=LED[Count % 100 / 10];
        delay(50);
        P2=0xdf;//个位
        P0=LED[Count % 10];
        delay(50);
        }
        else

{
          P2=0xef;        //百位
        P0=LED[Count / 100];
        delay(50);
      P2=0xef;        //十位
        P0=LED[Count%100/10];
        delay(50);
        P2=0xdf;//个位
        P0=LED[Count%10];
        delay(50);
        }
        break;
        case 3:
           ET0=0; //关T1中断
    EA=0; //关总中断
    TR0=0; //T0不运行
        delay(5);
                P2=0x76;
        P0=LED[3];
        delay(5);
                P2=0x76;
        P0=LED[2];
        delay(5);
                P2=0x76;
        P0=LED[1];
        delay(5);

        break;
  }
}

void main()
{
  init();
  P2=0Xff;        //开数码管
   while(1)
{
display();
  }
}
这个程序怎么改成  第一次中断显示999,第二次中断开始倒计时,第三次中断显示HHH。然后一直循环。


第一和第三个中断程序我改好了,倒计时那个怎么改啊!!!

回复

使用道具 举报

ID:7485 发表于 2016-6-23 20:18 | 显示全部楼层
本帖最后由 ahshmj 于 2016-6-23 20:22 编辑

错误的地方太多。没有改完。你自己再看看吧。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int


code unsigned char LED[] = {  // 八段数码管字形码 (共阴极)
  0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //显示字符0,1,2,3,4,5,6,7
  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, //显示字符8,9,A,B,C,D,E,F
};

sbit key=P3^3;
   uchar flag=3;         //标志位
   uint Count=999;//初始值
   uchar Count_50;//

void delay(uchar z)
{
  uchar x,y;
   for(x=0;x<z;z++)
   {
            for(y=13;y>0;y--);
         { ;
         }
   }
}
void Timer0() interrupt 1
{
//  static uchar Count_50;//
   TH0=0xb1;
   TL0=0xdf;//定时时间为20ms,每20ms中断一次
Count_50--;
   if(Count_50==0)//20ms*50=1秒
   {
     Count_50=20;
    Count--;
   }
   if(Count==0)//
   {
     Count=999;
   flag--;
   }
   if(flag==1)//
   {
     flag=3;
   }

}

void init()//初始化
{
   TMOD=0x01;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;// TR1=1; //T1开始运行
//TH0=0xb1;
//TL0=0xdf;//定时时间为20ms,每20ms中断一次
    ET0=1; //开T1中断
    EA=1; //开总中断
    TR0=1;
   Count_50=20;
        delay(14);

delay(15);
}


void display()
{
if(key==0)
    { delay(15);
       if(key==0)
       {
           flag++;

             if(flag==4)
             {
              flag=1;
             }
         while(!key);
             }
    }
        switch(flag)
        {
        case 1:
        Count=999;//恢复初值
//        ET0=0; //关T0中断
//    EA=0; //关总中断
//   TR0=0; //T1不运行
        P2=0xef;        //百位
        P0=LED[Count/100];
        delay(50);
        P2=0xef;        //十位
        P0=LED[Count%100];
        delay(50);
        P2=0xef;//个位
        P0=LED[Count%10];
        delay(50);
        break;
        case 2:
//        ET0=1; //开T1中断
//    EA=1; //开总中断
//    TR0=1; //T1开始运行
//        if(Count>0)
//        {
        P2=0xef;        //百位
        P0=LED[Count / 100];
        delay(50);
        P2=0xef;        //十位
        P0=LED[Count % 100 / 10];
        delay(50);
        P2=0xdf;//个位
        P0=LED[Count % 10];
        delay(50);
//       }
/*        else

{
          P2=0xef;        //百位
        P0=LED[Count / 100];
        delay(50);
      P2=0xef;        //十位
        P0=LED[Count%100/10];
        delay(50);
        P2=0xdf;//个位
        P0=LED[Count%10];
        delay(50);
        }
        break;          */
        case 3:
//          ET0=0; //关T1中断
//    EA=0; //关总中断
//   TR0=0; //T0不运行
        delay(5);
                P2=0x76;
        P0=LED[3];
        delay(5);
                P2=0x76;
        P0=LED[2];
        delay(5);
                P2=0x76;
        P0=LED[1];
        delay(5);

        break;
  }
}

void main()
{
  init();
  P2=0Xff;        //开数码管
   while(1)
{
display();
  }
}

回复

使用道具 举报

ID:111634 发表于 2016-6-24 16:35 | 显示全部楼层
很佩服ahshmj,改这些程序是很吃力的,先要揣摩原编程者什么意图。有改的功夫,自己编程都编好了。
回复

使用道具 举报

ID:111634 发表于 2016-6-24 20:03 | 显示全部楼层
本帖最后由 zl2168 于 2016-6-24 20:06 编辑

其实该案例可参考倒计时秒表


实例96 能预置初值的倒计时秒表


Proteus仿真一下,确认有效。

实例96 能设置初值的倒计时秒表.rar (40 KB, 下载次数: 4)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表