51单片机I-O扩展1

目录

1.实现功能介绍

用74HC595实现8*8点阵屏流水灯

2.74HC595介绍

11 引脚串行输入端

14 引脚输入数据

12 引脚并行输出端

10 引脚复位端,一般接高电平

13 引脚输出使能端,低电平有效

15,1-7 引脚输出端

9 引脚用来级联下一个595到14号引脚端

3.595的工作原理(串行输入,并行输出)

例如将1011 0000 1101 0011输入进去具体操作流程如下

从左往右开始

第一次给14号引脚一个高电平,11号引脚给一个上升沿,此时第一个级联595的7号引脚Q7内部存储的是1

第二次给14号引脚一个低电平,11号引脚给一个上升沿,此时第一个级联595的6号引脚Q6内部存储的是0

第三次给14号引脚一个高电平,11号引脚给一个上升沿,此时第一个级联595的5号引脚Q5内部存储的是1

第四次给14号引脚一个高电平,11号引脚给一个上升沿,此时第一个级联595的4号引脚Q4内部存储的是1

第五次给14号引脚一个低电平,11号引脚给一个上升沿,此时第一个级联595的3号引脚Q3内部存储的是0

第六次给14号引脚一个低电平,11号引脚给一个上升沿,此时第一个级联595的2号引脚Q2内部存储的是0

第七次给14号引脚一个低电平,11号引脚给一个上升沿,此时第一个级联595的1号引脚Q1内部存储的是0

第八次给14号引脚一个低电平,11号引脚给一个上升沿,此时第一个级联595的15号引脚Q0内部存储的是0

此时第一个595从Q7-Q0内部已经存储的是 1011 0000

第九次给14号引脚一个高电平,11号引脚给一个上升沿,此时第二个级联595的15号引脚Q0内部存储的是1,第一个595的15号引脚Q0内部存储的是1

由于原本已经将第一个八位数字存储到第一个595中,此时开始存储第二个八位数字时候,此时送入一个数字1,那么原本存储在第一个595中Q7-Q0是1011 0000往后位移一位.

第二个595的Q0-------->1

第一个595的Q7-------->0

第一个595的Q6-------->1

第一个595的Q5-------->1

第一个595的Q4-------->0

第一个595的Q3-------->0

第一个595的Q2-------->0

第一个595的Q1-------->0
第一个595的Q0存储的是第九次输入的1

最终会经过16次输入,从第9次开始,每次通过14号引脚输入一个数字,11号引脚给一个上升沿,原本存储在Q0-Q7会往后挪一位。

Q7->Q0(第二个595),Q6->Q7,Q5->Q6,Q4->Q5,Q3->Q4,Q2->Q3,Q1->Q2,Q0->Q1,新数字->Q0

最终16次输入完成后,在12号引脚给一个上升沿,存储的16个数字最终全部输出出来

第二个595从Q7-Q0分别是 1011 0000

第一个595从Q7-Q0分别是 1101 0011
总结

每次输入通过595的14号引脚,每次输入一个数字,每次通过11引脚给一个上升沿,存储在Q0-Q7内部,存储顺序从Q7开始,一直到Q0,所以说这个芯片是串行输入

当Q0-Q7八位内部存储完成,通过12引脚给一个上升沿,一次性将存储在内部的8位一次性全部输出到引脚接口上,输出出来,所以就是并行输出。

4.代码

c 复制代码
#include <reg51.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit DS = P3^4; 
sbit SH_CP = P3^6; 	  //输入时钟脉冲
sbit ST_CP = P3^5; 	  //输出

#define LEDDZ_COL_POST P0 

u8 ghc595_buf[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

void delay_50us(u16 us) {
	while(us--);
}

void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);
}
void hc595_write_data(u8 dat) {
	u8 i = 0;
	for (i = 0; i < 8; i++) {
		DS = dat >> 7;
		dat <<= 1;
		SH_CP = 0;
		delay_50us(1);
		SH_CP = 1;
		delay_50us(1);
	}
	ST_CP = 0;
	delay_50us(1);
	ST_CP = 1;
}
void main() {
	u8 i = 0;
	LEDDZ_COL_POST = 0;

	while(1) {
		for (i = 0; i < 8; i++) {
			hc595_write_data(ghc595_buf[i]);
			delay_ms(500);
		} 
			
			
	}		   
}

5.原理图

相关推荐
智者知已应修善业36 分钟前
【51单片机单按键切换广告屏】2023-5-17
c++·经验分享·笔记·算法·51单片机
hhh3u3u3u1 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
泛凡(Linyongui)1 小时前
PY32F002B实践之二--宠物腹背理疗仪项目介绍及头文件解析
c语言·keil·py32·32位单片机·腹背理疗仪项目实践
VBsemi-专注于MOSFET研发定制2 小时前
奶茶制作机器人功率MOSFET选型方案——高效、精准与可靠驱动系统设计指南
单片机·嵌入式硬件
网域小星球3 小时前
C 语言从 0 入门(十四)|文件操作:读写文本、保存数据持久化
c语言·开发语言·文件操作·fopen·fprintf
水云桐程序员3 小时前
单片机项目从入门到精通
单片机·嵌入式硬件
网域小星球3 小时前
C 语言从 0 入门(七)|字符数组与字符串完整精讲|VS2022 高质量实战
c语言·开发语言·字符串·vs2022·字符数组
Jia ming3 小时前
C语言实现日期天数计算
c语言·开发语言·算法
Wave8453 小时前
STM32 裸机中断与 FreeRTOS 中断管理的四大核心差异
单片机·嵌入式硬件
若忘即安4 小时前
【硬件电路设计18】WIFI+BlueTooth
单片机·嵌入式硬件