打印

51单片机带闹钟时钟的程序问题,望各位指教一番

[复制链接]
1643|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题描述:烧入程序后,时间数值闪现一下之后就一直如图所示。


#include<AT89X51.h>
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99
,0x92,0x82,0xf8,0x80,0x90};//共阳数码管?
uchar time,hour,min,sec;
void delayms(uchar i)
{
while(i--);
}
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;
     delayms(2000);
    }
}
void display()
{
P0=0xff;
P2=0xdb;
P0=0xbf;
delayms(2000);
}//-隔开时,分,秒显示
void init()
{
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1)
{
  write(sec,0x01);
  write(min,0x08);
  write(hour,0x40);
  display();
}
}
void main()
{
hour=23;
min=37;
sec=50;
write(sec,0x01);
write(min,0x08);
write(hour,0x40);
display();
init();
}

void T0_Time() interrupt 1
{
TH0=0x4c;
TL0=0x00;
time++;
if(time==20)
      {  
           time=0;  
       sec++;
           if(sec==60)
             {  
              sec=0;
              min++;
              if(min==60)
                {
                        min=0;
                        hour++;
                        if(hour==24)
                          {
                                  hour=0;
                         }
                      }
             }
      
       }   
}

相关帖子

沙发
agz1989|  楼主 | 2013-7-4 10:52 | 只看该作者
如图

捕获.PNG (38.36 KB )

捕获.PNG

使用特权

评论回复
板凳
叶伤| | 2013-7-5 10:09 | 只看该作者
看不出来你的意图。提点小问题。
delayms(2000);//程序定义是void delayms(uchar i)
uchar i的范围是0~255

使用特权

评论回复
地板
liang7143| | 2013-7-5 11:06 | 只看该作者
LZ 基础不过关啊
问题还是得自己慢慢调试 慢慢找
直接贴代码 估计很难有人回复

使用特权

评论回复
5
薛伟| | 2013-7-6 16:38 | 只看该作者
如图得原因,貌似是你的主函数只执行了一次啊,得加个循环语句循环执行起来

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
chen125318 + 1 他写在这个里面的init()
6
飞扬跋扈| | 2013-7-6 22:02 | 只看该作者
怎么没看见while(1)?

使用特权

评论回复
7
liu0000feng| | 2013-7-8 10:27 | 只看该作者
貌似你的主函数里只循环了一次啊,只送了一次数据。

使用特权

评论回复
8
叶伤| | 2013-7-8 22:44 | 只看该作者
照着程序仿真正常,可以显示时分秒。软件:μVision2 V2.30和isis 7.8,都是中文**版。不明白楼主用的什么仿真工具,为什么要把位选信号放倒了。

另,不懂为什么,延时函数用int时显示会出现闪烁,用uchar才正常。

仿真元件:P0经排阻上拉后接入CA数码管的段选,P1经7406反相后用排阻上拉再接入数码管位选。估计7406是oc门,必须上拉。

PS:楼主是来消遣俺们这些菜鸟?明明很简单的东西却整这么复杂的程序,还硬要说错。。又或者是考uchar的转换?

使用特权

评论回复
9
叶伤| | 2013-7-8 22:50 | 只看该作者
飞扬跋扈 发表于 2013-7-6 22:02  怎么没看见while(1)?

while(1)在子函数里,主函数只在最开始时起主导,很非主流的写法。

使用特权

评论回复
10
nyf1972| | 2013-7-9 00:19 | 只看该作者
建议你多了解一下裸奔OS吧,还用这么原始的思维做程序,调试费劲得很!
首先,你的定时是不准确的,误差比较大。第二,CPU占用了太多带宽,没空做其他的事情了。我下面的程序你可以研究一下,多少年来都用这个!
你需要的是做一个时基就OK了(我这里是10ms)
到这个位置的时候,程序自动执行。
启动定时器只需要2个指令:送时间值和开启定时器
查询定时器是否完毕,就查询标志位
一个典型的定时器程序如下
                                        if((Timer1Base10ms--==0)&&(Timer1Base10msEn))
                                                {
                                                Timer1Base10msEn=0;
                                                Timer1Base10msOver=1;//

                                                }
        启动定时器代码如下:
        Timer1Base10ms=100;
           Timer1Base10msEn=1;
                     定时器结束后的处理如下:
          if(Timer1Base10msOver)
              {
                           Timer1Base10msOver=0;
                           <加入你需要处理的事情>
                            }

使用特权

评论回复
11
通宵敲代码| | 2013-7-9 10:31 | 只看该作者
void init()
{
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1)
{
   write(sec,0x01);
   write(min,0x08);
   write(hour,0x40);
  display();
}

这里面别用死循环

使用特权

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

本版积分规则

22

主题

45

帖子

1

粉丝