标题: 关于89C51单片机扩展74HC165的问题 [打印本页]

作者: 2345430    时间: 2018-9-8 00:45
标题: 关于89C51单片机扩展74HC165的问题
请问各位大侠,小弟刚学51单片机不久在做一个项目时需要很多输入按钮(大概22个按钮)发现用hc165联级的方式最多只能采集到两片HC165的联级的数据,第三片hc165的数据采集不到,代码如下:
#include "reg51.h"
#include "intrins.h

typedef unsigned char u8;
typedef unsigned int u16

/*74HC165管脚定义*/
sbit   out_q7=P1^0;
sbit       CLK=P1^1;
sbit         PL=P1^2
sbit       test=P1^3;


u16 HC165ReadData()
{
  u16 Datavalue,inData1,inData2,inData3,i;
  inData1=0;
  inData2=0;
  inData3=0;
  Datavalue=0;

  PL=0;
  _nop_();
  PL=1;//
  _nop_();

  /*读取第1片HC165数据*/
  for(i=0;i<8;i++)
  {
    inData1=inData1<<1
    CLK=0;
    _nop_();
    inData1|=out_q7;
    CLK=1;
    _nop_();
  }

  /*读取第2片HC165数据*/
  for(i=0;i<8;i++)
  {
    inData2=inData2<<1
    CLK=0;
    _nop_();
    inData2|=out_q7;
    CLK=1;
    _nop_();
  }

  /*读取第2片HC165数据*/
  for(i=0;i<8;i++)
  {
    inData3=inData3<<1
    CLK=0;
    _nop_();
    inData3|=out_q7;
    CLK=1;
    _nop_();
  }  
  Datavalue=inData1;
  Datavalue<<=8;
  Datavalue|=inData2;
  Datavalue<<=8;
  Datavalue|=inData3;
  return(Datavalue);
}



void delay(u16 y)
{
  while(y--);
}
                                            
void main()
{
  u16 hc165value;

  while(1)
  {
    hc165value=HC165ReadData();
    if((hc165value&(1<<0))==0) //此处范围只能设置0-15,超过这个范围结果一直是0小灯一直闪烁
    test=0;
    delay(20000);
    test=1;
    delay(20000);
  }
}


作者: zl2168    时间: 2018-9-8 21:10
利用虚拟串行比真串行速度要慢,但即使这样,也不至于漏掉按键信号,按键信号至少10ms以上。要漏掉也不至于全部漏掉。因此,可以肯定,你的电路连接或程序有问题。
作者: zl2168    时间: 2018-9-8 21:13
实例39 74HC165串行输入8-16位按键状态
作者: 人中狼    时间: 2018-9-8 23:04
HC165的信号引脚最好都接一个上拉电阻,单片机的引脚可能没有足够的驱动力去驱动多个芯片
作者: zl2168    时间: 2018-9-9 09:00
我这个案例是真串口传送
Proteus仿真一下,确认有效。
实例39 74HC165串行输入8-16位按键状态.rar (57.52 KB, 下载次数: 67)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1.书中电路和程序设计有详细说明,程序语句条条有注解。





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