打印

51单片机问题 时钟

[复制链接]
1541|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include<AT89X51.h>
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xc4,0xb0,0x99
,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管
uchar time,num,hour,min,sec;
void delay(uchar x)
{
TMOD=0x01;
TR0=1;
while(x--)
{
  TH0=0x1c;
  TL0=0x18;
  while(!TF);
  TF0=0;
  time++;
}
TR0=0;
}
void write(uchar num,chose)
{
uchar i;

for(i=0;i<2;i++)
    {
         P0=0xff;
     P2=~chose;//位选

     if(i==0)
       {
        P0=table[num%10];//段选
       }
     else
         P0=table[num/10];//段选
     
         chose=chose<<1;
     delay(5);
    }
}
void display()
{
P0=0xff;
P2=0xdb;
P0=0xbf;
delay(5);
}//-隔开时,分,秒显示
void time_add()
{
if(time==1000)
   {
    sec++;
        if(sec==60)
          {
           sec=0;
           min++;
           if(min==60)
             {
                    min=0;
                    hour++;
                    if(hour==24)
                      {
                              hour=0;
                     }
                    }
      }
   }   
}
void main()
{
hour=23;
min=37;
sec=50;
while(1)
{
  write(sec,0x01);
  write(min,0x08);
  write(hour,0x40);
  display();
  time_add();
}
}

QQ截图20130606215701.jpg (220.71 KB )

QQ截图20130606215701.jpg

相关帖子

沙发
ayb_ice| | 2013-6-7 07:49 | 只看该作者
大家猜

使用特权

评论回复
板凳
agz1989|  楼主 | 2013-6-7 09:40 | 只看该作者
显示乱码,乱码变化,搞不懂什么情况

使用特权

评论回复
地板
ayb_ice| | 2013-6-7 10:07 | 只看该作者
          TH0=0x1c;
          TL0=0x18;

          65536-0x1c18 = 58344,
一个基本延时就有超过50MS,delay(5)就有250MS,一个主循环下来更长了,

别说仿真通过了,就是通过实际也是不行的,另外逻辑严重混乱,能OK绝对奇迹

又如uchar time,if(time==1000)...

使用特权

评论回复
5
xlsbz| | 2013-6-7 19:08 | 只看该作者
if(sec==60)

改成大于60  写成等于 不好

使用特权

评论回复
6
huajinz| | 2013-6-7 21:20 | 只看该作者
1、从图中看首先74HC245的方向搞错了,第1脚接地是B输入到A输出!
2、定时器不能这么用的,最好使用中断方式,靠这种查询方式误差太大。
3、if(time==1000)才进行时分秒的累加,主程序中要先经过3个write函数才能进行这个判断,就是每次到这里就是3*5=15的倍数,1000没有15的约数,所以永远也不会执行if内的指令了。
还有一些细节,就不一一指出了。看来楼主要大改了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

45

帖子

1

粉丝