51单片机LED点阵实验(74HC595)
使用74HC595 点亮LED 点阵
(以普中开发板为例)
关于74HC595(串转并)
74HC595的原理图
74HC595的原理图如下所示(PS:图中二极管的方向错了)
HC595芯片的功能:串行输入,并行输出。
各个引脚的功能![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a80930b9fc1e144604ec79a5c127c69d.png)
看如何给芯片接线,并使用:(注:引脚上加一个“非横线”,表示低有效)
1、D0~D7,并行输出,接LED。
2、16号和8号引脚,分别接Vcc,Gnd。
3、OE,13号引脚,低电平才输出有效,让它接地。
4、10号引脚,主复位引脚,低有效。目前不需要复位,直接接VCC就好.
5、14号引脚SER,接在集成板的P3^4,为串行输入端。
6、11号引脚SRCLK,接在集成板的P3^6;上升沿时,将串行口RCLK的一位,移位输入。
7、12号引脚RCLK,接在集成板的P3^5;上升沿时,将移入的8位数据,送到存储寄存器。
高位注释:SDI先发送高位,在发送低位,高位发送到对应的Q管脚的相应位置,每一次的发送为伴随着一个上升沿。
上面的只是使用方法,如果还想继续深究,可以查看数电当中的串并行输入输出。
关于点阵
点阵的实际原理图
(列的标号从上到下依次为为1-7,行的标号从左到右依次为a-h)
8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线
的交叉点上,当对应的某一行置 1 电平,某一列置 0 电平,则相应的二极管就亮;
如要将第一个点点亮,则 1 脚接高电平 a 脚接低电平,则第一个点就亮了;如果
要将第一行点亮,则第 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些
引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第 a 脚接低电平,
而(1、2、3、4、5、6、7、8)接高电平,那么第一列就会点亮。
代码
#include <reg51.h> //此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//--定义使用的IO口--//
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit LED=P0^7;
/* 函 数 名 : Hc595SendByte(u8 dat1,u8 dat2)
* 函数功能 : 通过595发送2个字节的数据
* 输 入 : dat1:第2个595输出数值
* * dat2: 第1个595输出数值
* 输 出 : 无
**************************/
void Hc595SendByte(u8 dat) // 调用函数SendByte
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送8位数
{
SER = dat >> 7; //从最高位开始发送
dat <<= 1;
SRCLK = 0; //发送时序
_nop_(); //调用nop函数,进行一个机器周期的延时
_nop_(); // 延时两个机器周期
SRCLK = 0; //初始化SRCLK,重回低电平,为下一个上升沿输入做准备
}
RCLK = 0; //RCLK从0到1,上升沿到达,输出前面接收的段码数据
_nop_();
_nop_();
RCLK = 1; //初始化RCLK,重回低电平,为下一个上升沿输出做准备
}
void main()
{
Hc595SendByte(0x01); // 0000 0001
P0= 0X7F ; // 0111 1111
while(1) ;
}
实物展示略
用点阵显示爱心
代码:
(实现的是空心的爱心,代码来自网络)
#include "reg51.h" //注意这里使用“reg52.h"可能会出现重复定义错误,因为52.h中已定义过RCLK
#include<intrins.h>
typedef unsigned