标题: 12位数码管同时显示单片机源代码 仿真图 数码管闪烁问题? [打印本页]

作者: centch    时间: 2023-3-18 17:33
标题: 12位数码管同时显示单片机源代码 仿真图 数码管闪烁问题?
利用片外RAM 扩展12位数码管,同时显示,仿真不显示,
实际电路显示,但数码管闪烁。求助,数码管如何才能不
闪烁?程序有问题?还是这种扩展方式不行?求教各位。多谢了。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<absacc.h>
  3. #define hc273_U3 XBYTE[0x1fff]        //Y0:0x1fff(无关位用1),U1 74HC273 ,段码        四位
  4. #define hc273_U6 XBYTE[0x7fff]        //Y3:0x7fff(无关位用1),U6 74Hc273 ,位选
  5. #define hc273_U5 XBYTE[0x5fff]        //Y2:0x5fff(无关位用1),U3 74HC273 ,段码        四位
  6. #define hc273_U4 XBYTE[0x3fff]  //Y1:0x5fff(无关位用1),U1 74HC273 ,段码        四位

  7. unsigned char code c[10] = {0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84}; // 数码管0-9段码 共阳数码管(部分改动)
  8. unsigned char code w[5] = {0xfe,0xfd,0xfb,0xf7};//数码管位码
  9.                               
  10. void main()
  11. {
  12.   unsigned int t;
  13.   unsigned char i;
  14.   unsigned char PA = 0x01;
  15.   unsigned char a[4] = {2,3,4,5};
  16.   unsigned char b[4] = {7,8,0,9};
  17.   unsigned char e[4] = {1,6,8,3};
  18.   while(1)
  19.   {
  20.    
  21.         for(i=0;i<4;i++)
  22.         {
  23.          hc273_U3 = c[a[i]];
  24.          hc273_U4 = c[b[i]];
  25.          hc273_U5 = c[e[i]];
  26.          hc273_U6 = ~PA;
  27.      for(t=0;t<1000;t++);
  28.          PA<<=1;
  29.         }
  30.         PA = 0x01;
  31.   }
  32. }
复制代码


1.jpg (370.01 KB, 下载次数: 94)

1.jpg

作者: wulin    时间: 2023-3-18 20:57
给你一个示例参考
16位数码管万年历1302 仿真.rar (133.06 KB, 下载次数: 23)


作者: centch    时间: 2023-3-18 21:39
wulin 发表于 2023-3-18 20:57
给你一个示例参考

多谢,下载来参考一下。
作者: xianfajushi    时间: 2023-3-18 21:52
如果使用排阻的话并且P0口又没做其他事情的话用573毫无意义P0口应接排阻
作者: centch    时间: 2023-3-18 22:24
xianfajushi 发表于 2023-3-18 21:52
如果使用排阻的话并且P0口又没做其他事情的话用573毫无意义P0口应接排阻

P0口为数据与地址(第位)复用口,273触发器。我只画了部分电路,按键复用P0口没有画出。
作者: centch    时间: 2023-3-18 22:25
xianfajushi 发表于 2023-3-18 21:52
如果使用排阻的话并且P0口又没做其他事情的话用573毫无意义P0口应接排阻

此图应属于总线控制范畴
作者: xianfajushi    时间: 2023-3-19 08:42
centch 发表于 2023-3-18 22:25
此图应属于总线控制范畴

273和245同属锁存器,且273已经分别控制了直接P0即可245可以不用。
作者: a185980800    时间: 2023-3-19 23:37
此回答来自gpt 3.5闪烁问题可能来自于数据和位选信号同时改变导致的,可以考虑在更改数据之前先将位选信号置位,然后再更改数据,最后才将位选信号清零。修改程序如下所示:  while (1) {     for (i = 0; i < 4; i++)     {         hc273_U6 = w[i]; // 先置位选信号         hc273_U3 = c[a[i]];         hc273_U4 = c[b[i]];         hc273_U5 = c[e[i]];         for (t = 0; t < 1000; t++);         hc273_U6 = 0xFF; // 清除位选信号     } } 此外,还需要注意以下几点。  在使用绝对地址访问外部RAM时,需要确保地址线连接正确,否则会导致无法访问到RAM中的数据。  如果数码管闪烁问题依然存在,可以考虑增加延时时间或者使用定时器实现定时刷新。
作者: xianfajushi    时间: 2023-3-20 05:32
用3片锁存器分别控制段=控制位只有4速度可以说是很快的时间很好安排,若段是共用的则是控制位为12速度稍慢时间也不是不能安排,因为锁存器是并行数据,若是用串行传送数据则更慢,数码管闪烁原因基本就是时间安排问题。
作者: centch    时间: 2023-3-20 21:53
a185980800 发表于 2023-3-19 23:37
此回答来自gpt 3.5闪烁问题可能来自于数据和位选信号同时改变导致的,可以考虑在更改数据之前先将位选信号 ...

多谢您的指点,按照您说的方法,修改了程序,闪烁还存在。我再试试定时中断。
作者: centch    时间: 2023-3-20 21:55
xianfajushi 发表于 2023-3-19 08:42
273和245同属锁存器,且273已经分别控制了直接P0即可245可以不用。

由于电流超出,用245做了电流缓冲。
作者: centch    时间: 2023-3-20 21:57
xianfajushi 发表于 2023-3-20 05:32
用3片锁存器分别控制段=控制位只有4速度可以说是很快的时间很好安排,若段是共用的则是控制位为12速度稍慢 ...

可能需要严格的时序,数码管才会不闪,调试中;多谢。
作者: xianfajushi    时间: 2023-3-26 08:51


作者: xianfajushi    时间: 2023-3-26 18:10
本帖最后由 xianfajushi 于 2023-3-27 09:23 编辑
centch 发表于 2023-3-20 21:55
由于电流超出,用245做了电流缓冲。

数字芯片中74系列07缓冲器有40毫安电流可以选用。如我上图电路就可以使用缓冲器扩大电流给12位数码段,而位电流则直接273够用不需扩流当然要扩流也是可以的,这样算起来也就使用8个缓冲器,或许会问74*07是对电源开集电路,对于共阴数码管接位直接上即可,对于段怎么弄,很简单的加上拉电阻即可,若不满意那就复杂些添加PNP基极电阻4.7K射极限流电阻247即可从仿真可以调节射极电阻大小值达到调节电流目标。

作者: centch    时间: 2023-3-30 16:16
有道理,实验一下,多谢。
作者: 15031773670    时间: 2023-4-9 20:32
哈哈。我只想说用1640根本就没有那么多的麻烦事。TM1640可以驱动1-16位也不会闪。也省单片机的资源。之前发过一个文章。应该里面有代码。
作者: xianfajushi    时间: 2023-4-9 20:54
我初学编程时就到论坛1是看看别人是怎么写的,2是有机会就回复力所能及的,有一次好像是回复不怎样,有人奚落我一边呆着去,我问什么意思,答“哪凉快哪呆着去”,然而这种人我觉得不值一提,没那么了不起,反而是没见识鄙陋的表现,其实学单片机我也是一样来看看别人是怎么写的,不是赋值粘贴的,最重要的是自己思考推敲才要紧,其实这种驱动没什么特别的,多动脑子就有办法,很简单的,不是什么很难的时序。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1