找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: asdadqw2
打印 上一主题 下一主题
收起左侧

用5个74hc595芯片级联,控制27位数码管,数码管显示闪烁问题

  [复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次(中奖概率 50%)
41#
ID:384109 发表于 2024-4-15 15:34 | 只看该作者
看代码,你是对595的使用有误解吧
回复

使用道具 举报

42#
ID:33145 发表于 2024-4-15 15:49 | 只看该作者
yqs138168 发表于 2024-4-15 15:26
看看我的程序,新思路,与你的写法不一样,效率高很多

还有一种方案,使用专用显示驱动芯片,例如MAX7219
回复

使用道具 举报

43#
ID:33145 发表于 2024-4-15 15:58 | 只看该作者
数码管仿真模型参数修改

数码管仿真模型参数修改.jpg (142.7 KB, 下载次数: 5)

数码管仿真模型参数修改.jpg
回复

使用道具 举报

44#
ID:213173 发表于 2024-4-15 17:04 | 只看该作者
给你一个仿真示例,如果实物效果不好就按10楼建议处理,以留给主函数足够时间运行其它代码。




  1. #include <reg51.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define ulong unsigned long
  5. sbit P_HC595_SER   = P2^0;
  6. sbit P_HC595_SRCLK = P2^1;
  7. sbit P_HC595_RCLK  = P2^2;
  8. sbit A0=P2^3;
  9. sbit B0=P2^4;
  10. sbit C0=P2^5;
  11. uchar code table[]={
  12. // 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  13.   0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  14. //  G   H    J    K    L    M    N    o    P     Q    r   t   
  15.   0x3d,0x76,0x1E,0x70,0x38,0x37,0x54,0x5C,0x73,0x67,0x50,0x78};
  16. ulong num=0xfffffffe;
  17. bit flag;//标志

  18. /**************** 向HC595发送一个字节函数 ******************/
  19. void Send_595(uchar dat)
  20. {               
  21.         uchar i;
  22.         for(i=0;i<8;i++)
  23.         {
  24.                 dat <<= 1;
  25.                 P_HC595_SER  = CY; //溢出位赋值数据输出端
  26.                 P_HC595_SRCLK = 1; //移位时钟
  27.                 P_HC595_SRCLK = 0;
  28.         }
  29. }
  30. /**************** 向HC595发送5个字节驱动码 ******************/
  31. void DisplayScan()
  32. {       
  33.         static uchar i;

  34.         Send_595(num>>24);//向HC595发送位码
  35.         Send_595(num>>16);//向HC595发送位码
  36.         Send_595(num>>8);//向HC595发送位码
  37.         Send_595(num);   //向HC595发送位码
  38.         Send_595(table[i]);//向HC595发送段码
  39.         P_HC595_RCLK = 1;//锁存输出数据
  40.         P_HC595_RCLK = 0;
  41.         num=num<<1|0x01;
  42.         if(++i>=27)
  43.         {
  44.                 num=0xFFFFFFFE;
  45.                 i=0;
  46.         }
  47. }

  48. void InitTimer0(void)//740us
  49. {
  50.     TMOD = 0x01;
  51.     TH0 = 0x0FD;
  52.     TL0 = 0x1C;
  53.     EA = 1;
  54.     ET0 = 1;
  55.     TR0 = 1;
  56. }

  57. void main()
  58. {
  59.         P_HC595_SRCLK = 0;//初始化移位时钟端
  60.         P_HC595_RCLK  = 0;//初始化锁存输出端
  61.         InitTimer0();
  62.         while(1)
  63.         {
  64.                 if(flag)
  65.                 {
  66.                         flag=0;
  67.                         DisplayScan();
  68.                         //其它程序
  69.                 }
  70.         }
  71. }
  72. void Timer0Interrupt(void) interrupt 1
  73. {
  74.         TH0 = 0xFD;
  75.         TL0 = 0x1C;
  76.         flag=1;
  77. }
复制代码




回复

使用道具 举报

45#
ID:57657 发表于 2024-4-16 08:48 | 只看该作者
27个数码管每个8段共有216段,使用16行16列扫描只需要4个74HC595 最多驱动256个点阵(16*16或32*8)或32位8段数码管。
如果单片机有16个IO口空闲,那么只需要2片74HC595就能驱动,32个IO口空闲一片都不需要(需要IO口支持强推挽模式)。
仿真的动态扫描闪烁可以调整 Minimum Trigger Time 的毫秒参数,具体是否闪烁需要实物验证。
回复

使用道具 举报

46#
ID:332444 发表于 2024-4-16 09:17 | 只看该作者
很简单的,取消延时语句,测量时间是多少,若时间刚好则可取消延时,若还是时间过多则要考虑修改电路。
回复

使用道具 举报

47#
ID:298743 发表于 2024-4-16 16:29 | 只看该作者
yqs138168 发表于 2024-4-15 15:21
24个共阴数码管+5个74HC595,仿真软件为Proteus8.11版本,,,可以正常显示。

真是奇怪了,我将你的8位一组数码管换成两个四位一组的数码管就显示不出来了
回复

使用道具 举报

48#
ID:298743 发表于 2024-4-16 19:06 | 只看该作者
神奇,把long拆分成4个unchar ,12MHZ现在又可以了,之前要用到33MHZ才可以的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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