找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2570|回复: 11
打印 上一主题 下一主题
收起左侧

新手求助 时钟代码一直闪。求大神改。没用时钟

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint num,num1;
uchar n;
//int i,int j,int k,int q,int h;
int i,j,k,q,h;
//int s,m,h;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code a[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,};
uchar code c[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void play(uint x);
void delay(a);
void main()
{  
//TMOD=0x11;
//TH0=(65536-45872)/256;
//TL0=(65536-45872)%256;
//TH1=(65536-45872)/256;
//TL1=(65536-45872)%256;
//EA=1;
//ET0=1;
//ET1=1;
//TR0=1;
//TR1=1;
      
num=0;
n=1;
    k=1;
// s=0,m=0,h=0;
    while(1)
    {
  i=0;
  if(i<60)
  {
        for(i=0;i<60;i++)
         {  
             play(num);
    delay(1000);
    num++;   
   }
   
  }
        else
        {  
          num=60*n;
    play(num);
    delay(1000);
       n++;
        }  
}   
}  
void play(uint x)
{
     h=x/3600;
     q=x%3600/600;
        i=x%3600/60;
        j=x%3600%60/10;
        k=x%3600%60%10;
      dula=1;
                  P0=a[h];
                  dula=0;
      P0=0xff;
                  wela=1;
                  P0=c[1];
                  wela=0;
                  delay(1);
      dula=1;
                  P0=a[q];
                  dula=0;
      P0=0xff;
                  wela=1;
                  P0=c[2];
                  wela=0;
                  delay(1);
                  dula=1;
                  P0=a[i];
                  dula=0;
      P0=0xff;
                  wela=1;
                  P0=c[3];
                  wela=0;
                  delay(1);
                  dula=1;
                  P0=a[j];
                  dula=0;
      P0=0xff;
                  wela=1;
                  P0=c[4];
                  wela=0;
                  delay(1);
                  dula=1;
                  P0=a[k];
                  dula=0;
      P0=0xff;
                  wela=1;
                  P0=c[5];
                  wela=0;
                  delay(1);
}
void delay(a)
{
             int i,j;
             for(i=a;i>0;i--)
              for(j=110;j>0;j--);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:141361 发表于 2016-10-13 13:07 | 只看该作者
你把问题说的明白一点吧,都不明白你的问题是什么
回复

使用道具 举报

板凳
ID:142445 发表于 2016-10-13 14:11 | 只看该作者
smallriver 发表于 2016-10-13 13:07
你把问题说的明白一点吧,都不明白你的问题是什么

代码打上去  数码管一闪一闪的,,,,。。。
回复

使用道具 举报

地板
ID:141361 发表于 2016-10-13 16:37 | 只看该作者
目测你的代码是郭天祥的,而且我没看懂你开始的定时器/计数的初始化有什么用,至于你说的数码管有闪烁的原因是由于有这几行代码的原因,   
for(i=0;i<60;i++)
         {  
             play(num);
    delay(1000);
    num++;   
,主要是delay(1000),这个函数是延迟1000ms,也就是1秒的时间,那么你会看起来一闪一闪的,这里的意思大概是延迟1秒再显示一次,所以看起来会有闪烁现象
你这时钟也没用时钟芯片,也不同单片机自带的定时器来计数,只是用延时函数,精确度非常的低
回复

使用道具 举报

5#
ID:123289 发表于 2016-10-13 19:23 | 只看该作者
本帖最后由 yzwzfyz 于 2016-10-13 19:25 编辑

正确的做法:
1、将所有的显示动作数据都准备好(就剩一句送出数据不做,目的:以后可以以最短的时间送出数据)
2、一条命令,切断所有LED的显示。要点:指令少时间短。
3、送出准备好的数据。因为显示已切断,所以无闪动。要点:指令少时间短。这就时为何要事先准备好数据。
4、打开需要显示的那一个LED。
重复扫描显示......
回复

使用道具 举报

6#
ID:123289 发表于 2016-10-13 19:24 | 只看该作者

关键点:
1、在不显示的时候切换显示数据。
2、不显示的时间要短。以提高显示亮度并减小闪动感。
回复

使用道具 举报

7#
ID:123289 发表于 2016-10-13 19:24 | 只看该作者

为了达成以上目的:
硬件上,尽可能将显示扫描“开关”放在同一个口
软件上,先将需要显示的数据准备好,不要:“送出一个,再计算处理一个,再送一个。”。要以最短的时间,在不显示的时候送出。
回复

使用道具 举报

8#
ID:111634 发表于 2016-10-13 21:03 | 只看该作者
本帖最后由 zl2168 于 2016-10-21 10:17 编辑

实例94  模拟电子钟(由80C51定时器产生秒时基)


Proteus仿真一下,确认有效。
实例94 模拟电子钟(由80C51定时器产生秒时基).rar (43.05 KB, 下载次数: 4)




以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。

回复

使用道具 举报

9#
ID:111634 发表于 2016-10-13 21:39 | 只看该作者
不知为什么不能上传附件和图片了?
回复

使用道具 举报

10#
ID:142695 发表于 2016-10-14 11:13 | 只看该作者
先Proteus仿真一下,确认有无纰漏
回复

使用道具 举报

11#
ID:142699 发表于 2016-10-14 11:35 | 只看该作者
不用时钟中断的话,你要根据时序,算出单片机一条指令程序运行的时间间隔.然后来做延迟的.
回复

使用道具 举报

12#
ID:142703 发表于 2016-10-14 13:06 | 只看该作者
显示刷新问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表