打印

请教高手:74HC595联级问题?

[复制链接]
2033|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用2个74HC595联级做点阵静态显示,74HC595做列扫描,51单片机P2口做行扫描,为什么仿真出来点阵不是静态的?而是逐行点亮,甚至夸行点亮?请大神赐教?
以下是电路图和源程序:
源程序:#include<reg52.h>
#include <intrins.h>
sbit DS=P0^0;
sbit SH=P0^1;
sbit ST=P0^2;


unsigned char code LED2[]={0x00,0x82,0xC5,0xF9,0x01,0x02,0x04,0xF8};
unsigned char code LED1[]={0x00,0x41,0xA3,0x9F,0x80,0x40,0x20,0x1F};

void delay1µs()
{
  _nop_();
       
}
void hc595_in(unsigned char dat)
{
unsigned char z;
for(z=0;z<8;z++)
   {

   if((dat&0x80)==0x80)
      DS=1;
   else
      DS=0;
   dat=dat<<1;
   SH=0;
   delay1µs();
   SH=1;
   delay1µs();
   }
}
void hc595_out()
{
        ST=0;
        delay1µs();
        ST=1;
}  


void main()
{
         EA=1;
         TMOD=0x01;
         TH0=0xFC;
         TL0=0x67;
         ET0=1;
         TR0=1;
         while(1);

}
void interrupttimer0() interrupt 1
{
  static unsigned char i=0;
  TH0=0xFC;
  TL0=0x67;
  switch(i)
                {
                case 0:        hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0x7F;i++;break;
                case 1: hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0xBF;i++;break;
                case 2:        hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0xDF;i++;break;
                case 3:        hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0xEF;i++;break;
                case 4:        hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0xF7;i++;break;
                case 5:        hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0xFB;i++;break;
                case 6:        hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0xFD;i++;break;
                case 7:        hc595_in (LED2[i]);        hc595_in (LED1[i]);        delay1µs();        hc595_out();P2=0xFE;i=0;break;
                default:break;
            }
}

原理图.PNG (35.97 KB )

原理图.PNG
评论
xch 2018-4-16 13:48 回复TA
P2每个PIN 只对应驱动一只LED,驱动能力也就比较充分。 
xch 2018-4-16 13:47 回复TA
程序设计成595 输出扫描,通过三极管提供大电流驱动最多8只LED同时导通。 这样595驱动就是简单的位移驱动SH一个脉冲移位一次。P2输出点阵 
xch 2018-4-16 10:14 回复TA
595输出数据效率很低,51 的驱动电流很小。LED亮度会很低 
xch 2018-4-16 10:12 回复TA
此设计,软硬件都有问题。 hc595_in()函数是错误的。for循环8次不对,dat 应该是16位的。一次输出,不能分两次。 输出更新前,应该有个消隐时序。 

相关帖子

沙发
xyz549040622| | 2018-4-14 09:48 | 只看该作者
定时器中扫描595,你定时设置的时间是多大,595的扫描时间没有设置好,所以你看上去是动态的,跨行说明你595的编码选择有一部分是错误的

使用特权

评论回复
板凳
xyz549040622| | 2018-4-14 10:25 | 只看该作者
仔细看了看,你定时器设置的时间是921us,不到1ms。扫描完1个LED的时间是8ms,而且你是依次打开列的,所以感觉你的编码也是有问题的,建议你找个51的LED点阵的例程看看,重新规划下你的思路。

使用特权

评论回复
地板
McuPlayer| | 2018-4-14 14:00 | 只看该作者
动态扫描,别用Proteus测试,用实际电路

使用特权

评论回复
5
慧剑温情|  楼主 | 2018-4-14 18:00 | 只看该作者
xyz549040622 发表于 2018-4-14 10:25
仔细看了看,你定时器设置的时间是921us,不到1ms。扫描完1个LED的时间是8ms,而且你是依次打开列的,所以 ...

如果我不用定时器直接在主函数里用while函数循环,结果一样。我把595并行输入,输出中的函数延迟语句时间加长能慢步仿真能看到列是逐步扫描的,不夸行

使用特权

评论回复
6
xyz549040622| | 2018-4-14 19:35 | 只看该作者
慧剑温情 发表于 2018-4-14 18:00
如果我不用定时器直接在主函数里用while函数循环,结果一样。我把595并行输入,输出中的函数延迟语句时间 ...

前面说的有误,LED点阵应该是按行扫描的,你看到的是逐行点亮,只能说明一件事,你扫描的还不够快。

