51单片机问题,自己弄的一个电子钟,出现数字变化很快(秒变的很快),什么原因,求解释

作者&投稿:化党 (若有异议请与网页底部的电邮联系)
关于用51单片机做一个电子时钟的问题~

这个就是在你的数码管显示语句中,任意加入一个即可

像你说的在小时和分钟之间加一个小数点,那么就加一个小时个位数显示的语句

只是这个增加的语句不是显示数字,是单独显示那个小点而已

循环中,不断的依次点亮四个数字和一个小数点,人眼是分不出来的,就可以达到效果了

另外,你需要一个LED闪烁,代表秒的显示,可以利用定时器来完成

观察你的程序,实在是不敢恭维,尤其是数码管的显示部分太乱了

程序中好像还没有自动加时的部分,并且按键处理还没有消抖措施

不多说了,上程序,俺刚刚为你编写的,测试的时候使用的端口和你的不一样

在我的开发板上测试成功后,按照你的板子端口做了修改

如果你直接复制到你的程序中不能使用,检查及更改一下端口即可

如果满意记得采纳哦,若有疑问可以随时向我提问

/***************************************************************************/
//#include
#include
sbit p20=P2^0; sbit p21=P2^1; sbit led=P2^7;
char dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void delay(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}
/***************************************************************************/
void XS(unsigned int xh,unsigned int xs) //显示子函数
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xh/1)%10; d4=(xh/10)%10;

