本次实践是用51单片机最小系统为核心,并使用4块8×8LED点阵组成的16×16LED点阵、2块74HC595位移寄存器芯片作为16×16LED点阵的行驱动、2块74HC138译码器芯片作为16×16LED点阵的列驱动、和8个独立按键组成的51单片机系统,实现汉字在LED点阵屏幕上进行多种功能的显示:实现静态显示、动态显示包括向上移动、向下移动、向左移动、向右移动、移动显示暂停与继续、移动加速和减速的功能。
51单片机、74HC595芯片、74HC138芯片、独立按键、LED点阵屏幕、程序下载器等。
编写51单片机代码的软件:Keil uVision4、绘制原理图与PCB的软件:立创EDA、进行仿真的软件:Proteus 8 Professional。
原理图包括了51单片机、晶振电路、复位电路、USB电源接口电路、74HC595寄存器串口转并口芯片电路、74HC138译码器芯片电路、4个8×8LED点阵组成的16×16点阵汉字显示电路和独立按键电路组成。绘制的原理图如图2.1到图2.5所示。
图2.1:51单片机、晶振电路和复位电路组成51单片机最小系统
51单片机为整个系统的核心,控制着595芯片与138芯片驱动LED点阵汉字显示等功能。晶振电路为51单片机LED点阵汉字显示系统提供时钟信号。
图2.2:独立按键与USB电源接口电路
USB电源接口电路为系统提供电源,独立按键电路实现LED点阵汉字显示的模式切换功能。其具体功能是按键key1~key4分别控制LED点阵显示汉字的向上移动、向下移动、向左移动、向右移动。按键key5控制LED点阵显示汉字的暂停移动与继续移动。Key7、key8分别控制LED点阵屏显示汉字移动的速度。
图2.3:两块595芯片电路
74HC595寄存器串口转并口芯片电路驱动16×16点阵屏的行选,当其输出端口为高电平时,对应的LED点阵的行被选中。即LED点阵的行为高电平有效。
图2.4:两块138芯片电路
74HC138译码器芯片电路驱动16×16点阵屏的列选,当其输出端口低电平时,对应LED点阵的列被选中。即LED点阵的列为低电平有效。
图2.5:16×16LED点阵电路
16×16点阵是由四块8×8点阵电路组成的,16×16点阵汉字显示电路可以实现汉字的静态显示效果以及向上、向下、向左和向右动态滚动显示的效果。
根据绘制的原理图,先将其转换成PCB图,然后对其各个元器件进行合理的布局,然后用软件自动布线的功能进行布线操作。绘制的印制板图如图2.6所示
图2.6:51单片机LED点阵汉字显示系统PCB图
图2.7:程序的基本框架流程图
程序的基本框架是从主函数开始的,先进行相关变量的初始化操作,然后进行定时中断初始化的操作,打开51单片机的定时器对LED点阵屏显示汉字的滚动进行速度的控制。相关变量初始化操作后,进入while(1)循环里面,根据变量modeSelect的值进行显示模式的选择。最后,在循环的最后调用按键处理的函数keyProcess()判断是否有按键按下,如果有按键按键更新modeSelect变量的值,进行LED点阵汉字显示模式是更新。
图2.8:按键处理流程图
按键处理采用if语句判断方式,判断是否有按键按键。当有按键按下时,会进行相关变量值的设置。例如当按键key1按下时,进行如下变量的设置
TR0 = 1; // 定时器开
modeSelect = 1; // 显示模式变量
speed = 10; // 汉字移动速度变量
moveBitNum = 0;
net = zong1; // 上下移动相关控制变量
以上是按键key1按下时对应的相关变量值的设定,其它按键的相关变量值的设置见附录: 完整代码处。
图3.1:51单片机LED点阵汉字显示系统实物图
1、用keil4软件建立ledData.h头文件,用汉字获取软件获取点阵汉字的字符数据,将其写到ledData.h头文件中。在ledData.h头文件中定义控制138译码器哪个输出管脚有效,如下代码所示
/*
38译码器的输出端口的选择
*/
uchar code columnSlect[] = // 行选
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
};
2、然后建立一个main.h头文件,在main.h头文件中,定义51单片机驱动芯片的管脚如下所示
sbit ds = P1^0; // 数据端口
sbit shcp = P1^2; // 数据输入时钟线
sbit stcp = P1^1; // 输出存储器锁存时钟线
sbit key1 = P3^4; // 向上移动控制按钮
sbit key2 = P3^5; // 向下移动控制按钮
sbit key3 = P3^6; // 向左移动控制按钮
sbit key4 = P3^7; // 向右移动控制按钮
sbit key5 = P3^3; // 静态显示显示的控制按钮
sbit key6 = P3^2; // 闪烁显示的控制按钮
sbit key7 = P1^6; // 控制汉字移动速度增加的控制按钮
sbit key8 = P1^7; // 控制汉字移动速度减小的控制按钮
然后定义一些变量如下所示
uchar speed = 30; // 汉字移动速度控制的标志
uchar alt;
uint net, index;
uint zong, zong1;
uchar modeSelect; // 汉字显示的模式方式选择
uchar buff[4];
uchar moveBitNum;
uchar moveBitNumTemp;
uchar IncNum; // 上下左右移动的相关控制变量
其中主要的变量modeSelect控制汉字在LED点阵屏上显示模式方式的选择。
在声明一些函数,实现相关的功能,如下所示
void timerInit(); // 定时器初始化函数
void writedata(uchar); // 向595芯片写入数据函数
void clearScreen(); // led点阵显示与清屏
void keyProcess(); // 按键处理的函数
void delay(uint); // 延时函数
timerInit();要实现的是51单片机定时器初始操作,将51单片机的定时器打开,产生定时控制汉字在LED点阵屏上移动的速度;writedata(uchar);是将ledData.h头文件中定义的有关汉字字符数据写入595芯片中,使其控制LED点阵的哪一些行为有效。clearScreen();实现LED点阵清屏以及将595寄存器中的数据从并口输出以控制LED的显示。keyProcess();是实现按键处理的相关操作,按键按下时,对相应的变量进行赋值操作,从而控制LED点阵屏上汉字显示的方式。
3、建立一个main.c源文件编写主函数,以及编写main.h头文件中声明函数的定义,实现相应函数的具体功能。具体详细的代码在附录中。
4、用keil4软件编好程序以后,进行编译生产.hex文件。51单片机LED点阵汉字显示程序编译信息如图3.2所示
图3.2:程序编译的结果
从编译的结果可以看出,程序是零错误, 领警告。然后对程序编译生产的.hex文件在Proteus软件中进行仿真,仿真的结果如图3.3、3.4所示
图3.3:程序开始仿真结果
图3.4:按下按键一的仿真结果:向上移动
从仿真的结果来看,编写的程序符合51单片机LED点阵汉字显示设计功能的要求,及系统实现了LED点阵系统的静态显示,动态显示:向上下移动、左右移动、闪烁显示和移动的速度控制。
用keil4软件将写好的程序进行编译生产.hex文件,将其通过下载器下载程序于单片机中。写入程序的51单片机初始状态是处于静态显示的状态,即显示第一个汉字:“电”。然后分别通过按键key1~key4的按下,分别实现LED点阵屏显示汉字的向上移动、向下移动、向左移动,向右移动。按下按键key5实现LED点阵屏上移动的汉字变为静止,当再按一下时,静止的汉字字符变为移动的汉字字符。按下按键key6实现LED点阵屏闪烁显示汉字字符的功能。按下key7、key8分别实现汉字移动速度的增加与减少。单片机按下RST复位按键时,使51单片机运行于显示静态汉字字符的初始状态。
从硬件的运行结果来看,由51单片机、16×16LED点阵屏、独立按键、595芯片、138芯片组成的单片机点阵汉字显示系统基本上实现了实践中所要求的功能:从软件获取相应的点阵显示汉字的相关信息;实现了51单片机与LED点阵屏的驱动功能;通过kei4软件编写LED点阵汉字显示的程序实现了汉字在LED点阵屏上向上移动、向下移动、向左移动、向右移动以及具有特效的闪烁显示等功能。