微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > led,at89c52 时钟问题

led,at89c52 时钟问题

时间:10-02 整理:3721RD 点击:

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit LCDRS=P2^0;
  5. sbit LCDEN=P2^1;
  6. sbit K1=P3^0;
  7. sbit K2=P3^1;
  8. //uchar code p[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
  9. unsigned long int flag=1;
  10. uint second=58,minute=59,hour=12;
  11. void delay(uint z)
  12. {
  13.         uint i;
  14.         while(z--)
  15.                 for(i=110;i>0;i--);
  16. }
  17. void write_com(uchar com)
  18. {
  19.         LCDRS=0;
  20.         P0=com;
  21.         delay(5);
  22.         LCDEN=1;
  23.         delay(5);
  24.         LCDEN=0;
  25. }
  26. void write_data(uchar datas)
  27. {
  28.         LCDRS=1;
  29.         P0=datas;
  30.         delay(5);
  31.         LCDEN=1;
  32.         delay(5);
  33.         LCDEN=0;
  34. }
  35. void init()
  36. {
  37. //        P3=0x0f;
  38.         TMOD=0x01;
  39.         TH0=(65536-50000)/256;
  40.         TL0=(65536-50000)%256;
  41.         EA=1;                  //开启总中断
  42.         ET0=1;                //开启定时器1中断
  43.         TR0=1;                //开启定时器1  
  44.         LCDEN=0;
  45.         write_com(0x38);
  46.         write_com(0x0c);
  47.         write_com(0x06);
  48.         write_com(0x01);
  49.         write_com(0x80);
  50. }
  51. void main()
  52. {
  53.         init();
  54.         write_data(0x3c);
  55.         delay(5);
  56.         write_data('T');      
  57.     delay(5);   
  58.     write_data('i');
  59.     delay(5);
  60.     write_data('m');
  61.     delay(5);
  62.     write_data('e');
  63.     delay(5);
  64.     write_data(0x3e);                                                                           
  65.     write_com(0x80+0x06);
  66.         do
  67.         {
  68.                 write_data(hour%24/10+48);
  69.             write_data(hour%24%10+48);
  70.             write_data(58);
  71.             write_data(minute%60/10+48);
  72.             write_data(minute%10+48);
  73.             write_data(58);
  74.             write_data(second%60/10+48);
  75.             write_data(second%10+48);
  76.             write_com(0x10);
  77.             write_com(0x10);
  78.             write_com(0x10);
  79.             write_com(0x10);
  80.             write_com(0x10);
  81.             write_com(0x10);
  82.             write_com(0x10);
  83.             write_com(0x10);
  84.                 if(K1==0)        
  85.                 {
  86.                         TR0=0;
  87.                         while(!K1);
  88.                         TR0=1;
  89.                 }        
  90.         }while(1);
  91. }
  92. void time0() interrupt 1
  93. {
  94.         TH0=(65536-50000)/256;
  95.         TL0=(65536-50000)%256;
  96.         flag++;
  97.         if(flag%20==0)
  98.                 second++;         
  99.         if(second%60==0)
  100.                 minute++;
  101.         if(minute%60==0)
  102.                 hour++;
  103. }

复制代码

运行2s之后,原本不应该是到了13:00:00吗?为何分钟位会出现这种情况,跪求大神指导!?


大神们帮帮我,谢谢了。

定时中断中的计时有问题,你拿笔算算先

我都检查半天了,你就直接告诉我吧!多谢了!

if(flag%20==0)
{
        flag=0;
        second++;         
        if(second%60==0)
        {
                second=0;
                minute++;
                if(minute%60==0)
                {
                        minute=0;
                        hour++;
                }
        }
}
改成这样试试,我也没试过啊,但是这样至少比你以前的那个要好些

太长了没看完,不过还是顶贴!

谢谢,我试试!

flag++;
    if(flag%20==0)
           {  
             flag=0;
             second++;         
     if(second%60==0)
{
                second=0;
                minute++;
}
      if(minute%60==0)
{
              minute=0;
              hour++;
}
}

flag++;
    if(flag>20)
          {   
             flag=0;
             second++;         
     if(second>59)
{
                second=0;
                minute++;
}
      if(minute>59)
{
              minute=0;
              hour++;
}
}
这样会更好一点

多谢了,已经解决了哦!对了你知道在源程序的基础上如何添加使用键盘更改时间的功能吗?

有按键接口吗?告诉我按键接口就行了

这是我以前写的数码管时钟程序,你可以参考一下

/******************本程序功能******************
***********************************************
*****整点报时,按键调时,开机蜂鸣器响一声******
***********************************************
**********************************************/
#include<reg52.h>
sbit buzz=P1^0;
sbit key0=P3^4; //模式切换键
sbit key3=P3^5;  //确定
sbit key1=P3^7;   //加
sbit key2=P3^6;  //减
unsigned char hour,min=59,sec=50,T50ms,flag,time,flag1;
unsigned char modstate; //模式状态
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码
void init(); //初始化子程序声明
void delay500us(unsigned char X); //延时子程序声明
void display(); //显示子程序声明
void keyscan();
            
