菜鸟初学单片机IO扩展(并转串)

峰峰说学会IO扩展(并转串)还是蛮重要;
接下来一起看下以下学习点哈~(内容参考普中科技)
74HC165是8位并行输入串行输出移位寄存器,它是一款高速CMOS器件;
遵循JEDEC标准。74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列。 其管脚封装及功能如下:
菜鸟初学单片机IO扩展(并转串)_第1张图片
1.CLK,CLK INH:74HC165的时钟输入是一个“或非门”结构CLK和CLK INH功能是可以等效的可以互换使用的,一般采取相连在一起,上升沿市数据一位一位的串行输出。
2.A-H:并行数据输入端
3.SER:为串行输入端,将数据串行进入到寄存器中,在每一个时钟的上升沿向右移动一位;利用这种特性,只要把QH输出连接到下一级的SER输入既可实现并转串扩展。
4.QH:串行输出端
5.QH:互补串行输出端
6.SH/LD:为低电平时并行数据进入移位寄存器中,为高电平时并行数据不能传进移位寄存器。
当移位/置入控制端(SH/LD)为低电平时,并行数据(A-H)被置入寄存器,而时钟(CLK,CLK INH)及串行数据(SER)均无关。当SH/LD为高电平时,并行数功能被禁止。
CLK,CLK INK在功能上是等价的,可以交换使用。当CLK和CLK INK有一个低电平并且SH/LD为高电平时,另一个时钟可以输入。当CLK和CLK INK有一个为高电平时,另一个时钟被禁止。只有在CLK为高电平时CLK INK才可变为高电平。
那么当并行输入口输入数据时,这个数据是如何通过串行输出口输出呢?在74HC165数据手册上可以看到如下时序图:
菜鸟初学单片机IO扩展(并转串)_第2张图片
本实验用到的硬件资源如下
1.LED灯(D1-D8)
2.独立按键模块
3.74HC165模块
菜鸟初学单片机IO扩展(并转串)_第3张图片
菜鸟初学单片机IO扩展(并转串)_第4张图片
代码如下

/*
*************************************************************************************
ʵÑéÏÖÏó£ºÏÂÔسÌÐòºó,°´Ï¶ÀÁ¢°´¼ü¿ÉÒÔµãÁÁ¶ÔÓ¦µÄLED
½ÓÏß˵Ã÷£º µ¥Æ¬»ú-->¶¯Ì¬ÊýÂë¹ÜÄ£¿é(¾ßÌå½ÓÏßͼ¿É¼û¿ª·¢¹¥ÂÔ¶ÔӦʵÑéµÄ¡°ÊµÑéÏÖÏó¡±Õ½Ú)
		  K1--D1
      K2--D2  
			......
			K8--D8
½ÓÏß˵Ã÷£º£¨¾ßÌå½ÓÏßͼ¿É¼û¿ª·¢¹¥ÂÔ¶ÔӦʵÑéµÄ¡°ÊµÑéÏÖÏó¡±Õ½ڣ©
            1.µ¥Æ¬»ú-->LED&½»Í¨µÆÄ£¿é
						    J22-->J19
						2.µ¥Æ¬»ú-->74HC165 Ä£¿é
						  P15-->LD
							P16-->CLK
							P17-->QH
							3,74HC165Ä£¿éÊä³ö-->¶ÀÁ¢°´¼ü
							J2-->JP1
×¢ÒâÊÂÏ																				  
**************************************************************************************
*/

#include "reg52.h"			 //´ËÎļþÖж¨ÒåÁ˵¥Æ¬»úµÄһЩÌØÊ⹦ÄܼĴæÆ÷
#include "intrins.h"
typedef unsigned int u16;	  //¶ÔÊý¾ÝÀàÐͽøÐÐÉùÃ÷¶¨Òå
typedef unsigned char u8;

//--¶¨ÒåʹÓõÄIO¿Ú--//
# define GPIO_LED P0

sbit IN_LD=P1^5;
sbit IN_QH=P1^6;  //Êý¾Ýͨ¹ýP1.7½ÅÒƽøµ¥Æ¬»úÄÚ´¦Àí
sbit SCK=P1^7;

/* 
* º¯ÊýÃû £º Read74HC165
* º¯Êý¹¦ÄÜ£ºÊ¹ÓÃ165¶ÁÈ¡Ò»¸ö×Ö½ÚÊý¾Ý
* ÊäÈ룺ÎÞ
* Êä³ö£ºÎÞ
*/
u8 Read74HC165(void)
{
	u8 i;
	u8 indata;
	
	IN_LD=0;
	_nop_();   //»ã±àÓï¾ä ¶ÌÔÝÑÓʱ ²úÉúÒ»¶¨¿í¶ÈµÄÂö³å
	IN_LD=1;    //½«ÍⲿÐźÅÈ«²¿¶ÁÈëËø´æÆ÷ÖÐ
	_nop_();   
	
	indata=0; //±£´æÊý¾ÝµÄ±äÁ¿Çå0
	for(i=0;i<8;i++)
	{
		indata=indata <<1;  //×óÒÆһλ
		SCK=0;  //ʱÖÓÖÃ0
		_nop_(); 
		indata |=IN_QH;
		SCK=1;
	}
	
	  return(indata);
}
void main()
{
	 u8 h165Value;
	
	 GPIO_LED=0Xff;
	while(1)
	{
		h165Value=Read74HC165();
		if(h165Value!=0xFF)
		{
			GPIO_LED=h165Value;
		}
	}
}

通过独立按键控制LED灯实验效果图

你可能感兴趣的:(菜鸟初学单片机IO扩展(并转串))