资源描述:
《IO接口扩展通俗易懂的教程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、晨辉教你轻松学51--------I/O扩展篇(基于74HC164/74HC165)在我们的单片机应用系统中,常常会遇到I/O口不够的情况。譬如说接有外部RAM而且要求有16个以上的按键,8位数码管以上的显示。而且还不包括其它的外围器件。这时整个系统的I/O资源就很吃紧了。系统的扩展性也不好。这时我们就需要考虑对单片机的I/O进行扩展了。 虽然专门的I/O扩展芯片市场上也有不少,但对于我们一般的应用,没有必要整的那么复杂。用一些简单的移位寄存器芯片一样可以实现我们的目标。下面我们首先来认识一下74HC164这款芯
2、片。这款芯片的作用是把串行输入的数据并行输出。注意,它没有锁存功能,在允许输出的情况下,每一个时钟的上升沿,数据依次从最低位移向最高位。因此,在做数码管的输出显示的时候会出现拖影的想象,在设计此电路时要注意考虑此情况。下面是它的引脚图。A1,A2是数据输入端,一般情况下两者连在一起,作为串行数据的输入端。Qa----Qhj就是并行数据的输出端了。CLOCK和RESET分别为时钟和复位端下面我们再看看它的真值表,有了真值表我们才知道如何正确的去编写程序去驱动它(其它复杂的器件还需要对照时序图编写相应的驱动程序) 呵
3、呵,怎么样,这个表很简单吧,相信大家都能够看的懂。当Reset为低电平时不管时钟为高电平还是低电平也不管输入引脚A1,A2为何值,输出的并行数据均为低电平。当Reset为高电平时,只有在时钟的上升沿,A1A2上的值才被移位输出。看懂了这张表那么剩下的事情就好办多了。下面我以级联的8块74HC164驱动8位共阴的数码管为例来阐述它的用途。当然它的用途并不仅仅在于此。你可以发挥你的聪明才智去应用它到你的设计中。 以上的连接中Reset脚要全部接高电平。所有的Clock引脚都要连接在一块。第一块74HC164的AB引脚接在
4、一块作为串行数据的输入端。第二块74HC164的AB引脚接在第一块74HC164并行数据输出端的H脚上。后面的接法依照第二块的接法依次级联下去。接好后共引出四根引线。其中电源两根。一根时钟线。一根串行数据输入线。怎么样,节省了不少IO口吧~~下面看看如何写程序去驱动它。(编译器keilUv3)先看看下面的引脚连接及相关宏定义sbitio_74hc164_SCK=P3^7;sbitio_74hc164_SDA=P3^6;#defineIO_74HC164_SCK_HIGH io_74hc164_SCK=1;#def
5、ineIO_74HC164_SCK_LOW io_74hc164_SCK=0;#defineIO_74HC164_SDA_INPUT io_74hc164_SDA下面是数码管的段码表可以根据不同的连接顺序去修改。/*********************************************************** a--4 b--5 c--6 d--2 e--0 f--1 g--3 dp--7*****************************************
6、******************/uint8codeDisplayTable[]={ 0x77,0x60,0x3D,0x7C,0x6A,0x5E,0x5F,0x70,0x7F,0x7E,0x7B,0x4F,0x17,0x6D,0x1F,0x1B,0x08/*0 1 2 3 4 5 6 7 8 9 a b c d e f - */};voidv_74hc164WriteData_f(uint8Dat) //向74HC164写一个字节的内容{
7、 //即可并行输出该字节 uint8i=0; uint8SendData=Dat; for(i=8;i>0;i--) { IO_74HC164_SCK_LOW &n,bsp; SendData<<=1; IO_74HC164_SDA_INPUT=CY; IO_74HC164_SCK_HIGH }}voidv_HexToBcd_f(uint8*P,uint16Dat)
8、 //BCD码的转化{uint8i=0;uint8Temp;if(Dat>=40000){i =4;Dat-=40000;}if(Dat>=20000){i+=2;Dat-=20000;} if(Dat>=10000){i+=1;Dat-=10000;}*P++=i;i=0; if(Dat>=8000){i