微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用51单片机写的时钟程序,protues仿真就是数字不跳,各位.....

用51单片机写的时钟程序,protues仿真就是数字不跳,各位.....

时间:10-02 整理:3721RD 点击:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值0123456789-
//void display(uchar ha ,uchar hb,uchar m,uchar ma,uchar mb);
void display(); //声明显示函数
void init(); //声明初始化函数
#define cont  50000    //to计数值,约50ms
#define  TH_M1 (65636-cont)/256   //t0计数高八位
#define  TL_M1 (65636-cont)%256//t0计数低八位
uchar sec,mshi,mge,hshi,hge,a;       //mshi分十位,mge分个位,hshi小时十位,hge小时个位 ,sec秒
uchar min,hour;
#define duxu P2//段选
#define wei P1   //位选           
                  
void delay(uint z)   //延迟z*1ms
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void main()    //主函数
{    init();
     
   while(1)
{  
       { if(sec==59)
            {
              sec=0;
               min++;
                if(min==59)
                    {  min=0;
                       hour++;
                     }
                      else{mshi=min/10;
                           mge=min%10;}
                       if(hour==23)
                         hour=0;
                          else{hshi=min/10;
                          hge=min%10;}
                  }   
        }
    delay(10);
      display();
      
   }                  
}
void init() //初始化
{  
    IE=0X82; //开总中断,开定时器0
    TMOD=0X01; //TO采用mode1
    TH0=TH_M1; //装初值
    TL0=TL_M1;
    TR0=1;//启动T0
    sec=0;
    min=0;
    hour=12;
    a=0;   
}
void  timer0(void) interrupt 1  //中断t0
{
    TH0=TH_M1;   //装初值
    TL0=TL_M1;
    //a++;
    if(++a==20)
    {   a=0;
        sec++;
       { if(sec==59)
            {
              sec=0;
               min++;
                if(min==59)
                    {  min=0;
                       hour++;
                     }
                      else{mshi=min/10;
                           mge=min%10;}
                       if(hour==23)
                         hour=0;
                          else{hshi=min/10;
                          hge=min%10;}
                  }   
        }
    }                          
}
void display()
{      
        
                 wei=0xfe;
     duxu=dula[hshi];
                 delay(5);
     
                 wei=0xfd;
        duxu=dula[hge];
                 delay(5) ;
                  
              
                 wei=0xfb;
        duxu=dula[10];
                 delay(5) ;
                 wei=0xff;
  
                  wei=0xf7;
        duxu=dula[mshi];
                 delay(5) ;
                 
                 wei=0xef;
        duxu=dula[mge];
                 delay(5) ;
                  
  }

时钟仿真图


C:\Users\Administrator\Desktop\QQ截图20130624231136


扫描。。

问题真不少 你再仿真试试  你对着代码跟你的比较,有什么疑问再交流

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值0123456789-
//void display(uchar ha ,uchar hb,uchar m,uchar ma,uchar mb);
void display(); //声明显示函数
void init(); //声明初始化函数
#define cont  50000    //to计数值,约50ms
#define  TH_M1 (65535-cont)/256   //t0计数高八位
#define  TL_M1 (65535-cont)%256//t0计数低八位
uchar sec,mshi,mge,hshi,hge,a;       //mshi分十位,mge分个位,hshi小时十位,hge小时个位 ,sec秒
uchar min,hour;
#define duxu P2//段选
#define wei P1   //位选           
                  
void delay(uint z)   //延迟z*1ms
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void main()    //主函数
{    init();
     
   while(1)
{  
          mshi=sec/10;
          mge=sec%10;
          hshi=min/10;
          hge=min%10;
                  display();
      
   }                  
}
void init() //初始化
{  
    IE=0X82; //开总中断,开定时器0
    TMOD=0X01; //TO采用mode1
    TH0=TH_M1; //装初值
   TL0=TL_M1;
    TR0=1;//启动T0
    sec=0;
    min=0;
    hour=12;
    a=0;   
}
void  timer0(void) interrupt 1  //中断t0
{
      TH0=TH_M1;   //装初值
    TL0=TL_M1;
    //a++;
    if(++a==20)
    {   a=0;
        sec++;
       { if(sec==60)  //
            {
               sec=0;
               min++;
                if(min==60)
                    {
                                           min=0;
                       hour++;
                                           if(hour==24)
                          hour=0;
                     }
                     
             }   
        }
    }                          
}
void display()
{      
        
                 wei=0xfe;
     duxu=dula[hshi];
                 delay(5);
     
                 wei=0xfd;
        duxu=dula[hge];
                 delay(5) ;
                  
              
                 wei=0xfb;
        duxu=dula[10];
                 delay(5) ;
                 wei=0xff;
  
                  wei=0xf7;
        duxu=dula[mshi];
                 delay(5) ;
                 
                 wei=0xef;
        duxu=dula[mge];
                 delay(5) ;
                  
  }

   while(1)
{  
          mshi=sec/10;
          mge=sec%10;
          hshi=min/10;
          hge=min%10;
                  display();
      
   }                  
}
非常谢谢楼上的,因为不想显示秒,就改了一下,有时间我在加上按键扫描的函数

