找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1039|回复: 4
收起左侧

仿真软件中使用锁存器无法实现单片机数码管动态显示的问题

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 20%)
ID:272176 发表于 2023-9-14 11:01 | 显示全部楼层 |阅读模式
各位前辈,我最近重拾单片机,在实现数码管动态显示的时候遇到一个问题。我按照教程编写了使用两个锁存器实现数码管显示的代码,并使用定时器中断来进行延时的作用。当延时为1s时,可以实现前六个数码管分别从1-6流动。但是,如果将时间降低,我在proteus上无法实现动态显示的效果。仿真中的电路图是我自己画的,代码是按照教程编写的,请各位大佬帮我看一下问题在哪?(有一个蜂鸣器,测试的大佬要关一下,不然很吵 锁存器-数码管-蜂鸣器-LED电路图.png
  1. //数码管以1s间隔从0-6,在前六个数码管流水显示
  2. //问题:在proteus仿真无法实现实验板上的动态数码管显示效果,无法用视觉暂留形成效果!!!!!!
  3. #include<reg52.h>
  4. #include<intrins.h>
  5. #define uint unsigned int
  6. #define uchar unsigned char        

  7. uchar temp,aa,numdu,numwe;
  8. sbit dula = P2^6;
  9. sbit wela = P2^7;
  10. uchar code table[] =  {
  11. 0x3f,0x06,0x5b,0x4f,
  12. 0x66,0x6d,0x7d,0x07,
  13. 0x7f,0x6f,0x77,0x7c,
  14. 0x39,0x5e,0x79,0x71};
  15. uchar code tablewe[] = {
  16. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

  17. void main()
  18. {
  19.         numdu = 0;
  20.         numwe = 0;
  21.         aa = 0;
  22.         TMOD = 0x01;//六行代码完成定时器0中断的初始化!!!!!!
  23.         TH0 = (65536-5000)/256;
  24.         TL0 = (65536-5000)%256;
  25.         EA = 1;
  26.         ET0 = 1;
  27.         TR0 = 1;//启动定时器0!!

  28.         while(1)
  29.         {
  30.                 if(aa==1)
  31.                 {
  32.                         aa = 0;
  33.                         numdu++;
  34.                         if(numdu==7)
  35.                         {
  36.                                 numdu = 1;
  37.                         }
  38.                         dula = 1;
  39.                         P0 = table[numdu];
  40.                         dula = 0;

  41.                         wela = 1;
  42.                         P0 = tablewe[numwe];
  43.                         wela = 0;
  44.                         numwe++;
  45.                         if(numwe==6)
  46.                                 numwe = 0;
  47.                         
  48.                 }
  49.         }
  50. }

  51. void timer0() interrupt 1
  52. {
  53.         TH0 = (65536-5000)/256;
  54.         TL0 = (65536-5000)%256;
  55.         aa++;
  56. }
复制代码




回复

使用道具 举报

ID:161164 发表于 2023-9-14 14:08 | 显示全部楼层
要加消影
  1.                 if(aa==1)
  2.                 {
  3.                         aa = 0;
  4.                         numdu++;
  5.                         if(numdu==7)
  6.                         {
  7.                                 numdu = 1;
  8.                         }
  9.                         wela = 1;
  10.                         P0 = 0xFF;//消影
  11.                         wela = 0;
  12.                        
  13.                         dula = 1;
  14.                         P0 = table[numdu];
  15.                         dula = 0;

  16.                         wela = 1;
  17.                         P0 = tablewe[numwe];
  18.                         wela = 0;
  19.                         numwe++;
  20.                         if(numwe==6)
  21.                                 numwe = 0;

  22.                 }
复制代码



回复

使用道具 举报

ID:272176 发表于 2023-9-14 15:41 | 显示全部楼层

谢谢老哥,修改成功。请问这是段选P0口赋值和位选P0口赋值相互之间的干扰吗?
我也刚意识到,上传的代码没有注释。感谢老哥!!
回复

使用道具 举报

ID:535881 发表于 2023-9-14 21:05 | 显示全部楼层
前两天我也遇到了,proteus上使用数码管必须消影。
当数码管切换到下一位时,这个数码管就会显示上一个数码管的数字,由于切换时间很短,一闪而过,给人一种影的感觉,为了不显示上一个数,应该在切换数码管之前把所有的灯关掉,这就是所谓的消影。
回复

使用道具 举报

ID:123289 发表于 2023-9-15 15:19 | 显示全部楼层
要点:
1、切换时间要尽可能短,让有效显示时间长,这样亮度才能达到最大。
2、切换前要准备好切换的数据,这样才能减少切换执行的指令。
3、切换动作的第一步是关显示,这样切换时的数据变化才不被显示,显示才不会混乱。
4、做切换动作。
5、最后一步,是打开新一显示。
切换步骤如下(切换过程仅在条指令):
1、U3 = 全关
2、U1 = 新的显示位数据(数据事先做好,如放在变量NEX_D中,在此取用)
3、U3 = 打开新显示位(数据事先做好,如放在变量NEX_W中,在此取用)
P0 = 全关 → U3.LE = 1使能 → U3.LE = 0锁存 → 关显示【消隐】
P0 = NEX_D → U1.LE = 1使能 → U1.LE = 0锁存 → 【切换显示数据】
P0 = NEX_W → U3.LE = 1使能 → U3.LE = 0锁存 → 【切换显示位】

你的错误是:
dula = 1;
错误:【这时Ux打开,但数据P0是混乱的,导致短暂显示不受控】
改正:【放在正确的数据准备好之后】   
P0 = table[numdu]
不佳:【C语言取数组中的数据,不止一条指令,也即占用时间长了】
最佳:【事先做 NEX_x = table[numdu],在此:P0 = NEX_x】
dula = 0【OK】

改正后:
P0 = NEX_x;【切换前准备好 NEX_x = table[numdu]】
dula = 1;
dula = 0;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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