您的当前位置:首页正文

基于AT89C51 按键控制点阵显示

2020-11-05 来源:钮旅网
基于AT89C51的点阵显示的设计

1.1 项目概述

当今社会是一个信息比较发达的时代,点阵的显示屏到处可见,如电梯、公交车、广告牌等等。为此让大家进一步认识点阵的具体显示原理让大家对其有更深入的了解。 1.2 项目要求

用AT89C51单片机控制点阵的显示效果,晶振采用12MHz。简易模拟电梯的上下显示,以及汉字的简单变换。

(1) 用点阵显示屏显示汉字 (2) 按键控制字的流动

(3) 用74HC154 74HC959连接点阵显示屏 1.3 系统设计

点阵显示屏主要用来显示信息。用四个八乘八的点阵显示组合而成的。 1.3.1框图设计

1

电源电路 复位电路 AT89C51 单片机

1.3.2 知识点

晶振电路 74HC芯片 点阵显示屏 按键 本项目用到一下知识

1、 单片机复位电路工作原理及设计。 2、 单片机晶振电路工作原理及设计。 3、 按键的设计。 4、 点阵的显示。

2

5、 AT89C51的引脚。

6、 单片机c语言及程序设计。 1.4 硬件设计

本项目用AT89C51单片机的P1、P3传输信息,用P2口按键相连分别显示不同的效果。 1.4.1

3

1.4.2 元器件清单 名称 单片机 数量 1个 名称 电阻 8*8点阵 按键 显示驱动 数量 1个 4个 4个 晶振12MHz 1个 电容 电解电容

1.5 软件设计 1.5.1 程序流程图

2个 1个 该程序分为几个部分编写,一个是单片机的主程序,作用是是完成相应的功能,其他的为单个功能的子程序,流程图如下。

4

Y 按键按下 N 初始化 开始

主程序里包括了延时、显示、和按键判断。

5

输出相应的数据 扫描数据 显示数据 结束 按下不同的按键显示不同的效果。 1.5.2 程序清单

#include

#define uchar unsigned char #define uint unsigned int #define blkn 2

sbit EN74154 = P1^7; // 74154片选线

sbit ST_CP74595 = P1^6; // 74595内部输出(从移位寄存器到输出锁存器)控制

sbit CLEAR74595 = P1^5; // 74595移位寄存器清零

sbit Key1 = P2^0; sbit Key2 = P2^1; sbit Key3 = P2^2; sbit Key4 = P2^3;

uchar data dispram[32]; // 显示数据缓冲数组 uchar count;

6

//顺向 逐列取模 uchar code SJM[][32]={

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,

0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*\"1\",1*/

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,

0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*\"2\"

7

,1*/

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,

0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},/*\"3\",1*/

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,

0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00},/*\"4\"

8

,1*/

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,

0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00},/*\"5\",1*/

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,

0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00},/*\"6\",1*/

9

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,

0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},/*\"7\",1*/

{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,

0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*\"0\0*/

0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,

0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},/*\"8\",1*/

10

};

//延时函数

void delay( unsigned int dt ) {

register uchar bt; for( ; dt; dt-- )

for ( bt=0; bt<250; bt++ ) ; }

//向上移动函数 void

Up_Removeout_Word(uchar

LRheard,uchar number) {

register uchar i,j,k,l; for(i=0;ifor(j=0;j<2;j++)

11

*LRp,uchar

for(k=0;k<8;k++) {

for(l=0;l<16;l++) {

dispram[l*2]=dispram[l*2]<<1|dispram[l*2+1]>>7;//通过左移或上右移 把下一行给上一行

dispram[l*2+1]=dispram[l*2+1]<<1|LRp[(i+LRheard)*32+l*2+j]>>(7-k);//确定移几个数 }

delay(100); }

delay(100); } }

//向下移动函数 void

Down_Removeout_Word(uchar

*RRp,uchar

RRheard,uchar number)

12

{

register uchar i,j,k,l; for(i=0;ifor(j=2;j>0;j--) for(k=0;k<8;k++) {

for(l=0;l<16;l++) {

dispram[l*2+1]=dispram[l*2+1]>>1|dispram[l*2]<<7;//上半部分向上移一格

dispram[l*2]=dispram[l*2]>>1|RRp[(RRheard-i)*32+l*2+j-1]<<(7-k); }

delay(100); }

delay(100); }

13

}

void main( void ) {

uchar i;

SCON=0x00; // 串行口以方式0工作,用作同步移位寄存器,波特率为fosc/12,禁止接收

TMOD=0x11; // 定时器T0以方式1工作,由TR0控制启停

TH0 = 0xF8; // 计数初值,定时2ms TL0 = 0x30; EA=1; ET0=1;

//IE=0x82; // 允许T0申请中断 TR0=1; // 启动定时器T0

14

P1=0x3F; // EN74154=0,ST_CP74595=0,CLEAR74595=1

for(i=0;i<32;i++) {

dispram[i]=SJM[3][i];

} while(1) {

while(!Key1)

{

Up_Removeout_Word(SJM,4,4);

15

}

while(!Key2) {

Down_Removeout_Word(SJM,6,7); }

} }

/**********************************************************************

函数名称:TIME0( void ) interrupt 1 using 1 函数功能:T0中断服务函数

**********************************************

16

************************/

void TIME0( void ) interrupt 1 using 1 {

register unsigned char j=blkn; TH0 = 0xF8; // 重装计数初值 TL0 = 0x30; P1=count|0x20; do{ j--;

SBUF = dispram[ count*blkn+j ]; // 开始发送数据

while( !TI ) ; // 等待发送结束 TI = 0; // 清发送中断标志位 }while( j );

EN74154 = 1; // 禁止行数据输出 ST_CP74595 = 1; // 允许列数据输出 ST_CP74595 = 0; // 禁止列数据输出 EN74154 = 0; // 允许行数据输出 count++;

17

if(count>15) count=0; }

1.6 系统仿真及调试

单片机系统的硬件调试和软件是分不开的,许多硬件错误是在软件调试中被发现和纠正的。但是通常是先排除明显的硬件故障以后,再和软件结合起来调试以进一步排除故障。可见硬件的调试时基础,如果硬件调试不通过,软件调试则是无从做起。

硬件调试主要是把电路的各种参数调整到符合设计要求。先排除硬件电路故障,包括设计性错误和工艺性故障。一般原则是先静态,后动态。硬件静态调试主要是检测电路是否有短路、断路、虚焊等,检测芯片引脚焊接是否有错位,数码段位是否焊接正确。

利用万用表或者逻辑测试仪器,检测电路中的各器件以及用脚连接是否正确,是否短路故障。

在通电前,一定要先检查电源电压的幅值和极性,否则很容易造成集成块的损坏。

18

因篇幅问题不能全部显示,请点此查看更多更全内容