void main()
{  
   EA=1;
   buzz=0;
   init();     
   while(1)
     {
         keyscan();
   if(min==0&&sec==0)
   {
    buzz=0;
   }
     }
}
void init() //定时器0初始化子程序
{
     TMOD|=0x01;
     TH0=(65536-49990)/256;
     TL0=(65536-49990)%256;
     TR0=1;
  ET0=1;
}
void delay500us(unsigned char x)
{
    unsigned char i, j;
     for(i=x;i>0;i--)
       for(j=248;j>0;j--);
}
  void timer0()  interrupt 1 //timer0 中断服务子程序,定时时间为 50ms,本程序加了 10us 的时间修 正量
{
   TH0=(65536-49990)/256;
    TL0=(65536-49990)%256;
    T50ms++;
     if(T50ms>=10)
  {
   buzz=1;
}
   if(T50ms>=20)
       {
          T50ms=0;
          sec++;   
           if(sec>=60)
             {
               sec=0;
               min++;
                 if(min>=60)
                   {   
            buzz=0;
                       min=0;
                       hour++;
                       if(hour>=24)
        hour=0;
                    }
              }  
        }     
}
void timer1()  interrupt 3 //timer1  
{
   TMOD|=0X10;
   TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
time++;
if(time>=20)
time=0;
if(time<10)
flag=0;
else
flag=1;
}
//*************显示函数*********************//
void display()
{
TR1=0;
P2=0XFF;
    P0=table[hour/10];
    P2=0X7F;
    delay500us(5);
P2=0XFF;
    P0=table[hour%10];
    P2=0XbF;
    delay500us(5);
    P2=0XFF;
P0=0XBF;
P2=0XdF;
delay500us(5);
P2=0XFF;
    P0=table[min/10];
    P2=0XeF;
    delay500us(5);
    P2=0XFF;
    P0=table[min%10];
    P2=0XF7;
    delay500us(5);
P2=0XFF;
P0=0XBF;
P2=0XFb;
delay500us(5);
P2=0XFF;
    P0=table[sec/10];
    P2=0XFd;
    delay500us(5);
    P2=0XFf;
    P0=table[sec%10];
    P2=0XFe;
    delay500us(5);
}
//*************调小时函数*****************//

void keyscan() //按键识别钟程序
{
TR0=1;
while(modstate==0)
   {
    TR0=1;
     display();
if(key0==0)
   {
     display();
       if(key0==0)
         modstate=1;  
    while(key0==0)
       display();
    }
   }
//**********************调小时模式******************************************************//
while(modstate==1)
{
TR0=0;   
display();
if(key0==0)
   {
     display();
       if(key0==0)
         modstate=2;  
    while(key0==0)
       display();
    }
   if(key1==0)
     {
       display();
         if(key1==0)
           {
             hour++;
              if(hour>=24)
                hour=0;
        while(key1==0)
            display();
           }
     }
if(key2==0)
   {
      display();
       if(key2==0)
         {
           hour--;      
            if(hour>=24)
               hour=0;
   if(hour<=0)
         hour=23;
          while(key2==0)
            display();
          }
    }
if(key3==0)
   {
      display();
       if(key3==0)
         {
           modstate=0;      
          while(key3==0)
            display();
          }
    }
}
//***********************调分钟模式*****************************************************//
while(modstate==2)
{
TR0=0;
display();
if(key0==0)
{
display();
   if(key0==0)
     modstate=3;  
while(key0==0)
   display();
   }
if(key1==0)
  {
   display();
      if(key1==0)
          {
            min++;
             if(min>=60)
                min=0;
       while(key1==0)
          display();
           }
  }
    if(key2==0)
     {
       display();
         if(key2==0)
          {
            min--;
             if(min>=60)
               min=0;
      if(min<=0)
        min=59;
                while(key2==0)
                 display();
           }
      }
if(key3==0)
   {
      display();
       if(key3==0)
         {
           modstate=0;      
          while(key3==0)
            display();
          }
    }
}
//************************调秒模式****************************************************//
               
while(modstate==3)
{
TR0=0;
display();
    if(key0==0)
   {
     display();
       if(key0==0)
         modstate=1;  
    while(key0==0)
       display();
    }
if(key1==0)
  {
   display();
      if(key1==0)
          {
            sec++;
             if(sec>=60)
                sec=0;
       while(key1==0)
          display();
           }
  }
    if(key2==0)
     {
       display();
         if(key2==0)
          {
            sec--;
             if(sec>=60)
               sec=0;
      if(sec<=0)
        sec=59;
                while(key2==0)
                 display();
           }
      }
if(key3==0)
   {
      display();
       if(key3==0)
         {
           modstate=0;      
          while(key3==0)
            display();
          }
    }
}
}

K1=P3^0;(暂停/确定)
K2=P3^1;(模式选择)
K3=P3^2;(加)
K4=P4^3;(减)

lcd 显示不是数码管
K1=P3^0;(暂停/确定)
K2=P3^1;(模式选择)
K3=P3^2;(加)
K4=P4^3;(减)

改一下就行了呀,不会这都不会改吧,直接把小时,分钟秒用LCD显示就行了

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

网站地图

Top