单片机io扩展74hc165和74hc595程序
74HC165连级使用方法及程序实例

{ 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驱动数码管程序这里是电路图:完整的源码和图纸下载地址: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口的扩展原理与应用

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实现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口扩展

是并行数据输出口,即储寄存器的数据输出口
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在单片机上的应用及程序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 操作方法
74HC595是一种移位寄存器芯片,主要用于扩展输出IO。
以下为74HC595的操作方法:
1. 初始化74HC595芯片:将MR引脚置高,然后将SRCLR引脚置低。
这样可以清空芯片内部的数据,并准备开始向芯片输出数据。
2. 向74HC595芯片输入数据:先将SER引脚置低,然后依次将需要输出的数据位写入到SRCLK引脚上。
当每一位数据都写入完成后,将SRCLK引脚置低。
3. 将输入数据写入到输出寄存器:将RCLK引脚置高,数据就会从SR寄存器中传到输出寄存器中,然后输出到Q0-Q7引脚。
4. 重复以上操作:如需输出更多的数据,可以重复以上步骤,直到所需数据全部输出。
5. 关闭74HC595芯片:当所有数据全部输出后,将SRCLR引脚置高,将输出的数据清空,这样就可以关闭芯片。
需要注意的是,74HC595芯片的工作方式为移位输出,数据在输入时是从高位到低位依次输入的。
因此,在使用时要根据所需输出的数据位数进行相应的控制。
此外,还需要保证输入时序的正确性,以避免在输入时发生错误。
最详细的74HC595芯片使用方法介绍

最详细的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和地。
- 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。