找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2132|回复: 5
打印 上一主题 下一主题
收起左侧

为什么在的都实验板运行正常,Proteus仿真异常?

[复制链接]
跳转到指定楼层
楼主
菜鸟遇到问题了,同一段代码写进实验板运行正常,仿真时数码管却不能正常显示。

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char //宏定义。
  3. #define uint unsigned int
  4. sbit dula=P2^6; //声明锁存器的锁存端。
  5. sbit wela=P2^7; //声明锁存器的锁存端。
  6. sbit beep=P2^3;
  7. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  8. uchar num,num2,shi,ge;
  9. uint num1;
  10. void delay(uint xms) //有参延迟函数。
  11. {
  12.   uint i,j;
  13.   for(i=xms; i>0; i--)
  14.     for(j=110; j>0; j--); }


  15. void display(uchar shi,uchar ge) //数码管显示函数。
  16. {
  17.   dula=1;
  18.   P0=table[shi]; //送段选数据。
  19.   dula=0;
  20.   P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时,原来的段选数据通过位选锁存器造成混乱。
  21.   wela=1;
  22.   P0=0xfe; //送位选数据(十位);
  23.   wela=0;
  24.   delay(5);


  25.   dula=1;
  26.   P0=table[ge];
  27.   dula=0;
  28.   P0=0xff;
  29.   wela=1;
  30.   P0=0xfd;
  31.   wela=0;
  32.   delay(5);
  33. }


  34. void zh0() interrupt 1  //定时器T0仅为响声而设。如果取消,得连同它的开关一并取消。
  35. { TH0=0x4c;  //重装初值。
  36.   TL0=0xd0;
  37.   num1++;
  38.   if(num1>=1200) //1200×50ms=60000ms/1000=60s。原文是num1==4,后面控制LED亮灭。
  39.   {  num1=0;   
  40.      beep=0;  //我改成了每分钟一响。
  41.      delay(23); //短促一响
  42.      beep=1;
  43. }}


  44. void zh1()interrupt 3
  45. {
  46.   TH1=0x4c;
  47.   TL1=0xd0;
  48.   num2++;
  49.   if(num2==20)//如果计数到20,说明1秒时间到(20次×50ms=1000ms=1s)。
  50.   {
  51.     num2=0; //把num2清零,计数到20次再进本程序段。
  52.     num++;
  53.     if(num>=60) //到59秒再加1秒时,不显示60而显示0。
  54.       num=0;
  55.     shi=num/10; //把一个2位数分解后分别送数码管显示。
  56.     ge=num%10;
  57. }}


  58. void main()
  59. {
  60.   TMOD=0x11;
  61.   TH0=0x4c;
  62.   TL0=0xd0;
  63.   TH1=0x4c;
  64.   TL1=0xd0;
  65.   EA=1;   //开总中断。
  66.   ET0=1;  //开定时器0中断。
  67.   ET1=1;  //开定时器1中断。
  68.   TR0=1;  //启动定时器0中断。
  69.   TR1=1;  //启动定时器1中断。
  70.   while(1)
  71.     display(shi,ge);
  72. }  //每分钟慢约250ms。
复制代码


GTX-1C.rar (25.05 KB, 下载次数: 3) 压缩包里有Proteus仿真文件。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2021-9-25 21:56 | 只看该作者
这是郭天祥挖的一个坑,好多人都掉进去了。其实在实验板上运行也不算正常,只是不易察觉。这段代码根本起不到消除鬼影的作用,使用仿真时就乱套了。
  1. void display(uchar shi,uchar ge) //数码管显示函数。
  2. {
  3.   P0=0x00;        //消隐
  4.   dula=1;        //锁存
  5.   dula=0;

  6.   P0=0xfe;        //送位选数据(十位);
  7.   wela=1;        //锁存
  8.   wela=0;

  9.   P0=table[shi];//送段选数据。
  10.   dula=1;        //锁存
  11.   dula=0;
  12.   delay(5);

  13.   P0=0x00;
  14.   dula=1;
  15.   dula=0;

  16.   P0=0xfd;
  17.   wela=1;
  18.   wela=0;

  19.   P0=table[ge];
  20.   dula=1;
  21.   dula=0;
  22.   delay(5);
  23. }
复制代码

评分

参与人数 1黑币 +15 收起 理由
一片一城 + 15 很给力!

查看全部评分

回复

使用道具 举报

板凳
ID:678280 发表于 2021-9-26 10:57 | 只看该作者
wulin 发表于 2021-9-25 21:56
这是郭天祥挖的一个坑,好多人都掉进去了。其实在实验板上运行也不算正常,只是不易察觉。这段代码根本起不 ...

谢谢wulin老师,这是我第三次得到你的帮助了。

要说有坑,学到中断这部分已经遇到两个了。

不过我猜想这个错误是郭老师的助手弄出来的,而非郭老师本人所为。可惜一点的是,买了实验板快一年了没有看到哪里出现过“更正”之类的消息。
回复

使用道具 举报

地板
ID:57657 发表于 2021-9-26 11:13 | 只看该作者
TR0、TR1是启动定时器0、1计时,而不是中断。
仿真的数码管 只要频率快了就无法正常显示。
回复

使用道具 举报

5#
ID:968316 发表于 2021-9-26 11:45 来自手机 | 只看该作者
楼上说的,是有可能频率过快的,不过目前我只用仿真
回复

使用道具 举报

6#
ID:678280 发表于 2021-9-26 15:59 | 只看该作者
本帖最后由 一片一城 于 2021-9-26 16:34 编辑
npn 发表于 2021-9-26 11:13
TR0、TR1是启动定时器0、1计时,而不是中断。
仿真的数码管 只要频率快了就无法正常显示。

  P0=table[shi];//送段选数据。
  dula=1;        //锁存
  dula=0;
  delay(5);

npn老师,你是说这个延时时间太短了?
刚才试过,把delay(5),延长到40(约延时40ms),笔划闪动着显示全了,但很难找到平衡点,就是很难使数码管稳定地显示。

上午我试过wulin老师的代码,未改动延时,效果非常好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表