使用特权

评论回复
7
慧剑温情|  楼主 | 2018-4-14 22:29 | 只看该作者
xyz549040622 发表于 2018-4-14 19:35
前面说的有误,LED点阵应该是按行扫描的,你看到的是逐行点亮,只能说明一件事,你扫描的还不够快。 ...

灯泡闪烁频率低于50HZ可以了嘛?即20毫秒,这扫屏速度也没超哒?

使用特权

评论回复
8
xyz549040622| | 2018-4-14 22:35 | 只看该作者
慧剑温情 发表于 2018-4-14 22:29
灯泡闪烁频率低于50HZ可以了嘛?即20毫秒,这扫屏速度也没超哒?

所以说有点奇怪,仿真没用过,但是你这个现象,确实很像扫描时间不够引起的。

使用特权

评论回复
9
xyz549040622| | 2018-4-14 22:36 | 只看该作者
本帖最后由 xyz549040622 于 2018-4-14 23:51 编辑

你proteus文件发上来,我试试看看。

使用特权

评论回复
10
慧剑温情|  楼主 | 2018-4-14 22:51 | 只看该作者
xyz549040622 发表于 2018-4-14 22:36
你protues文件发上来,我试试看看。

要的等会

使用特权

评论回复
11
慧剑温情|  楼主 | 2018-4-14 22:59 | 只看该作者
xyz549040622 发表于 2018-4-14 22:36
你protues文件发上来,我试试看看。

程序与原理图

点阵.rar

70.52 KB

使用特权

评论回复
12
慧剑温情|  楼主 | 2018-4-14 23:07 | 只看该作者
xyz549040622 发表于 2018-4-14 22:36
你protues文件发上来,我试试看看。

能否加你qq请教?

使用特权

评论回复
13
xyz549040622| | 2018-4-15 09:15 | 只看该作者

你是要这样的效果吧,有几个问题需要注意
1.定时器的时间,我设置的是2.5ms扫描一次
2.点阵的消隐,进定时器的时候关闭点阵
3.三极管的开关时间,加上三极管会有闪烁,去掉就好了

使用特权

评论回复
14
xyz549040622| | 2018-4-15 09:16 | 只看该作者
51-数码管点阵.rar (54.01 KB)
修改后的工程包

使用特权

评论回复
15
慧剑温情|  楼主 | 2018-4-15 09:24 | 只看该作者
xyz549040622 发表于 2018-4-15 09:15
你是要这样的效果吧,有几个问题需要注意
1.定时器的时间,我设置的是2.5ms扫描一次
2.点阵的消隐,进定时 ...

对头,就是想要这种结果,大神,能否加你qq以后多多请教?

使用特权

评论回复
16
xyz549040622| | 2018-4-15 11:36 | 只看该作者
慧剑温情 发表于 2018-4-15 09:24
对头,就是想要这种结果,大神,能否加你qq以后多多请教?

哈哈,论坛@我就可以了,我天天泡在坛子里。

使用特权

评论回复
17
xyz549040622| | 2018-4-15 11:37 | 只看该作者
慧剑温情 发表于 2018-4-15 09:24
对头,就是想要这种结果,大神,能否加你qq以后多多请教?


我是最新8.6的版本。

使用特权

评论回复
18
慧剑温情|  楼主 | 2018-4-15 11:57 | 只看该作者
慧剑温情 发表于 2018-4-15 09:24
对头,就是想要这种结果,大神,能否加你qq以后多多请教?

我用你的程序仿真是这种效果,减小扫描时间在2.5ms以下也不行,是晶振设置不对吗?

1.gif (14.18 KB )

1.gif

使用特权

评论回复
19
xyz549040622| | 2018-4-15 12:52 | 只看该作者
慧剑温情 发表于 2018-4-15 11:57
我用你的程序仿真是这种效果,减小扫描时间在2.5ms以下也不行,是晶振设置不对吗?
...

你用我的工程看看。

使用特权

评论回复
20
慧剑温情|  楼主 | 2018-4-15 13:10 | 只看该作者
xyz549040622 发表于 2018-4-15 12:52
你用我的工程看看。

图一是你的,图二是我升级到8.6后的效果,还是会有个别LED会闪烁,不过效果好多了,还想请教一下,我们实际电路中不加三极管,单片机可能驱动不了那么多LED吧?怎么解决呢?

1.gif (12.63 KB )

1.gif

2.gif (12.54 KB )

2.gif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

39

帖子

1

粉丝