搜索
bottom↓
回复: 20

(结贴,仿真BUG)请教:用定时器作的动态数码管扫描总是.

[复制链接]

出0入0汤圆

发表于 2012-5-29 23:15:02 | 显示全部楼层 |阅读模式
本帖最后由 renwocai 于 2012-5-30 11:33 编辑

比如4位共阳数码管,我希望它显示0123,结果只显示012,段码接P0口,位码接P2.0到P2.3.
程序如下:
  1. #include <at89x52.h>
  2. #define uchar unsigned char
  3. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. uchar i=0;
  5. sbit h4=P2^3;        //共阳,低电平有效
  6. sbit h3=P2^2;
  7. sbit h2=P2^1;
  8. sbit h1=P2^0;

  9. void timer0()interrupt 1
  10. {
  11.         TH0=(65536-10000)/256;
  12.         TL0=(65536-10000)%256;
  13.         switch(i)
  14.         {
  15.                 case 0:
  16.                 {
  17.                         h1=1;h2=0;h3=0;h4=0;P0=tab[0];
  18.                 };break;
  19.                 case 1:
  20.                 {
  21.                         h1=0;h2=1;h3=0;h4=0;P0=tab[1];
  22.                 };break;               
  23.                 case 2:
  24.                 {
  25.                         h1=0;h2=0;h3=1;h4=0;P0=tab[2];
  26.                 };break;               
  27.                 case 3:
  28.                 {
  29.                         h1=0;h2=0;h3=0;h4=1;P0=tab[3];
  30.                 };break;
  31.         }
  32.         i++;
  33.         if(i==4)
  34.         i=0;
  35. }
  36. main()
  37. {
  38.         TMOD=0X01;
  39.         EA=1;
  40.         ET0=1;
  41.         TH0=(65536-50000)/256;
  42.         TL0=(65536-50000)%256;
  43.         TR0=1;
  44.         while(1);
  45. }
复制代码
结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-29 23:23:55 | 显示全部楼层
硬件或者接线有问题~~~~~~~~

出0入0汤圆

 楼主| 发表于 2012-5-29 23:30:31 | 显示全部楼层
接线就是仿真图片上的。

出0入0汤圆

发表于 2012-5-29 23:31:25 | 显示全部楼层
楼上我都服了你。

仿真上运行你还说"硬件或者接线有问题" ?

出0入0汤圆

 楼主| 发表于 2012-5-29 23:34:40 | 显示全部楼层
肯定是程序问题,但我想不出来程序哪儿有问题了。

提示,如果我在仿真中把晶振调到0.12MHZ,则可看到每一位轮流点亮,包括最后一位的3

出0入0汤圆

发表于 2012-5-29 23:36:55 | 显示全部楼层
解决没有?

出0入0汤圆

 楼主| 发表于 2012-5-29 23:38:10 | 显示全部楼层
没有。应该是最后一位点亮时间过短。但不知道为什么

出0入0汤圆

发表于 2012-5-30 00:15:24 | 显示全部楼层
把case0~3依次换成case 1~4,然后自己想想为什么

出0入0汤圆

发表于 2012-5-30 00:27:19 | 显示全部楼层
renwocai 发表于 2012-5-29 23:38
没有。应该是最后一位点亮时间过短。但不知道为什么

这个问题有多种方法可以解决,除了上面说明的外,还可以直接把if(i==4) i=0;放到switch前面,switch里面不用修改

出0入0汤圆

发表于 2012-5-30 01:00:40 | 显示全部楼层
check out the waveform on the pins. animation in proteus is subject to many limitations.

出0入0汤圆

发表于 2012-5-30 01:03:45 | 显示全部楼层
主要还是i++和i==4的问题。

出0入134汤圆

发表于 2012-5-30 01:09:35 | 显示全部楼层
#include <at89x52.h>
#define uchar unsigned char

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar i=0;

void
timer0() interrupt 1
{

    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
   
    P2 = 0x01 << i;
    P0 = tab[i];
    if
(++i >= 4)
        i = 0;
}


void
main(void)
{

    TMOD = 0x01;
    EA   = 1;
    ET0  = 1;
    TH0  = (65536-10000)/256;
    TL0  = (65536-10000)%256;
    TR0  = 1;

    while
(1) ;
}


出0入0汤圆

发表于 2012-5-30 07:16:51 | 显示全部楼层
here is the waveform on the various pins.

As you can see, h4 did go high and the desired value (0xb0) is written on P0 when h4 went high.

what you observed is proteus' animation anomaly.

the lesson learned here is that simulation is only useful if you understand its limitations.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-5-30 07:46:28 | 显示全部楼层
little_Monkey 发表于 2012-5-30 00:27
这个问题有多种方法可以解决,除了上面说明的外,还可以直接把if(i==4) i=0;放到switch前面,switch里面 ...

这样改了之后是这个结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-5-30 07:49:03 | 显示全部楼层
elecfun 发表于 2012-5-30 01:09
#include
#define uchar unsigned char

这样写的确没有问题,我之前写八位的就是这么写的,但是如果四位直接这么写的话会影响到没有用到的其它P2口。而且,在逻辑上我的程序应该和这个是一样的啊

出0入0汤圆

 楼主| 发表于 2012-5-30 07:56:07 | 显示全部楼层
millwood0 发表于 2012-5-30 07:16
here is the waveform on the various pins.

As you can see, h4 did go high and the desired value (0xb ...

实物和仿真看到的效果是一样的。

出0入0汤圆

发表于 2012-5-30 08:31:38 | 显示全部楼层
实物和仿真看到的效果是一样的。


that tells you a lot, doesn't it?

出0入0汤圆

发表于 2012-5-30 10:58:39 | 显示全部楼层
本帖最后由 xiaobendan001 于 2012-5-30 11:00 编辑

程序好像没有问题啊,不过俺习惯CASE后面不用{}的。
刚用KEIL模拟了一下,很好啊,i=0放哪儿都可以了。

出0入0汤圆

 楼主| 发表于 2012-5-30 11:32:27 | 显示全部楼层
问题找到,正如millwood0所说,确定为仿真软件的BUG.现将程序和仿真打包上传。
事先我的实物因为接触不良,正好也是最后一位不亮,使我对这个程序产生了怀疑。仿真上的非门在实物上是三极管。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-30 13:15:07 | 显示全部楼层
  1. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  2. uchar i=0;
  3. sbit h4=P2^3;        //共阳,低电平有效
  4. sbit h3=P2^2;
  5. sbit h2=P2^1;
  6. sbit h1=P2^0;
  7. disp()
  8. {
  9.         if(i==0){h4=0;P0=tab[0];h1=1;}
  10.         if(i==1){h1=0;P0=tab[1];h2=1;}
  11.         if(i==2){h2=0;P0=tab[2];h3=1;}
  12.         if(i==3){h3=0;P0=tab[3];h4=1;}
  13.         i++;
  14.         if(i==4){i=0;}
  15. }
  16. main()
  17. {
  18. while(1)
  19. {
  20.         disp();
  21. }
  22. }
复制代码
改到中断外可以了,没必要放中断里面吧

出0入0汤圆

发表于 2012-5-30 18:43:30 | 显示全部楼层
确定为仿真软件的BUG.


it is not a bug. it is your inability to understand its limitations.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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