下载看看看怎么样

另外小编要注意时 分 秒进位时的判断条件,如果是计数0~59应该写成  
if(sec==60)  //这里是60   同理min和hour应该是60和24
{
   sec=0;

或者写成 :      
if(sec>59)  
{
   sec=0;

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值0123456789-
void display(); //声明显示函数
void init(); //声明初始化函数
void keyscan();
sbit pb1=P3^2; //功能按键,按一下调分,在按一下调时
sbit pb4=P3^3;
sbit pb2=P3^6;
sbit pb3=P3^7;
#define cont  50000    //to计数值,约50ms
#define  TH_M1 (65535-cont)/256   //t0计数高八位
#define  TL_M1 (65535-cont)%256//t0计数低八位
uchar sec,mshi,mge,hshi,hge,a;       //mshi分十位,mge分个位,hshi小时十位,hge小时个位 ,sec秒
uchar min,hour;
#define duxu P2//段选
#define wei P1   //位选           
                  
void delay(uint z)   //延迟z*1ms
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void main()    //主函数
{    init();
     
   while(1)
{         
          keyscan();
          delay(20);
         /* mshi=min/10;
          mge=min%10;
          hshi=hour/10;
          hge=hour%10; */
          display();
          keyscan();
   }                  
}
void init() //初始化
{  
    IE=0X82; //开总中断,开定时器0,中断into
    TMOD=0X01; //TO采用mode1
    // TCON=0X01;
     TH0=TH_M1; //装初值
    TL0=TL_M1;
    TR0=1;//启动T0
    sec=0;
    min=0;
    hour=0;
    a=0;
   

}
void  timer0(void) interrupt 1  //中断t0
{
    TH0=TH_M1;   //装初值
    TL0=TL_M1;
    //a++;
    if(++a==20)
    {   a=0;
        sec++;
       { if(sec==60)  //
            {
               sec=0;
               min++;
                if(min==60)
                    {
                           min=0;
                         hour++;
                         if(hour==24)
                          hour=0;
                     }
                     
             }   
        }
    }                          
}
void display()
{        
                   mshi=min/10;
                    mge=min%10;
                   hge=hour%10;
                  hshi=hour/10;  
                 wei=0xfe;
         duxu=dula[hshi];
                 delay(5);
                  
                                          
                  
                 wei=0xfd;
        duxu=dula[hge];
                 delay(5) ;
                    
              
                 wei=0xfb;
        duxu=dula[10];
                 delay(5) ;
                 wei=0xff;
  
                 
                  wei=0xf7;
        duxu=dula[mshi];
                 delay(5) ;
         
               
                 wei=0xef;
        duxu=dula[mge];
                 delay(5) ;
                  
  }
void keyscan()
{  
           delay(10);
            if(pb2==0) //加分钟
             {  delay(20);
                if(pb2==0)
                min++;
                 if(min>60)
                    min=0;
                  while(!pb2);
              }      
                    
          if(pb3==0) //减分钟
             {  delay(20);
                if(pb3==0)
                min--;
                 if(min==0)
                   min=60;
                   while(!pb3);     
              }
                     
               
   
                 
         
          if(pb1==0) //加小时
             {  delay(20);
                if(pb2==0)
                hour++;
                 if(hour>24)
                    hour=0;
              while(!pb1);
              }
          if(pb4==0)//减小时
             {  delay(20);
               if(pb3==0)
                hour--;
                 if(hour==0)
                   hour=24;
                  while(!pb3);     
              }         
}      
求解,?我把按键子函数加上去后仿真是数码管就闪烁,这是咋回事?不调用按键函数就正常

发现按键函数有错改了过来就好了,终于好了

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

网站地图

Top