51单片机开发(一)--74HC595驱动数码管
2025-09-30 来源:bilibili
(一)原理图

74HC595驱动4位数码管原理图

4位共阳极数码管内部原理图
(二)74HC595时序图

595时序图
(三)代码
3.1 config.h
#include 'REG52.H'
#include 'intrins.h'
#include 'delay.h'
#include 'stdbool.h'
//#include '74hc595.h'
/*********************************************【表情】*********************************/
// 类型定义
/******************************************************************************/
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef signed char int8;
typedef signed int int16;
typedef signed long int32;
/******************************************************************************/
// MODULE引脚配置
/******************************************************************************/
sbit SHCP = P4^2;
sbit STCP = P4^1;
sbit DS = P4^0;
sbit LED1 = P1^4;
sbit LED2 = P1^5;
sbit LED3 = P1^6;
sbit LED4 = P1^7;
3.2 驱动代码74hc595.c
#include '74hc595.h'
#include 'config.h'
/**
* @description: HC595_SendByte
* @param {unsigned int} byte
* @return {*}
*/
void HC595_SendByte(unsigned int byte)
{
uint8 i = 0;
//循环8次,发送1个字节。
//1.准备数据
//2.发送数据
//3.字节左移一个位
for (i = 0; i < 8; i++)
{
DS = (byte & 0x80) ? 1 : 0; // 准备数据,如果最高位是1,设置DS为1,否则为0
SHCP = 0;
SHCP = 1; //先等0,后等1,595接收到上升沿之后,会自动读DS口的数据
byte <<= 1; //左移1位,继续准备数据
}
}
/**
* @description: LOCK STORAGE DATA
* @return {*}
*/
void HC595_CS()
{
STCP = 0;
STCP = 1; //先等0,后等1,595接收到上升沿之后,会自动将移位寄存器数据锁存到锁存器中并输出
}
/**
* @description: SendOneByte And Lock the data
* @param {unsigned int} byte
* @return {*}
*/
void HC595_SendOneByte(unsigned int byte)
{
// DS = 0;
// SHCP = 0;
// STCP = 0;
uint8 i = 0;
HC595_SendByte(byte);
// STCP上升沿锁存
HC595_CS();
}
/**
* @description: SendMultiData
* @return {*}
*/
void HC595_SendBytes(unsigned int dat[], unsigned int len)
{
uint8 i;
// 逐个发送数组中的每个字节
for (i = 0; i < len; i++)
{
HC595_SendByte(dat[i]);
}
HC595_CS();
}
3.3驱动代码DigitalTube.c
#include '74hc595.h'
#include 'config.h'
#include 'DigitalTube.h'
uint8 Dig[] = {0xC0, 0xf9, 0xA4, 0xB0, 0x99, 0x92 , 0x82, 0xF8, 0x80, 0x90};
void Put_DigitalTube(uint8 SEG, uint8 DIG)
{
unsigned int dat[2];
dat[0] = DIG;
dat[1] = SEG;
HC595_SendBytes(&dat, 2);
}
void Clear_DigitalTube()
{
unsigned int dat[2] = {0, 0};
HC595_SendBytes(&dat, 2); // 清除数码管显示
}
void Put_DigitalFourTube(uint8 DIG1, uint8 DIG2, uint8 DIG3, uint8 DIG4)
{
Put_DigitalTube(0x01, Dig[DIG1]);//第二个数码管显示4
Delayms(1);
Put_DigitalTube(0x02, Dig[DIG2]);//第二个数码管显示4
Delayms(1);
Put_DigitalTube(0x04, Dig[DIG3]);
Delayms(1);
Put_DigitalTube(0x08, Dig[DIG4]);
Delayms(1);
}
3.4应用代码main.c
#include 'config.h'
#include 'DigitalTube.h'
void main()
{
// uint8 SEG = 0x01;
//dat[2] = {SEG,DIG};
while (1)
{
Put_DigitalFourTube(1,2,3,4);
}
}
(四)实验结果

实验结果
上一篇:一块51单片机能做出些什么东西?
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




