微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 跪求:单片机为核心的多功能电子表跑灯程序不能实现

跪求:单片机为核心的多功能电子表跑灯程序不能实现

时间:10-02 整理:3721RD 点击:
要求以单片机为核心设计一个多功能电子表,具有电子时钟和跑表功能。做时钟时在6位LED 显示器上显示时、分、秒,做跑表时显示范围000.0秒~999.9秒并具有跑表启动、停止。跑灯程序不能实现,跪求大神指导!
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
                        0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/*定义并初始化变量*/
uchar seconde=0;
uchar minite=0;
uchar hour=0;
uchar mstcnt=0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P3_2=P3^2;                 // second 调整定义
sbit P3_3=P3^3;            //minite调整定义
sbit P3_4=P3^4;                 //hour调整定义
/*函数声明*/
void delay(uchar k );      //延时子程序
void time_pro( );    //时间处理子程序
void display( );       //显示子程序
void keyscan( );                //键盘扫描子程序
void timer();  //秒表子程序
/*****************************/
/*延时子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
   {
    for(j=0;j<125;j++)
     {;}
   }
}     
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
        if(seconde==60)                    //秒钟设为60进制
          { seconde=0;
            minite++;
           if( minite==60)              //分钟设为60进制
              { minite=0;
                hour++;
              if(hour==24)              //时钟设为24进制
                 {hour=0; }
              }
          }
   
}
/*****************************/
/* 显示子程序*/
/*****************************/
void display(void)   
{      
        P2=0xfe;
        P0=dispcode[hour/10];                 //显示小时的十位
        delay(4);
        P2=0xfd;
        P0=(dispcode[(hour%10)])|0X80;        //显示小时的个位
        delay(4);
        P2=0xfb;
        P0=dispcode[minite/10];               //显示分的十位
        delay(4);
        P2=0xf7;
        P0=(dispcode[minite%10])|0X80;        //显示分的个位
        delay(4);
        P2=0xef;
        P0=dispcode[seconde/10];             //显示秒的十位
        delay(4);
        P2=0xdf;
        P0=dispcode[seconde%10];             //显示秒的个位
        delay(4);      
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan (void)
{
    if(P3_2==0)                     //按键1秒的调整
       {
           delay(30);
               if(P3_2==0)
                   {
                       seconde++;
                      if(seconde==60)
                        {seconde=0; }
                   }
       }
    if(P3_3==0)                    //按键2分的调整
       {
            delay(30);
               if(P3_3==0)
                 {
                    minite++;
                    if(minite==60)
                      {minite=0;}
       }
     }
    if(P3_4==0)                   //按键3小时的调整
       {
            delay(30);
               if(P3_4==0)
                   {
                       hour++;
                    if(hour==24)
                      {hour=0; }
                 }
       }
}
void timer0(void) interrupt 1 using 0     //定时器0方式1,50ms中断一次
    {
       TH0=0x3c;
       TL0=0xb0;
       TMOD = 0x11;
        mstcnt++;
        if(mstcnt==20)
        {
            seconde++;
            mstcnt=0; //注意点。对计数单元的清零十分的重要,本次调试中就是
          if(mstcnt==1) //进入秒表模式才执行
   {  
     if(P1^0==1) //清零
     {  
          minite = 0;
         seconde = 0;   
         mstcnt=0;
    }
    if(P1^0==0);//秒表开始计时
  {
      
      if(seconde == 10) // 10*0.1s=1s,s++
      {seconde = 0;
       minite ++;
     if(minite == 100)  //100s
        {minite = 0;
        minite ++;
     // if(ss == 10)
        //{ss = 0;
       // s  = 0;
        //ms = 0;
        }
        }
       }
  }
}
      if(P1^0==0);//秒表停止
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{       P1=0xff;                //初始化p1口,全设为1      
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c;             //预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
    while (1)
{   
         keyscan( );    //按键扫描
         time_pro( ); //时间处理
         display( ); //显示时间
                 
}
}


你这段永远都进不去:
if(mstcnt==1) //进入秒表模式才执行
   {  
     if(P1^0==1) //清零
     {  
          minite = 0;
         seconde = 0;   
         mstcnt=0;
    }
    if(P1^0==0);//秒表开始计时
  {
      
      if(seconde == 10) // 10*0.1s=1s,s++
      {seconde = 0;
       minite ++;
     if(minite == 100)  //100s
        {minite = 0;
        minite ++;
     // if(ss == 10)
        //{ss = 0;
       // s  = 0;
        //ms = 0;
        }
        }
       }
  }

那要怎么修改呢!大神求指导一下!非常感谢!

你在“if(mstcnt==1)”语句之前清零“mstcnt = 0”,肯定满足不了if语句条件的了,你把“mstcnt = 0”这句放在if语句结束之后

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top