arduino数码管时钟时钟跟数字时钟是一种没?

相关文章推荐
这个是以前的一个作业,当时写的比较用心。先贴个程序有时间再写写详细的设计思路吧!过程结构如下:
下面分部贴上程序
-- 数字钟LIBRARY IEEE;
USE IEEE.STD_LOGIC_1...
话不多说先上图
自从学习FPGA以来,唯一做过的完整系统就是基于basys2得多功能数字表。记得当时做的时候也没少头疼,最后用时间磨出来了一个不是...
VHDL设计简单数字时钟EDA实验要做一个数字时钟,很简单的那种,能跑就好。时基模块首先时钟嘛,总体来说肯定是时序电路。首先要做一个秒脉冲发送器。板子上有48MHz 的时钟输入,那就对它分频好了。LI...
数字电子技术课程设计
盲人报时钟
盲人报时钟
H5时钟源码
他的最新文章
讲师:Array
讲师:李志伟
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 2664|回复: 37
编写的一个8个数码管显示的数字时钟
但不能正常运行
求大神帮忙看看
编写的一个8个数码管显示的数字时钟可调闹钟&&但不能正常运行& &程序还没编完!!&&
#include&reg51.h&
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit LED=P2^2;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char StrTab[8];
unsigned char minute=19,hour=23,
void delay(unsigned int cnt)
& & while(--cnt);
void displaypro(void)
& & StrTab[0]=tab[hour/10];
& & StrTab[1]=tab[hour%10];&&
& & StrTab[2]=0x40;&&
& & StrTab[3]=tab[minute/10];&&
& & StrTab[4]=tab[minute%10];&&
& & StrTab[5]=0x40;&&
& & StrTab[6]=tab[second/10];&&
& & StrTab[7]=tab[second%10];&&
& & TMOD=0x01;&&//定时器0 10ms
& & TH0=0xd8; //初始值
& & TL0=0xf0;
& & ET0=1;
& & TR0=1;
& & TMOD=0x10; //定时器1 动态扫描
& & TH1=0xf8;
& & TL1=0xf0;
& & ET1=1;
& & TR1=1;
& & displaypro();
& & while(1)
& & if(!KEY3)
delay(10000);
& && && & hour++;
& && && & if(hour==24)
& && && & hour=0;
& && && & displaypro();
& &&&if(!KEY2)
& & delay(10000);
& & if(!KEY2)
& && &minute++;
& && &&&if(minute==60)
& &minute=0;
& &displaypro();
& && &&&if(!KEY1)
& & delay(10000);
& & if(!KEY1)
& && &second++;
& && &&&if(second==60)
& &second=0;
& &displaypro();
//定时器1中断//
void time1_isr(void)interrupt 3 using 0
& & TH1=0xf8;
& & TL1=0xf0;
& && &switch(num)
& && &&&case 0:P3=0P0=StrTab[num];
& &&&case 1:P3=0P0=StrTab[num];
& &&&case 2:P3=0P0=StrTab[num];
& &&&case 3:P3=0xf7;P0=StrTab[num];
& &&&case 4:P3=0P0=StrTab[num];
& &&&case 5:P3=0P0=StrTab[num];
& &&&case 6:P3=0P0=StrTab[num];
& &&&case 7:P3=0x7f;P0=StrTab[num];
& &&&default:
& && &num++;
& && &if(num==8)
& && && & num=0;
//定时器0//
void time(void)interrupt 1 using 1
&&TH0=0xd8;
&&TL0=0xf0;
&&count++;
&&switch(count)
& & case 0:
& & case 20:
& & case 40:
& & case 60:
& & case 80:displaypro();
& & case 50:P1=~P1;& &//半秒 LED 闪烁
& & default:
&&if(count==100)
& & count=0;
& & second++;
& & if(second==60)
& && &second=0;
& && &minute++;
& && &if(minute==60)
if(hour==24)
& &hour=0;
正常显示是12-12-12这样&&但是运行后确实这样显示
(44.89 KB, 下载次数: 24)
15:24 上传
而且也不能正常计时
写程序习惯不好,没有注释。
1、取8个RAM单元(编号X0至X7)对应存放8个LED的显示内容(译码后的LED段显示值)。
2、取一个单元做计数器K,从0至7循环计数,分别对应指示显示8个LED。
3、时间中断只用一个,考虑到8个LED扫描显示,中断时常数取5ms,中断后做下列事件:
3.1、处理一下计数器(屏上显示的数字,如时间年月日时分秒,或计数值等)……
3.2、先关所有LED显示,防止切换闪动;
3.3、将K+1(注:当K=8时清K=0。),将K所指示的Xn(当然需要将对应需要显示的时钟位,译成LED码后再送入Xn)送入显示数据口,再打开K所指定的LED。
要点:每次中断只显示一个LED,且先关后显示。
重点需要强调出来, 别人能够很容易看懂
yzwzfyz 发表于
<font color="#、取8个RAM单元(编号X0至X7)对应存放8个LED的显示内容(译码后的LED段显示值)。
2、取一个单元做计数 ...
能不能帮我修改下程序& &看哪里错了&&
先将各行的注释加上去,让别人知道你的目的,再看你错在哪里。
也许:当你完成注释时,自己就已经明白了。
要点:每次中断只显示一个LED,且先关后显示!!!
& &&&case 0:P3=0P0=StrTab[num];
& &&&case 1:P3=0P0=StrTab[num];
& &&&case 2:P3=0P0=StrTab[num];
& &&&case 3:P3=0xf7;P0=StrTab[num];
& &&&case 4:P3=0P0=StrTab[num];
& &&&case 5:P3=0P0=StrTab[num];
& &&&case 6:P3=0P0=StrTab[num];
& &&&case 7:P3=0x7f;P0=StrTab[num];
这是T1中断所做的事,虽然每次切换了LED,但显示的内容却是相同的StrTab[num],这就必须保证,在每次中断之前,StrTab[num]已被刷新,仅改变num是不够的,因为显示的不是num,而是StrTab[num]!
如果某一次中断前未刷新,则轮显示的LED必定是上一轮的LED值,如此就混淆了。
你用两个时间中断的目的是什么?能保证正确地刷新LED数据么?
#include&reg51.h&
sbit KEY1=P1^0;& & & & //定义端口参数
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit LED=P2^2;& & & & //定义指示灯
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};&&//共阴极数码管0-9
unsigned char StrTab[8]; //定义缓冲区
unsigned char minute=19,hour=23,& & & & //定义初始化
void delay(unsigned int cnt)
& & while(--cnt);
void displaypro(void)
& & StrTab[0]=tab[hour/10];& & & &&&//显示小时
& & StrTab[1]=tab[hour%10];&&
& & StrTab[2]=0x40;&&& & & & & & & &&&//显示-
& & StrTab[3]=tab[minute/10];&&//显示分钟
& & StrTab[4]=tab[minute%10];&&
& & StrTab[5]=0x40;&&& & & & & & & & & & & & //显示-
& & StrTab[6]=tab[second/10];&&& & & & //显示秒
& & StrTab[7]=tab[second%10];&&
& & TMOD |=0x01;&&//定时器0 10ms 用于计时
& & TH0=0xd8;& & & & //初始值
& & TL0=0xf0;
& & ET0=1;
& & TR0=1;
& & TMOD |=0x10;& & & & //定时器1 动态扫描
& & TH1=0xf8;
& & TL1=0xf0;
& & ET1=1;
& & TR1=1;
& & displaypro();&&//调用显示处理函数
& & while(1)
& & if(!KEY3)
& & & & delay(10000);
& & & & if(!KEY3)& & & && &//按键3去抖以及动作
& & & && && &&&{
& & & && && && & hour++;
& & & && && && & if(hour==24)
& & & && && && & hour=0;
& & & && && && & displaypro();
& & & && && &&&}
& &&&if(!KEY2)& & & && & //按键2去抖以及动作
& & delay(10000);
& & if(!KEY2)
& && &minute++;
& && &&&if(minute==60)
& & & && &minute=0;
& & & && &displaypro();
& & & && && &&&if(!KEY1)
& & delay(10000);
& & if(!KEY1)& & & && & //按键1去抖以及动作
& && &second++;
& && &&&if(second==60)
& & & && &second=0;
& & & && &displaypro();
//定时器1中断//
void time1_isr(void)interrupt 3 using 0& & & && &//定时器1动态扫描
& & TH1=0xf8;
& & TL1=0xf0;
& && &switch(num)
& && &&&case 0:P3=0P0=StrTab[num];&&//分别调用缓冲区的值进行扫描
& & & && &&&case 1:P3=0P0=StrTab[num];
& & & && &&&case 2:P3=0P0=StrTab[num];
& & & && &&&case 3:P3=0xf7;P0=StrTab[num];
& & & && &&&case 4:P3=0P0=StrTab[num];
& & & && &&&case 5:P3=0P0=StrTab[num];
& & & && &&&case 6:P3=0P0=StrTab[num];
& & & && &&&case 7:P3=0x7f;P0=StrTab[num];
& & & && &&&default:
& && &num++;& & & && & //扫描8次,使用8个数码管
& && &if(num==8)
& && && & num=0;
//定时器0//
void time(void)interrupt 1 using 1
&&static&&//定义内部局部变量
&&TH0=0xd8;
&&TL0=0xf0;
&&count++;
&&switch(count)
& & case 0:
& & case 20:
& & case 40:
& & case 60:
& & case 80:displaypro();& & & & & & & &&&//隔一定时间调用显示处理显示处理
& & case 50:P1=~P1;& & & && &//半秒 LED 闪烁
& & default:
&&if(count==100)
& & count=0;
& & second++;
& & if(second==60)
& && &second=0;
& && &minute++;
& && &if(minute==60)
& & & & minute=0;
& & & & hour++;
& & & & if(hour==24)
& & & && &hour=0;
& & & && &&&}
123.jpg (277.6 KB, 下载次数: 27)
15:21 上传
case 0:P3=0P0=StrTab[num];
& &&&case 1:P3=0P0=StrTab[num];
& &&&case 2:P3 ...
我上传了标注的程序和电路图了& && &他上面不是定义了& & StrTab[0]=tab[hour/10];
& & StrTab[1]=tab[hour%10];&&
& & StrTab[2]=0x40;&&
& & StrTab[3]=tab[minute/10];&&
& & StrTab[4]=tab[minute%10];&&
& & StrTab[5]=0x40;&&
& & StrTab[6]=tab[second/10];&&
& & StrTab[7]=tab[second%10];&&
改变NUM就好了& &&&
重点需要强调出来, 别人能够很容易看懂
已经标注了&&大神帮我看看吧
参考一下楼上的5种电子钟电路、程序和仿真
楼上的5种电子钟摘自张志良编著《单片机实验实训100例》 ISBN 978-7-,北航社出版
读懂了别人正确有效的电路和程序,才能找出自己电路和程序的错误。
张志良编著《单片机实验实训100例》每个案例程序均有详细分析,每条语句均有注释。
你的程序没有定义标记和注释,别人需花多少时间才能读懂理顺,然后再帮你寻找错误,可能吗?
先Proteus仿真一下
模拟电子钟.jpg (306.12 KB, 下载次数: 25)
19:17 上传
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-,北航社出版
上图的设计不是很好的:缺点如下:
1、用了6个(U2-U7),不经济。
改进,用一个晶体管阵列(一个IC里集成有7个三极管),驱动LED的阳极(共阳)。
2、LED的选择驱动用了P1,P3两个口,不利于程序编写。
改进,只用P1口驱动,这里软件编写方便许多。
3、四个发光二极管,两两串并,一般红色压降为1.4V,两只2.8V,未经限流直接接到IO口,使得2.2V电压(5V-2.8V)加在CPU的芯片上,CPU发热大。
改进:设LED是10mA一只。两组并为20mA,串入一只电阻[R=(5V-2.8V-0.3V)/20=100欧,0.3V是IO口的压降]。
写书的人不一定认真。
U2-U7驱动的LED 7个段,都未限流,都是错误的做法。
有人与我讨论电路,很高兴,首先表示感谢,并希望能交个朋友。有关问题我的看法如下:
本电路设计为静态显示,虽然用了6片595,但595价格低廉。用595的好处是串行传送,节省了I/O端口。
若用动态显示,7段加6位位控,需13根I/O端口线。因为不排除剩余端口线还需其他用途。
本帖最后由 zl2168 于
18:00 编辑
用6片595的另一好处是,便于修正时钟参数。而且修正位是快速闪烁(每秒亮暗各5次),修正期间时钟继续正常运行 。你Proteus仿真一下,试试效果。
本帖最后由 zl2168 于
17:58 编辑
&驱动用了P1,P3两个口,不利于程序编写&,完全没有这个问题,看你程序怎么编写。P3口是串行传送数据,P1口是位控加修正位快速闪烁。
至于没有限流电阻,那是为了电路图面简洁,连晶振和复位电路都没画。
实际电路应该加限流电阻,不过无论是595、还是80C51,实际流不出很大电流的,长期工作也不会使芯片过热。
若仅仅是6位时钟,没有修正及修正位快速闪烁功能,电路可简单的多。
时钟动态显示电路,并保留时钟修正及修正位快速闪烁功能,我下一次编一个。
你的仿真图只能使用采用的数码管段码。
上图的设计不是很好的:缺点如下:
1、用了6个(U2-U7),不经济。
改进,用一个晶体管阵列(一个IC里集 ...
请看一下我的回复。
你的仿真图只能使用采用的数码管段码。
这个当然!电路与程序是相配的,程序是根据电路和功能编写的,任何案例都是如此。
读懂了别人正确有效的电路和程序,才能找出自己电路和程序的错误
Powered by- 或用以下帐号直接登录 -
买一个美女不如买它 酷酷的数码时钟
来源:作者:
炫酷数码时钟
  我看过很多很酷的手表和钟表,但绝对没有这款数码时钟有逼格。数字时钟上使用多个丝显示时间,和它带有一个9v电源适配器运行一个月,相当于使用40
w灯泡一天。除此之外,它还带有灯光变暗,带有时钟正常和低光设置。
欢迎关注“南方新闻网”公众号(微信上长按二维码识别 )
请文明发言,还可以输入140字
您的评论已经发表成功,请等候审核
小提示:您要为您发表的言论后果负责,请各位遵守法纪注意语言文明
新闻关键词
为进一步推动广东省大学生深入学习《习近平总书记系列重要讲话读本》(2016年版),增强中国特色社会主义的道路自信、理论自信、制度自信,为实现中华民族伟大复兴的"中国梦"贡献智慧和力量,广东省委宣传部、南方网决定在全省普通高等学校大学生中开展"党中央治国理政新理念新思想新战略知识竞赛"活动。}

我要回帖

更多关于 数字时钟系统 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信