P0=dis_2[d1]; P1=0x08; delay(10); P1=0x00;//秒个位
P0=dis_2[d2]; P1=0x04; delay(10); P1=0x00;//秒十位
P0=0x7f; P1=0x04; delay(10); P1=0x00;//小数点
P0=dis_2[d3]; P1=0x02; delay(10); P1=0x00;//时个位
P0=dis_2[d4]; P1=0x01; delay(10); P1=0x00;//时十位
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
if(p20==0){delay(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){delay(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//调用数码管显示函数
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED闪烁
if(n>1000){n=0;s++;}//如果达到一秒,秒加一
if(s>59){s=0;m++;}//如果达到一分,分加一
if(m>59){m=0;h++;}//如果达到一小时,小时加一
if(h>23){h=0;}//如果达到24小时,小时清零
}
/***************************************************************************/

太简单了吧 605508331

试试下列修改:
void timer0() interrupt 1
{
TH0 = (65536 - 250) / 256;
TL0 = (65536 - 250) % 256;
tcnt++;
mstcnt++;
if(tcnt == 8) { //2毫秒定时,2毫秒刷新一次数码管.
tcnt = 0;
P0 = duanxuan[weitable[jishu]];
P2 = xunhuan[jishu];
jishu++;
if(jishu == 6) jishu = 0;
}
if(mstcnt == 40000) { //1s时.
mstcnt = 0;
second++; //秒加1
if(second == 60) {
second = 0; //秒清零.
minite++; //分加1
if(minite == 60) {
minite = 0;
hour++;
if(hour == 24) hour = 0;
}
}
weitable[0] = second % 10;
weitable[1] = second / 10;
weitable[2] = minite % 10;
weitable[3] = minite / 10;
weitable[4] = hour % 10;
weitable[5] = hour / 10;
}
}
//===============
你关键性的错误在于下一条:
if(mstcnt==40000);//1s时
注意到了吗?末尾,多了一个分号。

应该是你的timer0太快,看看是不是时钟太快了,根据你设置的timer0的值来看,如果你的晶振得设置为10MHz,你再试试

延时不够。要详细计算一下晶振到最后执行的之间之间的关系。不过多试试延时函数也可以凑出来。只是比较慢。(其实也不慢,总比找手册然后计算时间要来的实际一些。)

时钟频率太高了吧


关于单片机的问题
如果你对信号部分比较感兴趣的话,还可以装一个 mutism仿真软件。mutism主要应用于数电模电的仿真,而proteus主要用于单片机的仿真,而且不占用多少内存空间。3、书籍的话,建议你到电驴资源区里去寻找,里面有很多十分有用的电子资料和视频资料。4、如果你愿意下功夫,半个月你就可以入门。建议你入门的时候...

怎样做一个自己的单片机开发板?
如图所示,5个图,首先建立2个变量,如图1所示,然后放上三个按钮,分别为正转按钮,停止按钮,反转按钮,和两个指示灯,正转指示灯和反转指示灯。然后设置正转按钮的操作属性是正转置一,如图2,可见度属性是反转不可见,如图4。然后设置停止按钮的脚本,如图3,最后设置反转按钮的操作属性为反转置一...

单片机问题。 设fosc=11.0592MHz,串行口接方式1工作,T1工作在模式2,试...
串行口接方式1工作,T1工作在模式2时的波特率计算公式如下:SMOD=0时,波特率=11059200\/(32*12*(256-x))=28800\/(256-X)把X最小值0代入得最低波特率为112.5bps 把X最大值255代入得最高波特率为28800bps 所以SMOD=0时,波特率范围在112.5bps~28800bps SMOD=1时,波特率=2*11059200\/(32*12*...

单片机问题
1. 'p1': undefined identifier p1 未定义 在使用P1口时keilc51中需要将 p大写 也可以 利用位定义来定义一个管教 如:sbit p1_1=P1^1;2. error C202: 'OX01': undefined identifier Ox01 这是16进制数 以0x开头表示十六进制 是零x不是 噢x 3.'ETO': undefined identifier 与2为同类...

单片机 编程 相关问题 我的单片机是STC89C51RC 商业级,最高40M运算速...
比如可以用1根线接到发光二极管,然后通过控制该线的高低电平达到点亮,熄灭发光管的目的。其中P3口有双重功能,比如上一问中的串口就是使用了P3口中的两根线实现的。楼主提得问题确实太基础了,但并不奇怪,隔行如隔山嘛,真要了解确实需要从头学习C语言和单片机。写这么多,希望有所帮助。

单片机问题,求教高手下面一段程序原理,希望能逐句给出解释,非常感谢
include<reg51.h>\/\/头文件 include<intrins.h> define uint unsigned int define uchar unsigned char void DelayMS(uint ms)\/\/延时函数 { uchar t;while(ms--)for(t=0;t<120;t++);} void main(void)\/\/主函数 { uchar i;P1=0xfe;\/\/将P1口的八个管脚拉电平11111110,即P1.0为低,...

单片机程序问题:用1个按键去控制1个灯,此键每快速地按2下,灯的亮与...
假如你使用的是P30这个引脚接按键,P31接灯控制。sbit ctr = P3^0;sbit Lamp = P3^1;void main(){ char i=0;bit flag = 0;while(1){ if(ctr==0) \/\/表示第一次按下键了 { for(i=0;i<30;i++){ delayS(10); \/\/延迟10mS if(ctr==1 || flag ==1) \/\/表示键在0....

学习单片机的有关问题
最后我呢再给大家推荐两款我自己专门给单片机的初学者设计的单片机学习板,大家可以看看它的资料,需要说明一下,如果使用我的单片机学习板,我可以负责终生的技术支持,直到教会你为止。支持的方式你可以通过QQ,EMIL等随时问我关于单片机开发及电路设计方面的问题。个人网站:www.txmcu.com附本文作者简介:郭天祥,男,哈尔滨...

我自己焊了个单片机,晶振有问题,按一下复位,示波器上有正常的波形,但过...
2、你焊完了板子,晶振不起振,按一下复位键,晶振端口有正确的波形输出,过一会儿又不起振了。如果是第一种情况,建议你换个其他的程序,比如IO点亮LED之类的试试看是程序的问题还是硬件的问题。如果是第二种,那有可能你的焊接出问题了,比如用错了元件或者元件是坏的,或者虚焊,不该接的地方接...

自己写的单片机实验汇编程序,问题:灯不亮! 麻烦指出错误,最好改一下...
MAIN: MOV P1,#07FH MOV P3,#0EFH;错误,应将P3.4置高。注意51的IO口是准双向口,内部只有弱上拉,和强下拉,置低后外部不能将它拉高。INT01: PUSH PSW PUSH ACC ALARM: MOV P1,#0FFH RING: MOV R2,#50 CPL P1.7;取反 SETB P1.7;这句多余了,DJNZ R2,RING JNB P3.3,...

青河县15522137084: 51单片机编程制作电子钟时间问题.后两位数码管显示到59后,直接跳到变为只有第一位数码管显示0.感觉整个人都不好了,下面是代码::#include "reg52.... -
钮飘复方:[答案] uchar sec=0,min=0,tnum;把它放到主函数里面看看,并且tnum=0

青河县15522137084: 单片机电子钟程序 -
钮飘复方: 51单片机在数码管上显示的数字钟程序:#include "at89x51.h" unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0...

青河县15522137084: 怎么用51单片机做一个时钟 -
钮飘复方: 一片单片机+一个LED数码模块或LCD液晶模块+一段简单的程序=一个简单的时钟. 一片单片机+一片DS1302或其他的时基芯片+一个LED数码模块或LCD液晶模块+一段简单的程序=一个实用的时钟. 系统构成确定了以后,程序就有现成的了,可以移步到百度网页“百度一下”里搜索,资源多如牛毛.

青河县15522137084: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. -
钮飘复方: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.

青河县15522137084: 基于51单片机的数码管设计电子时钟,可以调时间的,怎么弄唉,大家帮帮忙... -
钮飘复方: 说一下步骤吧:1、数码管驱动电路设计.一般用三极管如9013或者锁存器如74HC573来驱动,使其能够正常亮灭.2、使用动态扫描的方式让数码管能够显示你想要的数字,这个可以用中断来扫描也可以不用.3、使用实时时钟芯片如DS1302...

青河县15522137084: 51单片机制作简易电子钟,求电路图和程序,要求6位显示,24小时制 -
钮飘复方:#include "reg51.h" #define uint unsigned int #define uchar unsigned char unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar sec,min,hour; bit secup=00; uchar n=0; void delay(unsigned int ms) { unsigned int i=...

青河县15522137084: 51单片机驱动八位数码管电子钟 -
钮飘复方: #include<reg52.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int#define DP 0x80 uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八位位选码表 //0 1 2 3 4 5 6 7 uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0...

青河县15522137084: 51单片机设计一个电子钟,如何实现闹钟功能? -
钮飘复方: 简单啊,你肯定是用定时中断来做实时时钟的吧,每次中断计数到了秒之后,判断一下当前的时间是否等于闹钟时间,相等的话就驱动蜂鸣器响一定时间就可以了,不相等的话什么都不做

青河县15522137084: 电子钟的设计(带按键调整) 任务要求:利用AT89C51单片机设计简易电子钟(六位),通过6位共阴 -
钮飘复方: #include#define uchar unsigned char...要是PROTEUS的话差不多是这样,要是不想麻烦搞个74595的话P1就直接连(有没有都一样有的话比较整洁,没有的话程序上省点脑筋)主按键就用INT0,我没用P0口是因为懒得加上拉电阻,高低电平暂时先设成低的,思路就是P2口片选,当INT0触发时,你可以用while循环兜住不让出去,第一次是片选前两位“时”,第二次分第三次秒,如果第四次按下P32,也就是进入中断后第三次按下按键,结束中断,调到main.思路应该是这样当然肯定漏洞很多,先吃个饭再看看.

青河县15522137084: 51单片机做电子时钟,为什么会比实际时间慢呢? -
钮飘复方: 这个问题是这样的,这可能是因为你的单片机晶振的原因,如果是12MHz的话,中断值设置为3CB0,意味着50ms中断一次,if(t50mscnt==20)就可以实现1s的变化,前提是外部晶振频率为12MHz,你检查看看你的晶振频率为多少吧!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网