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

2019-07-15 23:56发布

#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) ;
                  

  }

时钟仿真图 时钟仿真图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
zkl1989
1楼-- · 2019-07-16 00:12
C:UsersAdministratorDesktopQQ截图20130624231136
QQ截图20130624231136.png
一眼万年Mike
2楼-- · 2019-07-16 03:55
 精彩回答 2  元偷偷看……
一抹阳光
3楼-- · 2019-07-16 09:11
问题真不少 你再仿真试试  你对着代码跟你的比较,有什么疑问再交流


#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) ;
                  

  }
zkl1989
4楼-- · 2019-07-16 10:13
   while(1)
{  
          mshi=sec/10;
          mge=sec%10;
          hshi=min/10;
          hge=min%10;
                  display();
      
   }                  
}
非常谢谢楼上的,因为不想显示秒,就改了一下,有时间我在加上按键扫描的函数
cshcwc11
5楼-- · 2019-07-16 13:54
下载看看看怎么样
一抹阳光
6楼-- · 2019-07-16 15:19
zkl1989 发表于 2013-6-25 08:01
while(1)
{  
          mshi=sec/10;

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

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


一周热门 更多>