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

[复制链接]
721|29
 楼主 | 2018-4-13 22:34 | 显示全部楼层 |阅读模式
用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;
            }
}

本帖子中包含更多资源

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

x

评论

xch 2018-4-16 10:12 回复TA
此设计,软硬件都有问题。 hc595_in()函数是错误的。for循环8次不对,dat 应该是16位的。一次输出,不能分两次。 输出更新前,应该有个消隐时序。 
xch 2018-4-16 10:14 回复TA
595输出数据效率很低,51 的驱动电流很小。LED亮度会很低 
xch 2018-4-16 13:47 回复TA
程序设计成595 输出扫描,通过三极管提供大电流驱动最多8只LED同时导通。 这样595驱动就是简单的位移驱动SH一个脉冲移位一次。P2输出点阵 
xch 2018-4-16 13:48 回复TA
P2每个PIN 只对应驱动一只LED,驱动能力也就比较充分。 
| 2018-4-14 09:48 | 显示全部楼层
定时器中扫描595,你定时设置的时间是多大,595的扫描时间没有设置好,所以你看上去是动态的,跨行说明你595的编码选择有一部分是错误的
| 2018-4-14 10:25 | 显示全部楼层
仔细看了看,你定时器设置的时间是921us,不到1ms。扫描完1个LED的时间是8ms,而且你是依次打开列的,所以感觉你的编码也是有问题的,建议你找个51的LED点阵的例程看看,重新规划下你的思路。
| 2018-4-14 14:00 | 显示全部楼层
动态扫描,别用Proteus测试,用实际电路
 楼主 | 2018-4-14 18:00 | 显示全部楼层
xyz549040622 发表于 2018-4-14 10:25
仔细看了看,你定时器设置的时间是921us,不到1ms。扫描完1个LED的时间是8ms,而且你是依次打开列的,所以 ...

如果我不用定时器直接在主函数里用while函数循环,结果一样。我把595并行输入,输出中的函数延迟语句时间加长能慢步仿真能看到列是逐步扫描的,不夸行
| 2018-4-14 19:35 | 显示全部楼层
慧剑温情 发表于 2018-4-14 18:00
如果我不用定时器直接在主函数里用while函数循环,结果一样。我把595并行输入,输出中的函数延迟语句时间 ...

前面说的有误,LED点阵应该是按行扫描的,你看到的是逐行点亮,只能说明一件事,你扫描的还不够快。
 楼主 | 2018-4-14 22:29 | 显示全部楼层
xyz549040622 发表于 2018-4-14 19:35
前面说的有误,LED点阵应该是按行扫描的,你看到的是逐行点亮,只能说明一件事,你扫描的还不够快。 ...

灯泡闪烁频率低于50HZ可以了嘛?即20毫秒,这扫屏速度也没超哒?
| 2018-4-14 22:35 | 显示全部楼层
慧剑温情 发表于 2018-4-14 22:29
灯泡闪烁频率低于50HZ可以了嘛?即20毫秒,这扫屏速度也没超哒?

所以说有点奇怪,仿真没用过,但是你这个现象,确实很像扫描时间不够引起的。
| 2018-4-14 22:36 | 显示全部楼层
本帖最后由 xyz549040622 于 2018-4-14 23:51 编辑

你proteus文件发上来,我试试看看。
 楼主 | 2018-4-14 22:51 | 显示全部楼层
xyz549040622 发表于 2018-4-14 22:36
你protues文件发上来,我试试看看。

要的等会
 楼主 | 2018-4-14 22:59 | 显示全部楼层
xyz549040622 发表于 2018-4-14 22:36
你protues文件发上来,我试试看看。

程序与原理图

本帖子中包含更多资源

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

x
 楼主 | 2018-4-14 23:07 | 显示全部楼层
xyz549040622 发表于 2018-4-14 22:36
你protues文件发上来,我试试看看。

能否加你qq请教?
| 2018-4-15 09:15 | 显示全部楼层

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

本帖子中包含更多资源

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

x
| 2018-4-15 09:16 | 显示全部楼层

修改后的工程包

本帖子中包含更多资源

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

x
 楼主 | 2018-4-15 09:24 | 显示全部楼层
xyz549040622 发表于 2018-4-15 09:15
你是要这样的效果吧,有几个问题需要注意
1.定时器的时间,我设置的是2.5ms扫描一次
2.点阵的消隐,进定时 ...

对头,就是想要这种结果,大神,能否加你qq以后多多请教?
| 2018-4-15 11:36 | 显示全部楼层
慧剑温情 发表于 2018-4-15 09:24
对头,就是想要这种结果,大神,能否加你qq以后多多请教?

哈哈,论坛@我就可以了,我天天泡在坛子里。
| 2018-4-15 11:37 | 显示全部楼层
慧剑温情 发表于 2018-4-15 09:24
对头,就是想要这种结果,大神,能否加你qq以后多多请教?


我是最新8.6的版本。

本帖子中包含更多资源

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

x
 楼主 | 2018-4-15 11:57 | 显示全部楼层
慧剑温情 发表于 2018-4-15 09:24
对头,就是想要这种结果,大神,能否加你qq以后多多请教?

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

本帖子中包含更多资源

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

x
| 2018-4-15 12:52 | 显示全部楼层
慧剑温情 发表于 2018-4-15 11:57
我用你的程序仿真是这种效果,减小扫描时间在2.5ms以下也不行,是晶振设置不对吗?
...

你用我的工程看看。
 楼主 | 2018-4-15 13:10 | 显示全部楼层
xyz549040622 发表于 2018-4-15 12:52
你用我的工程看看。

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

本帖子中包含更多资源

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

x
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /6 下一条

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