打印

51单片机C编程问题

[复制链接]
1779|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
komad|  楼主 | 2010-3-5 20:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如用8位数码管显示一个闹钟
程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar shi=12,fen=12,miao=12,t;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uint x)
{
uchar a,b;
for(a=x;a>0;a--)
  for(b=110;b>0;b--);
}
void disp()
{
P0=table[miao%10];
P2=tablewei[0];
delay(10);
P0=table[miao/10];
P2=tablewei[1];
delay(10);
P0=0xbf;
P2=tablewei[2];
delay(10);
P0=table[fen%10];
P2=tablewei[3];
delay(10);
P0=table[fen/10];
P2=tablewei[4];
delay(10);
P0=0xbf;
P2=tablewei[5];
delay(10);
P0=table[shi%10];
P2=tablewei[6];
delay(10);
P0=table[shi/10];
P2=tablewei[7];
delay(10);
}
void init()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void main()
{
init();
while(1)
{
  if(t==20)
  {
   t=0;
   miao++;
   if(miao==60)
   {
    miao=0;
    fen++;
    {
     if(fen==60)
     {
      fen=0;
      shi++;
      {
       if(shi==60)
       shi=0;
      
      }
     }
    }
   }
  }
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
void timer1() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
disp();
}
此时显示正常,初始为12(时)—12(分)—12(秒),后面的秒是一秒加一次


但如果把main()函数while()里的内容,重新写成一个函数时,程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar shi=12,fen=12,miao=12,t;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uint x)
{
uchar a,b;
for(a=x;a>0;a--)
  for(b=110;b>0;b--);
}
void disp()
{
P0=table[miao%10];
P2=tablewei[0];
delay(10);
P0=table[miao/10];
P2=tablewei[1];
delay(10);
P0=0xbf;
P2=tablewei[2];
delay(10);
P0=table[fen%10];
P2=tablewei[3];
delay(10);
P0=table[fen/10];
P2=tablewei[4];
delay(10);
P0=0xbf;
P2=tablewei[5];
delay(10);
P0=table[shi%10];
P2=tablewei[6];
delay(10);
P0=table[shi/10];
P2=tablewei[7];
delay(10);
}
void init()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void sfm()//把main()函数里的while()写成这个函数
{
if(t==20)
  {
   t=0;
   miao++;
   if(miao==60)
   {
    miao=0;
    fen++;
    {
     if(fen==60)
     {
      fen=0;
      shi++;
      {
       if(shi==60)
       shi=0;
      
      }
     }
    }
   }
  }
}
void main()
{
init();
while(1)
{
  sfm();//这样写应该和上面的程序一模一的?
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
void timer1() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
disp();
}
问题就出现了,后面的秒只加到14就不动了??
请高手帮我解答下,谢谢

相关帖子

沙发
zsuqing| | 2010-3-6 12:27 | 只看该作者
时间轴问题 你把延时参数调小些 试试看

使用特权

评论回复
板凳
zsuqing| | 2010-3-6 12:40 | 只看该作者
另外 if(shi==60)
       shi=0;
改为if(shi==24) 每天就24小时的 呵呵

使用特权

评论回复
地板
komad|  楼主 | 2010-3-6 21:15 | 只看该作者
呵呵,是24小时,见笑了:D
能具体说下时间轴吗?
但程序里的用了函数,应该说是一模一样的,这和时间轴有什么关系呢?:dizzy:

使用特权

评论回复
5
komad|  楼主 | 2010-3-6 21:16 | 只看该作者
只是while()里面的用函数sfm()代替而已,怎么就会发生这样的问题,郁闷。。。

使用特权

评论回复
6
zsuqing| | 2010-3-6 21:47 | 只看该作者
你现在的问题反映的是时间轴坐标重叠现象,调一下延时参数可以避开两次中断覆盖的影响,实际应用中你还要有键盘闹钟等设备函数的,你的中断时间是10ms 在中断中不要处理大于10ms的程序,你的显示函数处理时间远大于且2次延时正好是20ms,C语言的中断保护现场做的不是很完美的。在中断程序中添加标志,然后依据标志在主函数循环中调用显示函数。
我的一家之言,有不妥的请拍砖。

使用特权

评论回复
7
komad|  楼主 | 2010-3-7 08:43 | 只看该作者
谢谢楼上的细心帮助。
今天重新调的时候竟然又正常了。
不过有些书上说C程序的效率问题,调用函数的话效率又低点,可能是这个造成的。

使用特权

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

本版积分规则

16

主题

118

帖子

0

粉丝