C51_74HC595串口转并口

文章目录

  • 一、74HC595
    • [   1、芯片引脚](#   1、芯片引脚)
    • [   2、内部框图](#   2、内部框图)
    • [   3、时序操作](#   3、时序操作)
  • 二、单芯片工模式
    • [   1、原理图](#   1、原理图)
    • [   2、驱动代码](#   2、驱动代码)
      • [     1)、74hc595.h](#     1)、74hc595.h)
      • [     2)、74hc595.c](#     2)、74hc595.c)
      • [     3)、mian.c](#     3)、mian.c)
  • 三、级联工作模式
    • [   1、原理图](#   1、原理图)
    • [   2、驱动代码](#   2、驱动代码)
      • [     1)、main.c](#     1)、main.c)

一、74HC595

74HC595 是一个8位串行输入、并行输出的位移缓存器,其中并行输出为三态输出(即高电平、低电平和高阻抗)。

1、芯片引脚

2、内部框图

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。

移位寄存器和存储器是单独的时钟。

3、时序操作

工作时序由串行数据(DS)、移位时钟(SHCP)、存储时钟(STCP) 三个核心信号控制,部分型号还支持输出使能(OE) 和清零(MR) 信号。

74HC595 的时序分为 移位阶段 和 锁存阶段:

移位阶段:

数据DS在移位时钟SHCP的上升沿输入,在SHCP的上升沿进入到存储器中,(高位D7先入,低位D0后入)。

锁存阶段:

当 8 位数据全部移入后,一个 ST_CP 上升沿会将移位寄存器的数据锁存到输出寄存器,驱动并行引脚输出。

输出使能(OE):低电平有效,需在锁存前拉低,否则输出为高阻态;若保持低电平,锁存后数据会立即输出。

异步清零(MR):低电平有效,无需时钟触发,拉低时直接清空移位寄存器;正常工作时需接高电平或通过上拉电阻固定。

二、单芯片工模式

1、原理图

2、驱动代码

1)、74hc595.h

c 复制代码
			#ifndef _74HC585_H_
			#define _74HC585_H_
			
			#include<reg52.h>
			#include<intrins.h>
			
			
			// 引脚定义(可根据实际硬件修改)
			sbit HC595_DS    = P3^4;  // 串行数据输入
			sbit HC595_SH_CP = P3^6;  // 移位时钟
			sbit HC595_ST_CP = P3^5;  // 锁存时钟
			
			
			// 延时函数(简单延时,可根据主频调整)
			void HC595_Delay(unsigned int t);
			
			/**
			 * @brief 向74HC595发送一个字节数据(高位先行)
			 * @param dat 要发送的8位数据
			 */
			void HC595_Send_Byte(unsigned char dat);
			
			/**
			 * @brief 锁存数据到输出寄存器(并行输出)
			 */
			void HC595_Latch(void);
			
			/**
			 * @brief 发送多个字节数据(级联74HC595时使用)
			 * @param pdat 数据数组指针
			 * @param len  数据长度(级联个数)
			 */
			void HC595_Send_Multi_Byte(unsigned char *pdat, unsigned char len);
			
			/**
			 * @brief 清空74HC595输出(输出全0)
			 */
			void HC595_Clear(void);
			
			
			#endif

2)、74hc595.c

c 复制代码
			#include<74hc595.h>
			
			
			// 延时函数(简单延时,可根据主频调整)
			void HC595_Delay(unsigned int t)
			{
			    unsigned int i, j;
			    for(i = t; i > 0; i--)
			        for(j = 110; j > 0; j--);
			}
			
			/**
			 * @brief 向74HC595发送一个字节数据(高位先行)
			 * @param dat 要发送的8位数据
			 */
			void HC595_Send_Byte(unsigned char dat)
			{
			    unsigned char i;
			    HC595_SH_CP = 0;  // 移位时钟初始低电平
			    for(i = 0; i < 8; i++)  // 逐位发送8位数据
			    {
			        HC595_DS = dat & 0x80;  // 取最高位
			        dat <<= 1;              // 左移一位,准备下一位
			        
			        // 移位时钟上升沿,将DS数据移入移位寄存器
			        HC595_SH_CP = 1;
			        _nop_();  // 空操作,保证时钟宽度
			        HC595_SH_CP = 0;
			    }
			}
			
			/**
			 * @brief 锁存数据到输出寄存器(并行输出)
			 */
			void HC595_Latch(void)
			{
			    HC595_ST_CP = 1;
			    _nop_();  // 保证锁存时钟宽度
			    HC595_ST_CP = 0;
			}
			
			/**
			 * @brief 发送多个字节数据(级联74HC595时使用)
			 * @param pdat 数据数组指针
			 * @param len  数据长度(级联个数)
			 */
			void HC595_Send_Multi_Byte(unsigned char *pdat, unsigned char len)
			{
			    unsigned char i;
			    // 从最后一个芯片开始发送(级联时高位在前)
			    for(i = len; i > 0; i--)
			    {
			        HC595_Send_Byte(pdat[i-1]);
			    }
			    HC595_Latch();  // 所有数据移位完成后统一锁存
			}
			
			/**
			 * @brief 清空74HC595输出(输出全0)
			 */
			void HC595_Clear(void)
			{
			    HC595_Send_Byte(0x00);
			    HC595_Latch();
			}

3)、mian.c

c 复制代码
			#include<reg52.h>
			#include "74hc595.h"
			
			void main()
			{        
			        unsigned char test_dat = 0x01;
			
			        HC595_Clear();  // 初始化为全0
			        while(1)
			        {                
			                HC595_Send_Byte(test_dat);  // 发送数据
			                HC595_Latch();              // 锁存输出
			                HC595_Delay(500);           // 延时
			                test_dat <<= 1;             // 左移一位,流水灯效果
			                if(test_dat == 0)
			                        test_dat = 0x01;        // 复位,重新开始                                                        
			        }                
			}

三、级联工作模式

1、原理图

2、驱动代码

1)、main.c

c 复制代码
			#include<reg52.h>
			#include "74hc595.h"			
			
			void main()
			{        
			        unsigned char test_dat[2]  = {0xAA,0x55};  // 低8位0x55,高8位0xAA		
			
			        HC595_Clear();  // 初始化为全0
			        HC595_Send_Multi_Byte(test_dat, 2);  // 发送2字节,自动锁存
			        HC595_Latch();              // 锁存输出     
			        while(1)
			        {                
                                               
			        }                
			}
相关推荐
焦糖码奇朵、39 分钟前
课设:基于Arduino的无线LED开关控制系统
嵌入式硬件·物联网·arduino·信息与通信·信号处理
z20348315201 小时前
定时器练习报告
单片机·嵌入式硬件
zk001 小时前
内容分类目录
单片机·嵌入式硬件
安生生申2 小时前
STM32 ESP8266连接ONENET
c语言·stm32·单片机·嵌入式硬件·esp8266
广药门徒2 小时前
电子器件烧毁的底层逻辑与避坑指南
单片机·嵌入式硬件
我先去打把游戏先6 小时前
TCP、TLS、HTTP、HTTPS、MQTT、MQTTS几种网络协议的对比与解释
嵌入式硬件·mcu·物联网·网络协议·tcp/ip·http·aws
IT方大同6 小时前
实时时钟RTC
嵌入式硬件·实时音视频
点灯小铭6 小时前
基于单片机的社区医院小型高压蒸汽灭菌自动控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
youcans_6 小时前
【动手学STM32G4】(3)STM32G431之定时器
stm32·单片机·嵌入式硬件·定时器
悠哉悠哉愿意7 小时前
【嵌入式学习笔记】AD/DA
笔记·单片机·嵌入式硬件·学习