用51单片机编写数字钟出问题了,求高手解答

由于有点长,放在了空间里,求大声移步http://hi.baidu.com/bfkflcsfrobjnyd/item/373e4dd2142ee570d63aaebd现在想让秒针每秒+1,没有实现,停在了01不动,不知道是为什么

你在程序里的"shi""fen""miao"寄存器是按全局变量用的,所以在display()子程序中不要在设置形参了,直接修改这三个寄存器就好了。

另外注意定义变量时候的类型uchar和char

...

//void display(char shi,char fen,char miao)
void display()

...

//display(shi,fen,miao);
display();

...

附件里有改的程序,试了一下24MHz晶振下时间跑得有些快!


我又改了改程序,附加了Proteus仿真电路,新程序在clock_.c中。

/* 因为用的仿真电路不一样,所以rs和en引脚改P2口了 */
/* 1602有个rw读写使能端,加了个引脚控制 */
/* 我不知道这dula和wela两个引脚的作用,所以临时换到P3口了 */
/* 在write_cmd和write_date的时序中加了rw读写使能 */
/* data是数据的意思 date是日期的意思 */
/* 把时分秒的显示都挪到最后了,前面的if条件语句只做时分秒数据的修改,这样能保证数据变0时显示正常 */
/* 把初始化往后挪了,方便调用其他子程序 */
/* 每条write_cmd或write_data的最后都已将en=0,所以不用在其他位置设置en=0了 */
/* 初始化子程序的最后加了一条display指令,用来将显示刷新成既定时刻 */
/* 主程序中设置了时钟时间初始值,以观察时间能否正常变化 */

