打印

老手帮我看下电路及程序

[复制链接]
1393|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
八个数码管 显示 时分秒  还剩两个数码管 用作时分 分秒的分隔,我用PN4122三极管控制位选,电路图见附件    程序见下 ,可是用proteus仿真时 却不正确,数码管都是一闪一闪,而且也不是递加

#include <reg51.h>   //头文件
unsigned char pore[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选数组
unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选数组
unsigned char n,m;
unsigned char htime; //定义时变量
unsigned char mtime; //定义分变量
unsigned char stime; //定义秒变量
void yshi(void) //延时函数(动态显示)
{
unsigned char i;
for(i=0;i<200;i++);
}
void ds(unsigned char s)//秒位控制计算
{
P2=0xbf;
P0=Tab[s/10];
yshi();
P2=0x7f;
P0=Tab[s%10];
yshi();
P2=0xff;
}
void dm(unsigned char m)//分位控制计算
{
P2=0xf7;
P0=Tab[m/10];
yshi();
P2=0xef;
P0=Tab[m%10];
yshi();
/*P2=0xdf;
P0=0xbf;
yshi();*/
P2=0xff;
}
void dh(unsigned char h)//时位控制计算
{
P2=0xfe;
P0=Tab[h/10];
yshi();
P2=0xed;
P0=Tab[h%10];
yshi();
/*P2=0xfb;
P0=0xbf;
yshi();*/
P2=0xff;
}
void main(void)
{
TMOD=0x01; //定时器工作方式选择  
EA=1;  //开总中断
ET0=1;  //开T0中断
TH0=(65536-46083)/256;    //赋初值
TL0=(65536-46083)%256;
TR0=1; //开始计时
htime=0;
mtime=0;
stime=0;
while(1)
         {
  ds(stime);
  yshi();
  dm(mtime);
  yshi();
  dh(htime);
  yshi();
  }
}
void Time(void) interrupt 1 using 1
{
n++;
if(n==20)
{
  n=0;
  stime++;
  }
  if(stime==60)
  {
   stime=0;
   mtime++;
  }
  if(mtime==60)
  {
   mtime=0;
   htime++;
  }
  if(htime==24)
  {
   htime=0;
  }
TH0=(65536-46083)/256;    //赋初值
TL0=(65536-46083)%256;
}

相关帖子

沙发
ayb_ice| | 2011-11-24 15:07 | 只看该作者
仿真电路可以直接用IO驱动LED,效果更好,实际电路加上三极管就可以了
粗略看了一下程序,ds()里有延时,ds()后又有延时,应该有问题
LED显示最好用定时中断来驱动,每次中断显示一位,循环处理,效率也高,主循环一次将待要显示全部数据更新,
没有更新时,显示原来的数据
只有这样才能保证稳定,后面添加的程序也不会影响显示,
你这样的程序,如果主循环有某个任务占用了较长的CPU时间,显示不稳定的
他这个仿真LED显示的刷新率不高,不是很准确,可能仿真没有问题,但实际问题大,但如果仿真有问题,实际一定有问题

使用特权

评论回复
板凳
NE5532| | 2011-11-24 16:31 | 只看该作者
画流程图,别偷懒~!

使用特权

评论回复
地板
yuyi21ic| | 2011-11-24 17:18 | 只看该作者
proteus仿真数码管的动态显示有点bug。

使用特权

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

本版积分规则

14

主题

208

帖子

1

粉丝