标题: 关于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 C和Proteus》清华大学出版社ISBN 978-7-302-41682-1.。书中电路和程序设计有详细说明,程序语句条条有注解。
| 欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |