51单片机IO扩展(并转串)-74HC165

51单片机IO扩展(并转串)–74HC165

​ ——8位移位寄存器(并行输入,互补串行输出)

双列直插封装 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xrz5MNRO-1575257894743)(https://i.loli.net/2019/11/30/XT3VPmCSJzLQrOb.jpg)]

​ 双列直插封装 PLCC封装

说明

当移位/置入控制端(SH/L__D__)为低电平时,并行数据(A-H)被置入寄存器,而时钟(CLK,CLK INH)及串行数据(SER)均无关。当 SH/L__D__为高电平时,并行置数功能被禁止。
CLK和CLK INK在功能上是等价的,可以交换使用。当CLK和CLK INK有一个为低电平并且SH/L__D__为高电平时,另一个时钟可以输入。当CLK和CLK INK有一个为高电平时,另一个时钟被禁止。只有在CLK为高电平时CLK INK才可变为高电平。

引出端符号
CLK,CLK INH 时钟输入端(上升沿有效)
A-H 并行数据输入端
SER 串行数据输入端
QH 输出端
Q__H 互补输出端
SH/L__D__ 移位控制/置入控制(低电平有效)

#####过程理解:

​ 74HC165 A-H 并行数据输入端 输入8位电平信息存到芯片内,通过QH输出端传到51芯片中

真值表

真值表

​ H-高电平 L-低电平 X-任意电平 ↑-低到高电平跳变

时序图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QBfTW6jq-1575257894744)(时序图.jpg)]

根据时序编程
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

//函 数 名: Read74HC165
//函数功能: 使用165读取一个字节数据

u8 Read74HC165(void)
{  
  u8 i;
  u8 indata;
		
   IN_PL = 0;
   _nop_();        //短暂延时 产生一定宽度的脉冲
   IN_PL = 1;	   //将外部信号全部读入锁存器中
   _nop_(); 
              
   indata=0;   //保存数据的变量清0  
   for(i=0; i<8; i++)
    { 
	  indata = indata<<1;	   //左移一位
	  SCK = 0;   //时钟置0	 
      _nop_();
	  indata |= IN_Data;
      SCK = 1;   //时钟置1	  
	} 
   
   return(indata);	 
}
案例
/**************************************************************************************
		     单片机IO扩展--74HC165实验												  
			实现现象:下载程序后,按下独立按键可以点亮对应的led
			K1--led1
			K2--led2
			K3--led3
			...
			K8--led8
			
注意事项:必须将74HC165模块的JP165短接片短接,否则不会出现现象																			  
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h"

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

//--定义使用的IO口--//
#define GPIO_LED P0
sbit    IN_PL   = P1^6;    
sbit    IN_Data = P1^7;    //数据通过P1.7脚移进单片机内处理
sbit    SCK    = P3^6;




/*******************************************************************************
* 函 数 名         : Read74HC165
* 函数功能		   : 使用165读取一个字节数据
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

u8 Read74HC165(void)
{  
  u8 i;
  u8 indata;
		
   IN_PL = 0;
   _nop_();        //短暂延时 产生一定宽度的脉冲
   IN_PL = 1;	   //将外部信号全部读入锁存器中
   _nop_(); 
              
   indata=0;   //保存数据的变量清0  
   for(i=0; i<8; i++)
    { 
	  indata = indata<<1;	   //左移一位
	  SCK = 0;   //时钟置0	 
      _nop_();
	  indata |= IN_Data;
      SCK = 1;   //时钟置1	  
	} 
   
   return(indata);	 
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	u8 h165Value;

	GPIO_LED = 0;
	while(1)
	{
		h165Value = Read74HC165();
		if(h165Value != 0xFF)
		{
			GPIO_LED = ~h165Value;
		}	
	}			
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值