51单片机LED点阵实验(74HC595)

实验目的:用8*8的LED点阵显示一颗爱心。

实验仪器:普中开发板(非广告)

实验背景:出于一些原因,最近在看Arduino,但仍觉得51好玩。遂,一边看Arduino,一边整理51。


8*8的LED点阵电路如图一所示,有两种方式。单片机上集成的电路方式为第二种。

其中,行由P0口控制,列由D7~D0(HC595芯片控制,见下方)控制。

图一

首先考虑,如何先点亮一个灯?

eg:让P0^7的端口为低电平,P0的其他端口为高电平;D7的端口为高电平,则第一行第一列的led被点亮。

同样的方式也可以,让其他单独的led点亮。

接着考虑,如何控制多个led的点亮?

类似与数码管的动态显示,利用余晖来进行动态显示。

第一步:P0口先选通某一列,D7~D0控制这一列中哪些灯亮。

第二步:动态显示每一列。

为了减少单片机引脚的使用,这里使用了74HC595芯片。(注:图二中led的方向反了)。

图二
图三
图四

这图是丑的没法看了。但为了叙述清楚,目前也只能这样了。74HC595芯片详细的内容可以网上找,也可以直接评论区留言。

HC595芯片的功能:串行输入,并行输出。

看如何给芯片接线,并使用:(注:引脚上加一个“非横线”,表示低有效)

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位数据,送到存储寄存器。

上面的只是使用方法,如果还想继续深究,可以查看数电当中的串并行输入输出。

代码:

#include<reg51.h>
#include<intrins.h>

typedef unsigned char uchar;

sbit SER=P3^4;//14号引脚,串行数据输入
sbit SRCLK=P3^6;//11号引脚,移位寄存器时钟输入
sbit RCLK=P3^5;//12号引脚,存储寄存器时钟输入

uchar code lie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//p0^7~p0^0,单片机中,p0^7是高位
uchar code hang[]={0x00,0x38,0x3c,0x1e,0x1e,0x3c,0x38,0x00};//D7~D0


void Hc595SendByte(uchar dat)
{
	int i; //编译可能有点老,变量的定义必须放在块的开头
	SRCLK=0;//初始化
	RCLK=0;	
	for(i=0;i<8;i++)//从高位到低位,依次串行输入
	{
		SER=dat>>7;
		dat<<=1;
		SRCLK=1;//上升沿,将数据串行输入
		_nop_();//一个机器周期
		_nop_();
		SRCLK=0;
	}
	RCLK=1;//上升沿,将数据送入存储寄存器
	_nop_();//一个机器周期
	_nop_();
	RCLK=0;
}

void delay(int i)
{
	while(i--);	
}

void main(void)
{
	int i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			P0=lie[i];//选通列
			Hc595SendByte(hang[i]);//送入行
			delay(100);
			//Hc595SendByte(0x00);//消隐
			P0=0xff;//消隐
		}
	}
}

补充:

1、不是只有整数才分有符号数和无符号数。char,字符型也有,我感觉挺奇怪的,哈哈。  unsigned char

2、我第一次写这个程序的头文件是#include<reg52.h>,但是总是报错,提示RCLK重定义。我仔细检查程序并没有发现重定义的地方。后来参看例程序,将头文件改成#include<reg51.h>,程序顺利通过。看来52的头文件中应该定义过该变量。就像P0一样。头文件reg51.h与reg52.h的区别

3、按照C语言的标准,变量的定义必须放在块的开头。比如我将主函数中的int i放在for之前写,程序会报错。

这个标准已近很老了,现在C99标准中,变量定义的位置比较随意了,只要使用之前定义就好了。(当然单单这么说不严谨,详细的可以去网上看看)

4、今天win10刚装的Kail,端口和win7的有些不同。成功解决win10下单片机开发板驱动识别问题

5、当然还有最后的结果

图五

用手机拍摄,还是能看到余晖,肉眼的效果还是很好的。

拓展:这里每次显示的都是爱心,所以整体是一个静态爱心的形状。

           当如果动态显示的分别是I LOVE DOG,想来也是很好看。但是估计得16*16的尺寸。

苟日新,日日新。

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/84638551