单片机io扩展74hc165和74hc595程序
74HC165连级使用方法及程序实例
![74HC165连级使用方法及程序实例](https://img.taocdn.com/s3/m/32a300050740be1e650e9aac.png)
{ HC165_PL = 1; //允许数据移位 HC165_CLK = 0; //低电平时读取数据 if(HC165_IN) //数据高位在前 { BJ_Priority |= 0x80>>i; } HC165_CLK = 1; //数据移位
}
for(i = 0;i<8;i++) //读取下一个 165 的数据 { HC165_CLK = 0; if(HC16LCD_DATA = 0xFF; } void Read_Busy(void) { LCD_DATA = 0xFF; RS = 0; RW = 1; EN = 1; //while(LCD_DATA & 0x80); Delay(100); EN = 0; } void Write_Lcd(unsigned char Value, bit i) //i = 0 写指令.i = 1 写数据; { Read_Busy(); LCD_DATA = Value; RS = i; RW = 0; EN = 1; EN = 0; } void Init_Lcd(void) { Delay(15000); Write_Lcd(0x38,0); Delay(5000); Write_Lcd(0x38,0); Delay(5000); Write_Lcd(0x38,0); Write_Lcd(0x08,0); Write_Lcd(0x01,0); Write_Lcd(0x06,0); Write_Lcd(0x0c,0);
sbit HC165_CE = P1^1; //HC165 控制端 L 有效 sbit HC165_PL = P1^2; //HC165 锁存引脚 H 高效 sbit HC165_CLK = P1^0; //HC165 时钟引脚 sbit HC165_IN = P1^3; //HC165 数据输出引脚 uint8 Address = 0; //本地地址变量 uint8 Priority = 0; //优先级变量 ///////////////////////////////////////////////////////
51单片机+74HC595驱动数码管程序
![51单片机+74HC595驱动数码管程序](https://img.taocdn.com/s3/m/8a48251ebcd126fff6050b06.png)
51单片机+74HC595驱动数码管程序这里是电路图:完整的源码和图纸下载地址:51hei/bbs/dpj-20392-1.html下面是51 单片机驱动74hc595 芯片的程序:#include //包含51 单片机的头文件#include #define uint unsigned int#define uchar unsigned char//sbit sin_595 =P1;//sbit rclk_595 =P1;//sb it sclk_595 =P1 ;//sbit s_clr =P1;sb it a_cp_595 =P2; //串行移位时钟脉冲sh_cp_595sbit b_cp_595 =P2;//输出锁存器控制脉冲st_cp_595//sbit _oe_595 =P1 ; //8 位并行输出使能/禁止(高阻态)sbit ds_595=P2 ; //串行数据输入extern uchar datas[6]; //存放6 个数码管的显示数字uchar ledcode[]={0xC0,// 00xF9,// 10xA4,// 20xB0,// 30x99,// 40x92,// 50x82,// 60xF8,// 70x80,// 80x90,// 90x88,// A0x83,// B0xC6,// C0xA1,// D0x86,// E0x8E// F};void delay(uint z){uint t1,y;for(t1=z;t1>0;t1--)for(y=110;y>0;y--);}voidled_display(void){ uchar i,j; bit testb; uchar bdata movebit[6]; uchar bdata test; //_oe_595=0; //选中数码管for(i=0;i<6;i++) movebit[i]=ledcode[datas[i]]; // P1=0; delay(1); for(i=0;i<6;i++) //数据移位{ test=movebit[i]; for(j=0;j<8;j++) { testb=test&0x80; test=test<<1; if(testb) { ds_595=1; } else {ds_595=0; }a_cp_595=1; a_cp_595=0; } //数据移位} b_cp_595=0; b_cp_595=1; b_cp_595=0;} tips:感谢大家的阅读,本文由我司收集整编。
74HC595芯片对单片机IO口的扩展原理与应用
![74HC595芯片对单片机IO口的扩展原理与应用](https://img.taocdn.com/s3/m/571d720e0a4e767f5acfa1c7aa00b52acfc79c38.png)
2020年第4期信息与电脑China Computer & Communication软件开发与应用74HC595芯片对单片机IO 口的扩展原理与应用杨恒敏(江苏联合职业技术学院扬州分院,江苏 扬州 225003)摘 要:单片机在使用过程中存在IO 端口有限的性能缺陷,笔者针对利用74HC595芯片扩展单片机IO 口的基本原理进行了详细分析,围绕流水灯效果、电子游戏扑克机、16×32LED 点阵显示器3个层面,探讨了单片机IO 口扩展的具体设计方案与实现路径,以期为顺利解决单片机IO 口紧缺问题提供借鉴。
关键词:74HC595芯片;单片机;IO 口扩展中图分类号:TP368.1 文献标识码:A 文章编号:1003-9767(2020)04-120-03Expanding Principle and Application of 74HC595 Chip to IO Port of SingleChip MicrocomputerYang Hengmin(Yangzhou Branch of Jiangsu Union Technical Institute, Yangzhou Jiangsu 225003, China)Abstract: There are limited performance defects of IO ports in the use of single-chip microcomputers. This article analyzesthe basic principles of using 74HC595 chip to expand the single-chip IO ports. At the level, the specific design scheme and implementation path of the expansion of the IO port of the single-chip microcomputer are discussed, in order to provide a reference for the smooth solution of the shortage of the IO port of the single-chip microcomputer.Key words: 74HC595 chip; single chip microcomputer; IO port expansion0 引言当前在使用单片机的过程中常面临IO 端口紧缺的问题,74HC595芯片作为一种通用位移缓存器,可实现8位串行输入/输出或并行输出,其电路连接方式与代码编程较为简单、驱动能力较强,并且凭借存储寄存器可保障在移位过程中并排输出端口数据不变,易于实现对单片机IO 口的扩展,具备良好的应用价值。
使用74HC595实现IO口的扩展
![使用74HC595实现IO口的扩展](https://img.taocdn.com/s3/m/cd20073caa00b52acec7caee.png)
使用74HC595实现I/O口的扩展一、实验目的1. 了解74HC595〔串入并出〕基本原理和使用2. 了解数码管的基本原理和驱动方式3. 学会使用74HC595来驱动静态数码管二、实验器材C51单片机开发板〔含74HC595芯片,静态数码管〕1块8PIN排线1根数据线1根三、实验原理1.数码管数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管按段数分为七段数码管和八段数码管〔还有一种“米”字型的数码管,其段数更多〕,八段数码管比七段数码管多一个发光二极管单元〔多一个小数点显示〕,其基本原理是:将所有LED的一端〔正极、负极均可〕连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。
〔1〕数码管的分类按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
我们在实际使用中一定要搞清楚数码管是共阴极的还是共阳极的。
〔2〕数码管段、位引脚的确定〔以4位8段数码管为例〕数码管引脚测量分三步:极性判断〔共阳极还是共阴极〕、公共端判断〔位选端口〕、段码端判断〔段选端口〕。
首先要确定数码管是共阴极还是共阳极的:找一个3到5V的直流电源,准备几个1K或者几百欧姆的电阻。
将电源的正极串接一个电阻后连在数码管的任意一个脚上,然后将电源的负极逐个接到数码管的其余引脚上,观察数码管的某一段是否会点亮,如果全部引脚试过都没有亮的,那么将电源正极〔串电阻〕换一个引脚再试,直到有一个LED发光,这时固定电源负极不动,电源正极〔串电阻〕逐个接到数码管的其余引脚上,如果有8段LED都亮,说明该数码管是共阴极的。
74HC595做IO口扩展
![74HC595做IO口扩展](https://img.taocdn.com/s3/m/ef76277831b765ce0508146c.png)
是并行数据输出口,即储寄存器的数据输出口
Q7'
串行输出口,其应该接 SPI 总线的 MISO 接口
STcp(Rck) 存储寄存器的时钟脉冲输入口
SHcp(Sck) 移位寄存器的时钟脉冲输入口
OE 非 (G)
输出使能端
MR 非(sclr) 芯片复位端
Ds
串行数据输入端
else IO0CLR = spi_ds; data <<= 1; IO0SET = spi_shcp; } IO0SET = spi_stcp; }
74HC595 简单工作原理
74HC595 是具有 8 位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分 别的时钟。数据在 SCHcp 的上升沿输入,在 STcp 的上升沿进入的存储寄存器中去。如果两 个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移 位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并 行 8 位的,具备三态的总线输出,当使能 OE 时(为低电平),存储寄存器的数据输出到 总线。
附子程序:
void hc595send_data(uint8 data)//要传输的数据,建议用数组的方法来查询 {
uint8 i; IO0CLR = spi_stcp; 12 脚 for(i=0;i<8;i++) {
IO0CLR = spi_shcp; 11 脚 if((data&0x80)!=0)IO0SET = spi_ds;
程序说明: 每当 spi_shcp 上升沿到来时,spi_ds 引脚当前电平值在移位寄存器中左移一位,在下一个 上升沿到来时移位寄存器中的所有位都会向左移一位,同时 Q7'也会串行输出移位寄存器 中高位的值,这样连续进行 8 次,就可以把数组中每一个数(8 位的数)送到移位寄存器; 然后当 spi_stcp 上升沿到来时,移位寄存器的值将会被锁存到锁存器里,并从 Q1~7 引脚 输出。
74HC595在单片机上的应用及程序
![74HC595在单片机上的应用及程序](https://img.taocdn.com/s3/m/68785203c4da50e2524de518964bcf84b9d52d1a.png)
74HC595在单片机上的应用及程序74HC595具有8位串入并出的三态门电路。
高速率:最高55MHz(5V工作电压)宽的工作电压范围:2V -6V每个口的最大电流值(QA-QH):±35mA当单片机的I/O资源比较紧张时,采用595并进行级联是一个很好的选择。
管脚定义:PIN NO symbol name and function15 QA data output1 QB data output2 QC data output3 QD data output4 QE data output5 QF data output6 QG data output7 QH data output8 GND ground9 QH’ serial data outputs10 /SCLR shift register clock input11 SCK shift register clock input12 RCK storage register clock input13 /G output enable input14 SI serial data input16 Vcc positive supply voltage时序图:请参照595的数据手册程序编制:端口定义设置:sbit DATA=P1^5;sbit SHIFT=P1^6;sbit STORAGE=P1^7;1、写595Void write_595(uchar x)//功能:将无符号8位数x,写入到595的shife register{Uchar j;For(j=0;j<8;j++)//循环8次,以便shift register保存8位数据{X=x<<1;//将数据左移一位,最高位数据进入到CY中SHIFT=0;//shift端置0_nop_();_nop_();_nop_();DATA=CY;//将一位数据送入595串口数据端SHIFT=1;//shift端产生一个上升沿,数据就送入到了shift register_nop_();//延时_nop_();_nop_();SHIFT=0;//shift端产生一个下降沿,shift register内容保持不变}}3、595数据的输出/********595输出函数函数*******************/void out_595(void){STORAGE=0;_nop_();_nop_();STORAGE=1;//上升沿shift register 的内容保存到store register _nop_();_nop_();STORAGE=0;//下降沿store register 的内容保持不变}4、只要在主函数中分别调用以上两个函数即可将要显示的数值X 显示出来。
74hc595 操作方法
![74hc595 操作方法](https://img.taocdn.com/s3/m/02cb9e9c5122aaea998fcc22bcd126fff7055ded.png)
74hc595 操作方法
74HC595是一种移位寄存器芯片,主要用于扩展输出IO。
以下为74HC595的操作方法:
1. 初始化74HC595芯片:将MR引脚置高,然后将SRCLR引脚置低。
这样可以清空芯片内部的数据,并准备开始向芯片输出数据。
2. 向74HC595芯片输入数据:先将SER引脚置低,然后依次将需要输出的数据位写入到SRCLK引脚上。
当每一位数据都写入完成后,将SRCLK引脚置低。
3. 将输入数据写入到输出寄存器:将RCLK引脚置高,数据就会从SR寄存器中传到输出寄存器中,然后输出到Q0-Q7引脚。
4. 重复以上操作:如需输出更多的数据,可以重复以上步骤,直到所需数据全部输出。
5. 关闭74HC595芯片:当所有数据全部输出后,将SRCLR引脚置高,将输出的数据清空,这样就可以关闭芯片。
需要注意的是,74HC595芯片的工作方式为移位输出,数据在输入时是从高位到低位依次输入的。
因此,在使用时要根据所需输出的数据位数进行相应的控制。
此外,还需要保证输入时序的正确性,以避免在输入时发生错误。
最详细的74HC595芯片使用方法介绍
![最详细的74HC595芯片使用方法介绍](https://img.taocdn.com/s3/m/442b0242e45c3b3567ec8b48.png)
最详细的74HC595芯片使用方法介绍2010-01-17 00:07:05 来源: 电子工程师论坛Arduino采用的ATmega168芯片带12个数字I/O管脚,其中每个都可以对一个数字量进行控制,从而实现类似于点亮一个发光二极管这样的功能。
在实际的工程应用里,有时我们可能会遇到需要对更多的数字量进行控制的场合,比如同时控制16个发光二极管,这时Arduino自带的数字I/O管脚就不够用了,必须进行相应的扩展。
其中一种可行的办法就是借助74HC595这样一个8位串入并出移位寄存器,这个芯片能够多个级连起来一起使用,因此理论上能够通过Arduino上有限的几个管脚(最少三个)产生任意多个的数字输出。
74HC595同数据相关的引脚可以分为三类:DS:串行数据输入,接Arduino的某个数字I/O引脚。
Q0~Q7:8位并行数据输出,可以直接控制8个LED,或者是七段数码管的8个引脚。
Q7′:级联输出端,与下一个74HC595的DS相连,实现多个芯片之间的级联。
74HC595同控制相关的引脚一共有四个:SH_CP:移位寄存器的时钟输入。
上升沿时移位寄存器中的数据依次移动一位,即Q0中的数据移到Q1中,Q1中的数据移到Q2中,依次类推;下降沿时移位寄存器中的数据保持不变。
ST_CP:存储寄存器的时钟输入。
上升沿时移位寄存器中的数据进入存储寄存器,下降沿时存储寄存器中的数据保持不变。
应用时通常将ST_CP置为低点平,移位结束后再在ST_CP端产生一个正脉冲更新显示数据。
MR:重置(RESET),低电平时将移位寄存器中的数据清零,应用时通常将它直接连高电平(VCC)。
OE:输出允许,高电平时禁止输出(高阻态)。
引脚不紧张的情况下可以用Arduino的一个引脚来控制它,这样可以很方便地产生闪烁和熄灭的效果。
实际应用时可以将它直接连低电平(GND)。
对于一个最简单的74HC595应用来讲,可以用Arduino的三个数字I/O端口分别控制DS、SH_CP和ST_CP,然后将MR和OE分别接VCC和地。
PIC单片机IO扩展
![PIC单片机IO扩展](https://img.taocdn.com/s3/m/de791b19f18583d049645952.png)
PIC系列单片机简单I/O口扩展技术摘要在实际应用当中当单片机的I/O口资源无法满足系统设计需要时,为了节省成本,常通过外部I/O扩展芯片来达到设计要求。
74系列TTL电路是一种简单实用的I/O扩展技术,介绍了74HC165和74HC595芯片的工作原理,给出了该芯片与PIC系列单片机的接口硬件电路及软件代码。
关键词单片机 I/O口扩展 TTL电路引言当单片机的I/O口资源无法满足系统设计需要时,为了节省成本,常通过外部I/O扩展芯片来达到设计要求。
通常的办法是设计之初就选用I/O口丰富的单片机来实现,但如果外围设备较多时,也只能进行外部扩展了。
另外,使用一款新的单片机,开发者还有一个熟悉、学习过程,因此这并不是最经济的办法。
常用的I/O口扩展方法有:(1)专用扩展芯片,如可编程并口扩展芯片8255,通过3个外部地址,扩展出3个并口;又如可通过串入并出、并入串出、并入并出进行I/O口扩展的GM8166芯片等。
(2)单片机I/O口扩展法,在系统中设计多个单片机,利用单片机自身I/O口资源进行扩展。
(3)TTL移位寄存器法,通过移位寄存器,来扩展无穷个输出或者输入I/O口。
(4)最简单的I/O口扩展法,如采用74373做多个锁存器进行输出扩展,采用74245做多个总线收发器进行输入扩展。
上述几种方法都有其一定的应用条件和适用范围,并不一定能分出个孰优孰劣,但从最经济角度来说,设计者往往希望能缩短开发周期、降低开发成本。
而TTL移位寄存器方法是一种简单实用的I/O扩展技术,芯片控制简单、编程容易,应用十分广泛。
本文介绍了74HC165和74HC595芯片的工作原理,给出了与PIC系列单片机的接口硬件电路及软件代码。
芯片介绍(1)8位并入/互补串出移位寄存器74HC165。
74HC165是一款高速CMOS器件,8位并行读取或串行输入移位寄存器,可在末级得到互补的串行输出(P0和P7)。
当移位/并行置入控制(/PL)输入为低时,从P0到P7口输入的并行数据将被异步地读取进寄存器内。
74HC595 74HC165程序例子(AVR)
![74HC595 74HC165程序例子(AVR)](https://img.taocdn.com/s3/m/067dcbcd05087632311212c8.png)
74HC595 74HC165程序例子(AVR)2008年03月13日星期四 10:50硬件说明:ATmega48/88/168的PB5是SPI时钟输出,接74HC595/74HC165的移位时钟输入端;PB4是SPI的MISO数据输人,接74HC165的数据输出;PB3是SPI的MOSI数据输出,接74HC595的串行数据输入端SER;PB2接74HC595/74HC165的锁存时钟输入端。
程序1:本例子是用硬件SPI接口循环发送一个变量到74HC595,并且在数据发送完毕后通过单片机的另外一个IO接口PB2输出一个“锁存”脉冲,使74HC595把移位寄存器的数据输出到锁存寄存器,并驱动8个LED输出,实现来回流水的效果。
//本程序在M8 V2.0 实验板通过// CodeWizard AVR V1.25.1// // 程序设计: CC#include#include#includevoid main(void){unsigned char data=1 , sign=1;PORTB=0;DDRB=0;PORTB|=0b00000100; //空闲时PB2=1是为了兼容74HC165,因为锁存时钟=1时74HC165才允许读数据DDRB|= 0b00101100; //PB口的2/3/5使能输出,其它口不变SPCR=80; //SPI初始化/高位先输出/空闲时时钟=0,数据=0/4分频/数据在时钟上升沿有效/主机while(1){spi(data); //输出data数据,本函数采样查询方式发送,直到数据发送完毕才运行下一条语句PORTB.2=0; PORTB.2=1; //74HC595移位寄存器的数据在锁存时钟上升沿时传送到锁存寄存器delay_ms(1000);if(data==1) sign=1; //记录顺序流水if(data==128) sign=0; //记录倒序流水if(sign) data<<=1; else data>>=1; //如果顺序流水数据就左移一位,否则数据就右移一位}}//end程序2:本程序利用硬件SPI连接74HC165采集8个按键信息,并且由75HC595驱动8个LED把按键的信息显示出来//本程序在M8 V2.0 实验板通过// CodeWizard AVR V1.25.1// // 程序设计: CC#include#include#includevoid main(void){unsigned char data=0 , x;PORTB=0;DDRB=0;PORTB|=0b00000100; //空闲时PB2=1是为了兼容74HC165,因为锁存时钟=1时74HC165才允许读数据DDRB|= 0b00101100; //PB口的2/3/5使能输出,其它口不变SPCR=80; //SPI初始化/高位先输出/空闲时时钟=0,数据=0/4分频/数据在时钟上升沿有效/主机while(1){x=spi(data); //输出data数据到74HC595,同时读取74HC165的数据,保存在变量xPORTB.2=0; PORTB.2=1; //刷新74HC595/74HC165的数据data=x;}}//end程序3:本程序把读74HC165和写74HC595分别写成一个函数,使用更方便#include#include <595-165.h>#includevoid main(void){spiinit(); //spi初始化while(1){unsigned char data,i;data=read165(); //通过硬件SPI读取74HC165的数据if(data==254) i+=1;write595(i); //通过硬件SPI把数据写入74HC595delay_ms(100);}}//end下面是头文件"595-165.h"的内容//定义一个全局变量来记忆最后一次写入74HC595的数据//目的是读74HC165时保持74HC595的数据不发生改变//变量名复杂一点目的是避免和其它变量混淆unsigned char DATA_74HC595_74HC165;void spiinit(void) //spi初始化{PORTB&=0b11000011;DDRB|= 0b00101100;SPCR=80;}void write595(unsigned char LED_DATA) //写数据到74HC595函数{SPDR=LED_DATA; //开始发送数据while((SPSR>>7)==0); //等待发送接收结束DATA_74HC595_74HC165=LED_DATA; //记忆最后一次发送的数据LED_DATA=SPDR; //读,是为了清零中断标志PORTB&=251; PORTB|=4; //PB2输出一个负脉冲,刷新74HC595的数据}unsigned char read165(void) //读74HC165函数{PORTB&=251; PORTB|=4; //PB2输出一个负脉冲,刷新74HC165的数据SPDR=DATA_74HC595_74HC165; //载入74HC595最后一次的数据,目的是读取74HC165 while((SPSR>>7)==0); //等待发送接收结束return SPDR; //返回值是SPI接收到74HC165的数据。
单片机和74HC595驱动芯片对数码管的控制设计
![单片机和74HC595驱动芯片对数码管的控制设计](https://img.taocdn.com/s3/m/1ad2fc8c360cba1aa811daf8.png)
单片机和74HC595驱动芯片对数码管的控制设计1. 数码管显示设计本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口。
74HC595部分电路图如下:与单片机相连接的三个脚分别为:HC_DAT,HC_RCK,HC_CLK。
两片595采用级联方式,即U2的第9脚接到U3的第14引脚。
2. 74HC595简介74HC595是8位的移位寄存器,串入并出,并具有锁存功能,被广泛的用于数码管、点阵的驱动电路中。
其管脚介绍如下:15:数据输出A-接数码管数据A段;1:数据输出B-接数码管数据B段;2:数据输出C-接数码管数据C段;3:数据输出D-接数码管数据D段;4:数据输出E-接数码管数据E段;5:数据输出F-接数码管数据F段;6:数据输出G-接数码管数据G段;7:数据输出H-接数码管数据H段;16:电源正脚-接电源正;8:电源负脚-接电源负;14:数据输入脚-接单片机管脚;12:数据锁存时钟-接单片机管脚;11:数据输入时钟-接单片机管脚;13:使能输出脚-低电平有效,接低电平;10:数据清零-不清零,接高电平;9:数据级联输出-接下一片595的数据输入脚;74HC595的真值表如下:知道了74HC595的引脚定义和真值表,那该如何编程呢?下面重点来了,通过时序图来编程。
看重点!!!3. 74HC595时序图我是重点!我是重点!我是重点!通过时序可以看出:SCK是上升沿的时候要把数据写入;RCK是上升沿的时候数据才能锁存显示;有数据操作的过程中RESET必须是高电平;EN必须是低电平,595才能工作;知道了以上4点就可以写程序了。
其中3、4条是硬件连接上的事情(也可以用单片机的IO口来连接,这样的话可以随时控制74HC595的工作与否情况)。
写程序主要靠1、2条。
下面具体操作。
4. 程序实例看下面一段程序:第39行:HC595_CLK(0)的原型如下:HC595_CLK(0)是让CLK处于低电平,即上升沿还没有来到;HC595_DAT(1)就是要把写入的数据准备好;temp《《1是将数据移位,即一个字节分八次写入;HC595_CLK(1)是让CLK处于高电平,即上升沿来了;以上几句解释一下就是:在CLK时钟上升沿来临之前把要写入的数据准备好,等上升沿来了就把准备好的数据写入。
51单片机:IO口扩展芯片用法(74HC165,74HC595)
![51单片机:IO口扩展芯片用法(74HC165,74HC595)](https://img.taocdn.com/s3/m/8550f4d6ab00b52acfc789eb172ded630b1c98e0.png)
51单⽚机:IO⼝扩展芯⽚⽤法(74HC165,74HC595)IO⼝扩展芯⽚,主要是解决单⽚机IO⼝太少。
74HC165:数据从并转串74HC595:数据从串转并两种芯⽚,都是通过时序电路,加上移位功能,进⾏数据传输74HC165:数据从并转串。
以下实例,实现8个独⽴按键,控制数码管的8段#include <reg52.h>#include <intrins.h>typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}#define GPIO_DIG P0sbit IN_SG = P1^6;sbit IN_DATA = P1^7;sbit IN_CLK = P3^6;u8 read_74HC165(){u8 indata;u8 i;IN_SG = 0; //先置⼊数据_nop_(); //等待⼀个机器周期IN_SG = 1; //芯⽚切⼊移位功能_nop_();indata = 0;for( i = 0; i < 8; i++ ){ //在时序电路作⽤下,移动8次,得到⼀个字节数据indata = indata << 1;IN_CLK = 0;_nop_();indata |= IN_DATA;IN_CLK = 1;}return indata;}void main (){u8 hc165_data;GPIO_DIG = 0x0;while( 1 ) {hc165_data = read_74HC165();if( hc165_data != 0xFF ) {GPIO_DIG = ~hc165_data;}}}74HC595:数据从串转并,以下程序,实现流⽔灯效果#include <reg52.h>#include <intrins.h>typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}#define GPIO_DIG P0sbit SRCLK = P3^6; //移位寄存器时钟sbit STORE_RCLK = P3^5; //存储寄存器时钟sbit SER = P3^4; //串⼝输⼊数据void hc595_send_data( u8 input_data ) {u8 i;SRCLK = 1;STORE_RCLK = 1;for( i = 0 ; i < 8; i++ ){SER = input_data >> 7; //从最⾼位开始传送 input_data <<= 1; //把次⾼位移到最⾼位SRCLK = 0; //时序脉冲_nop_();_nop_();SRCLK = 1;}STORE_RCLK = 0; //时序脉冲_nop_();_nop_();STORE_RCLK = 1; //把寄存器的数据送到输出⼝}void main (){u8 led_num;led_num = 0x01; //先让D11点亮while( 1 ) {hc595_send_data( led_num );led_num = _crol_( led_num, 1 );delay( 50000 );delay( 50000 );}}。
74HC595芯片做单片机IO扩展proteus仿真
![74HC595芯片做单片机IO扩展proteus仿真](https://img.taocdn.com/s3/m/f63397bcb90d6c85ec3ac6b5.png)
74HC595芯片做51单片机IO扩展PROTEUS仿真最近有个小活需要用到IO扩展,经搜索资料,有很多方式,比如MCP23017/MCP23S17、74HC595、8255A、74HC164、74HC138等,经对比我选择74HC595,MCP23017/MCP23S17相对功能更好些,可以做输入输出使用,74HC595只能用作输出,8255A采用并行口扩展,74HC164的缺点是没有输出寄存器,移位过程中输出端数据不稳定,且没有串行输出接口。
一、74HC595芯片介绍595移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
芯片引脚定义图:/MR(10脚): 低电平时将移位寄存器的数据清零。
通常接到VCC防止数据清零。
SH_CP(11脚):上升沿时数据寄存器的数据移位。
Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
我通常都选微秒级)ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将ST_CP置为低电平,当移位结束后,在ST_CP端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/OE(13脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
二、PROTEUS仿真按下图在PROTEUS中做好连线Keil下编写C51程序如下:#include<reg52.h>typedef unsigned char uint8_t;typedef unsigned short int uint16_t;typedef unsigned int uint32_t;sbit ST_CP = P2^7; //输出时钟sbit DS = P2^6; //串行数据输入sbit SH_CP = P2^5; //输入时钟uint16_tled_buff[]={0xfffe,0xfffd,0xffb,0xfff7,0xffef,0xffdf,0xffbf, 0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};void send_byte16(uint16_t byte16)//发送16位数据{uint8_t i=0;for(i=0;i<16;i++){if((byte16<<i)&0x8000){DS = 1;SH_CP = 0;SH_CP = 1;}else{DS = 0;SH_CP = 0;SH_CP = 1;}}ST_CP = 0;ST_CP = 1;}/*** @brief :1MS延时函数* @note :12MHz 下1MS延时 */static void drv_delay_1ms( ) {uint16_t Ms = 1;uint32_t j = 80;while( Ms-- ){while( j-- );}}/*** @brief :MS延时函数* @Ms:延时的MS数*/void drv_delay_ms( uint16_t Ms ) {while( Ms-- ){drv_delay_1ms( );}}void main(){uint8_t i=0;while(1){for(i=0;i<16;i++){send_byte16(led_buff[i]);drv_delay_ms(1000);send_byte16(0xffff);drv_delay_ms(1000);}}}程序思路:循环16次,在每次时钟ST_CP的上升沿循环串行写入数据到内部寄存器,最后在SH_CP上升沿将寄存器数据并行输出。
74HC595对单片机IO口的扩展及应用
![74HC595对单片机IO口的扩展及应用](https://img.taocdn.com/s3/m/34927b606c85ec3a86c2c514.png)
74HC595对单片机IO口的扩展及应用作者:曹少科杨晴陈海宇王硕来源:《科技风》2019年第13期摘要:74HC595是美国国家半导体公司生产的通用位移寄存器芯片,它可以实现8位串行输入输出或者并行输出,操作方便简单,可以很容易的完成对单片机IO口的扩展。
[1]本文主要是介绍用74HC595芯片来扩展IO口详细原理,并利用此方法进行实验,实现流水灯效果。
关键词:单片机;74HC595;扩展IO口;流水灯上世纪70年代到80年代期间,单片机凭借着它体积小,低功耗,性价比高的优势,被越来越多的人所使用,并被广泛运用于各个领域。
但随着科技不断地进步与发展,我們对于单片机的应用更加广泛,我们也慢慢发现了51单片机的一些缺点,即IO端口有限,很多人在运用单片机时总会出现IO口不够用的现象,而74HC595芯片刚好能弥补此缺陷,大量扩展单片机的IO口。
174HC595芯片的选择74HC595是硅结构的CMOS器件,能实现串入转并入,数据通过一个IO串口输入后经过74HC595后将数据8位并行输出。
[2]74HC595与74HC164芯片功能基本相同,但前者价格更低廉,驱动能力更强,操作简单,但因为74HC595有存储寄存器,所以在移位的过程中,并排输出端口的数据保持不变。
所以选用74HC595芯片来扩展51单片机IO口比较合适。
2扩展方案2.1硬件连接与实现原理若要以74HC595芯片实现对IO口的扩展,首先需要定义一个单片机I0口与74HC595芯片DS相连,以此来控制串行数据的输入。
而移位寄存器和存储寄存器是不同的时钟,当SH_CP处于上升沿时,数据会输入到移位寄存器中,当ST_CP处于上升沿时会传入的存储寄存器中。
因此两个时钟需要分别进行连接,移位寄存器有串行输入DS引脚、串行输出引脚Q7’和低电平复位引脚MR。
存储寄存器有并行数据输出引脚Q0~Q7和低电平输出有效OE引脚。
所以用MR进行复位时,只是将位移寄存器中的数据清除,而不必担心存储寄存器中的数据有所变化。
三分钟完全掌握利用74HC595在串行口扩充8位的并行输出接口
![三分钟完全掌握利用74HC595在串行口扩充8位的并行输出接口](https://img.taocdn.com/s3/m/f2f25e172af90242a995e532.png)
三分钟完全掌握利用74HC595在串行口扩充8位的
并行输出接口
74HC595和74LS164一样,也是串入并出的移位寄存器。
它们经常出现在单片机系统中,用来扩充并行输出接口。
看过一些资料,送往74HC595的串行信号,基本上都是用单片机并行接口的某个位,模拟SPI的时序,输出出来的。
这种方法,灵活性是它的优点,速度低是它的缺点。
如果使用51单片机的串口方式0,就可以得到更高的速度和更简练的编程方法。
在一般的单片机教材上,讲到串口方式0的时候,都给出了用164扩充并口的方法。
但是对595这个后起之秀,介绍甚少。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
74hc165接收函数支持联级
/**************************************************** 74hc165intn();//初始化
74hc165satin();//开始输入
接收单级数据:dat=inpute();//接收返回值到dat
使用数组保存多级:hc165pinsav(d)//d为接收个数,联级个数。
******************************************************/ #ifndef __74hc165_H__
#define __74hc165_H__
#include "A T89X52.h"
#include <intrins.h>
#include<stdio.h>
unsigned char hc165insav[4];//保存接收数据联极
sbit ck=P1^1;//时钟2引脚。
sbit sd=P1^0;//数据9引脚。
sbit sh=P1^2;//开始输入1引脚。
//SI联级10引脚,连接下级的9引脚。
/****************************************************
五个机器周期
******************************************************/ void nop()
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
/****************************************************
74hc165初始化
******************************************************/
void hc165intn() //初始化
{sh=1;
sd=1;
ck=1;
}
/****************************************************
74hc165开始输人
******************************************************/ void hc165satin()
{
sh=0; //起始接收脉冲开始接收。
sh=1;
}
/****************************************************
74hc165接收函数
******************************************************/ unsigned char hc165inpute() //接收扩展8位函数{unsigned char i,mm;
for(i=0;i<8;i++)
{ mm=(mm<<1)|sd;
ck=0;
nop();
ck=1; }
return mm;
}
/****************************************************
74hc数165保存
******************************************************/
hc165pinsav(unsigned char d)
{unsigned char i;
for(i=0;i<d;i++)
{hc165insav[i]=hc165inpute();
}
}
#endif
74HC595程序支持联级
/**************************************************** 74HC595intn();
单级数据发送:74HC595Write(要发送的数);
数组发送多联级数:hc595Writef(ms)//ms为发送个数。
4HC595out();开始输出
** ****************************************************/
#ifndef __74HC595_H__
#define __74HC595_H__
#include "A T89X52.h"
#include <intrins.h>
#include<stdio.h>
unsigned char hc595sen[5];//联级发送
sbit scl=P3^4;//时钟信号11号引脚
sbit scp=P3^2 ;//数据线14号引脚
sbit sda=P3^3; //锁存12号引脚
//Q'7联级9引脚,连接下级的14引脚。
/****************************************************
起始信号放开总线
******************************************************/ void hc595intn() //595发送初始化
{
scl=0;//时钟信号11号引脚
sda=1;//数据线14号引脚
scp=0; //锁存12号引脚
}
/****************************************************
五个机器周期
******************************************************/ void snop()
{_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();}
/****************************************************
74HC595开始输出
******************************************************/
void hc595out()
{
scp=0;
snop();
scp=1;
snop();
scp=0;
hc595intn();
}
/**************************************************** 74hc595发送数据8位数据发送
******************************************************/ hc595Write(unsigned char input) //发送input
{unsigned char temp;
for(temp=0;temp<8;temp++)
{sda=(bit)(input&0x80);
input=input<<1;
snop();
scl=1;
snop();
scl=0;
nop();
}
}
/**************************************************** 74hc595发送数据ms个联级ms个数据
******************************************************/ hc595Writef(unsigned char ms) //发送ms个数据
{
unsigned char temp;
for(temp=0;temp<ms;temp++)
{ hc595Write(hc595sen[temp]) ;
}
}
#endif。