实验目的:用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
#include
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
3、按照C语言的标准,变量的定义必须放在块的开头。比如我将主函数中的int i放在for之前写,程序会报错。
这个标准已近很老了,现在C99标准中,变量定义的位置比较随意了,只要使用之前定义就好了。(当然单单这么说不严谨,详细的可以去网上看看)
4、今天win10刚装的Kail,端口和win7的有些不同。成功解决win10下单片机开发板驱动识别问题
5、当然还有最后的结果
用手机拍摄,还是能看到余晖,肉眼的效果还是很好的。
拓展:这里每次显示的都是爱心,所以整体是一个静态爱心的形状。
当如果动态显示的分别是I LOVE DOG,想来也是很好看。但是估计得16*16的尺寸。
苟日新,日日新。