#include <reg52.h>
#define uint unsigned int 
#define uchar unsigned char
uchar code table[]="   2013-11-10";
uchar code table1[]="    00:00:00";
/* 因为用的仿真电路不一样,所以rs和en引脚改P2口了 */
//sbit rs=P3^5;
//sbit en=P3^4;
sbit rs=P2^5;
sbit en=P2^6;
/* 1602有个rw读写使能端,加了个引脚控制 */
sbit rw=P2^7;
/* 我不知道这两个引脚的作用,所以临时换到P3口了 */
sbit dula=P3^6;
sbit wela=P3^7;
uchar num,i,temp,shi,fen,miao;
//延时
void delay()
{
 uchar i,j;
 for(i=10;i>0;i--)
 for(j=110;j>0;j--);
}
//程序写指令
void write_cmd(uchar cmd)
{
 rs=0;
 /* 加了rw读写使能 */
 rw=0;
 en=0;
 P0=cmd;
 en=1;
 delay();
 en=0;
}
//数据写指令
void write_date(uchar date)/* data是数据的意思 date是日期的意思 */
{
 rs=1;
 /* 加了rw读写使能 */
 rw=0;
 en=0;
 P0=date;
 en=1;
 delay();
 en=0;
}
//时/分/秒按十进制显示
void sfm(char add,char dat)
{
 char shi,ge;
 shi=dat/10;
 ge=dat%10;
 write_cmd(0x80+0x40+add);
 write_date(0x30+shi);
 write_date(0x30+ge);
}
//显示
//void display(char shi,char fen,char miao)
void display()
{
 if(temp==20)
 {
  temp=0;
  miao++;
  //sfm(10,miao);
  if(miao==60)
  {
   miao=0;
   fen++;
   //sfm(7,fen);
   if(fen==60)
   {
    fen=0;
    shi++;
    //sfm(4,shi);
    if(shi==24)
    {
     shi=0;
    }
   }
  }
 }
 /* 把时分秒的显示都挪到最后了,前面的if条件语句只做时分秒数据的修改,这样能保证数据变0时显示正常 */
 sfm(10,miao);
 sfm(7,fen);/* 显示的相对位置改了一下 */
 sfm(4,shi);/* 显示的相对位置改了一下 */
}
//定时器0中断
void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 temp++;
}
//初始化
/* 把初始化往后挪了,方便调用其他子程序 */
void init()
{
 dula=0;
 wela=0;
 write_cmd(0x38);
 write_cmd(0x06);
 write_cmd(0x0c);
 write_cmd(0x01);
 //en=0;/* 每条write_cmd或write_data的最后都已将en=0,所以在此不用在设置en=0了 */
 TMOD=0X01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;
 write_cmd(0x80);
 for(num=0;num<13;num++)
 {
  write_date(table[num]);
  delay();
 }
 write_cmd(0x80+0x40);
 for(num=0;num<12;num++)
 {
  write_date(table1[num]);
  delay();
 }
 /* 最后加了一条display指令,用来将显示刷新成既定时刻 */
 display();
}
//主函数
void main()
{
 /* 主程序中设置了时钟时间初始值,以观察时间能否正常变化 */
 shi=23;
 fen=59;
 miao=55;
 init();
 while(1)
 {
  //display(shi,fen,miao);
  display();
 }
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-18

您定义了全局变量shi,fen,miao, display函数定义 中的参数也是shi,fen,miao,计时动作是在display中做的,对函数内部的 shi,fen,miao的操作不会改变全局的shi,fen,miao,

下次用display(shi,fen,miao);调用display时,从未被改变过的全局变量的值又赋给display内部的局部变量,所以就没法计时了。

一种笨修改方法是去掉 display 的参数,定义那行改为

void display()// (char shi,char fen,char miao)

调用改为

void display()// (char shi,char fen,char miao)

这样就工作正常了,仿真效果如下:

本回答被网友采纳
第2个回答  2013-11-18
大致看了下,貌似你的1秒中断没有进去啊。。。。好久没整了 你可以单步调试看下,。哪个环节出问题了

用51单片机编写数字钟出问题了,求高手解答
\/\/void display(char shi,char fen,char miao)void display()...\/\/display(shi,fen,miao);display();...附件里有改的程序,试了一下24MHz晶振下时间跑得有些快!我又改了改程序,附加了Proteus仿真电路,新程序在clock_.c中。\/* 因为用的仿真电路不一样,所以rs和en引脚改P2口了 *\/\/* 1...

51单片机单数字钟代码0×df啥意思
0xdf 是单片机C语言编程中的16进制, d 代表的是高四位, f 代表的是低四位,总共控制八个字节位,可以控制任意一个p口的输出。 从你的问题来看,这个应该是共阴时钟数码管选择位选的。 希望能帮到你!

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开...
利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。  我来答 5个回答 #活动# 参与造句大挑战,答题瓜分万元豪礼 zlzskddj2602 推荐于2017-09-27 知道答主 回答量:19 采纳率:0% 帮助的人:0 我也去答题访问个人页 关注 展开全部 没有定时器的不过有数字钟的...

51单片机八位数码管,
不知你问题在哪?以上是电路图参考,下面是仿真运行效果,显示时间为23:59分31秒 星期六 以上设计是没有采用时钟芯片的,时间来源才用的是单片机定时自动重载的方式计算实现。如果加上时钟芯片的话,可以实现断电继续走时,现在常用的方案就是这样。关于单片机程序方面,难者不会,会者不难,在此寥寥几...

用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设...
unsigned char z,s=00,m=00,h=00;给时钟初始值 while(1){ for(z=0;z<100;z++){ tmp=0x01;P2=tab[h\/10];小时显示 disp();P2=tab[h%10];disp();P2=tab[m\/10];分钟显示 disp();P2=tab[m%10];disp();P2=tab[s\/10];秒显示 disp();P2=tab[s%10];disp();} s++;while...

单片机问题,求高手详解!
1、答案:00H,LCALL调用把地址0221H放到堆栈中,先低后高,所以08H是00H,PC也会变化,这里就不说了 2、十进制变成二进制不能一位对应四位,那个是十六进制变成2进制的方法。。。

单片机程序分析题求高手解答。。。
MOV A,#60H ;立即数寻址,所以(A)=60H MOV R0;#40H ;(R0)=40H MOV @R0,A ;间接寻址,将寄存器A存的值存入寄存器R0所指地址40H中,(40H)=60H MOV 41H,R0 ;直接寻址,将R0的值存入41H单元,(41H)=40H

51单片机数字钟制作里面的74LS380N多功能八进制寄存器可以用什么替 ...
单片机内部的RAM足够用了,真不理解你的数字钟怎么会用到74LS380,不可思议。假如,是用纯数字电路制作电子钟,还有情可缘。74LS380的引脚图如下,DIP24封装。如果非要用外部寄存器,可以用8位数据锁存器,就有很多可选择了,常用的有,74LS373,74LS374,74LS377,74LS573,等等很多。

求高手解答单片机
18个不对,mov c,20h是位寻址。另一个是直接寻址。19不对,用来锁存p0口的低八位地址。20理论上如此,但每个单片机肯定会有时钟的上限。21对 22不对,一个指令周期可以包含数个机器周期 23对的 24不对scon只是串口中断的控制寄存器。25不对,SP始终指向栈顶。26不对 都是64K 27不对,是一条...

求高手解答单片机问题。
22、用MCS-51串行口扩展并行I\/O口时,串行口工作方式应选择( 0 )。25、假定(SP)=40H,(39H)=30H,(40H)=60H。执行下列指令:--题目有错,39H、40H,不是连续的单元,不能当做本题目的已知条件。POP DPH ,POP DPL后,DPTR的内容为( ),SP的内容是( )。26、单片机的堆栈...

相似回答
大家正在搜