中国矿业大学信电学院电子技术综合设计姓名:xx 学号: xxxxxxxx专业:电子科学与技术设计题目:基于AT89C52单片机的16×16点阵(滚动显示) 指导教师: xxx2010 年01月目录第一部分摘要 (2)引言(设计简介) (3)第二部分1、系统硬件设计原理 (4)1.1 汉字显示原理1.2 LED点阵显示模块1.3 芯片选择1.4 电源模块1.5 AT89S52单片机最小系统1.6 整体电路2.系统软件设计 (7)2.1 核心程序3.设计仿真结果 (8)4.PCB版图 (9)5.参考资料 (10)附录 (11)基于AT89C52单片机的16×16点阵(滚动显示)摘要本文介绍一种基于AT89C52单片机的16×16点阵(滚动显示)式汉字显示系统。
本文的汉字点阵显示利用单片机电路和点阵显示系统,实现了汉字的滚动显示。
本系统以AT89S52单片机为核心,由 LED点阵显示,电源等功能模块组成。
关键词 89S52 LED 点阵引言(设计简介)LED显示屏是一种迅速发展起来的新型信息显示媒体。
随着我国经济的不断发展, 汉字显示屏已被广泛应用于车站、宾馆、银行、医院等公共场合。
LED 点阵电子显示屏是集微电子技术、计算机技术、信息处理技术于一体的大型显示屏系统。
它以其色彩鲜艳,动态围广,亮度高,寿命长,工作稳定可靠等优点而成为众多显示媒体以及户外作业显示的理想选择。
同时也可广泛应用到军事、车站、宾馆、体育、新闻、金融、证券、广告以及交通运输等许多行业。
本系统即实现了一种基于LED点阵的汉字显示技术。
1、硬件设计原理1.1 汉字显示的原理:每一个字由16行16列的点阵组成显示。
即国标汉字库中的每一个字均由256点阵来表示。
我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。
事实上这个汉字屏不仅可以显示汉字,也可以显示在256像素围的任何图形。
用8位的AT89C51单片机控制,由于单片机的总线为8位,一个字需要拆分为2个部分。
软件打开后输入汉字,点“检取”,十六进制数据的汉字代码即可自动生成,把我们所需要的竖排数据复制到我们的程序中即可。
我们把行列总线接在单片机的IO口,然后把上面分析到的扫描代码送入总线,就可以得到显示的汉字了。
在这个例子里,由于一共用到16行,16列,如果将其全部接入89c52单片机,一共使用32条IO口,这样造成了IO资源的耗尽,系统也再无扩充的余地。
实际应用中我们使用3-8译码器74ls138来完成列方向的显示。
而行方向16条线则接在p0口。
动态扫描显示如图:左边为138译码扫描,右面为p0口直接控制。
1.2 点阵显示部分:显示部分是本次设计最核心的部分,对于LED16*16点阵显示有以下两种方案:方案一:静态显示,将一帧图像中的每一个二极管的状态分别用0 和1 表示,若为0 ,则表示LED 无电流,即暗状态;若为1 则表示二极管被点亮。
若给每一个发光二极管一个驱动电路,一幅画面输入以后,所有LED的状态保持到下一幅画。
对于静态显示方式方式,所需的译码驱动装置很多,引线多而复杂,成本高,且可靠性也较低。
方案二:动态显示,对一幅画面进行分割,对组成画面的各部分分别显示,是动态显示方式。
动态显示方式方式,可以避免静态显示的问题。
但设计上如果处理不当,易造成亮度低,闪烁问题。
因此合理的设计既应保证驱动电路易实现,又要保证图像稳定,无闪烁。
动态显示采用多路复用技术的动态扫描显示方式,复用的程度不是无限增加的,因为利用动态扫描显示使我们看到一幅稳定画面的实质是利用了人眼的暂留效应和发光二极管发光时间的长短,发光的亮度等因素。
我们通过实验发现,当扫描刷新频率(发光二极管的停闪频率) 为50Hz,发光二极管导通时间≥1m s 时,显示亮度较好,无闪烁感。
鉴于上述原因,我们采用方案二。
显示连接如图:1.3 芯片的选择:本系统选用AT89S52,74LS138,以及4个8*8点阵。
1.4 电源模块方案一:采用干电池作为LED点阵系统的电源,由于点阵系统耗电量较大,使用干电池需经常换电池,不符合节约型社会的要求。
点阵系统要悬挂在墙上,电池总量大,使用会有较大安全隐患。
方案二:采用200W/5V直流稳压电源作为系统电源,不仅功率上可以满足系统需要,不需要更换电源,并且比较轻便,使用更加安全可靠。
基于以上分析,我们决定采用方案二。
200W/5V的直流稳压电源更加安全电路图如图:1.5 AT89S52单片机最小系统:最小系统包括晶体振荡电路、复位开关和电源部分。
图为AT89S51(AT89S52相同)单片机的最小系统。
1.6 整体电路:2、系统软件设计2.1核心程序:基于动态扫描的思想设计。
while (1){for (i=0;i<8;i++) //显示左半边屏幕{P0=*(p+offset+2*i);P2=i|0x08; //P2.4=0,P2.3=1 选中U2, 输出扫描码给U6delay();P0=*(p+offset+2*i+1);P2=i|0x10; //P2.4=1,P2.3=0 选中U3, 输出扫描码给U7delay();}for (i=8;i<16;i++) //显示右半边屏幕{P0=*(p+offset+2*i);P2=(i-8)|0x20; //P2.5=1 P2.4=0, P2.3=0 选中U4,输出扫描码U8 delay();P0=*(p+offset+2*i+1);P2=(i-8)|0x40; //P2.6=1 P2.5=0, P2.4=0 选中U5,输出扫描码U9 delay();}}3.设计仿真结果由程序设计编写的“欢迎您!”,仿真结果如图:4.PCB版图(只完成到布局,布线电脑出现了问题,未完成。
)5、参考资料[1] 胡汉才《单片机原理及其接口技术》清华大学.1996年[2] 国清《数字电子技术基础》中国矿业大学. 2003年[3] 康华光《电子技术基础(第四版)》高等教育,1998 年[4] 黄惠媛《单片机原理与接口技术》海洋[5] 周平伍云辉《单片机应用技术》电子科技大学[6] 维成加国《单片机原理与应用及C51程序设计》清华大学附录#include <reg52.h>#define int8 unsigned char#define int16 unsigned int#define int32 unsigned longint8 flag;int8 n;int8 code table[][32]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/* " " */{0x04,0x28,0x08,0x24,0x32,0x22,0xC2,0x21,0xC2,0x26,0x34,0x38,0x04,0x04,0x08,0x18,0x 30,0xF0,0xC0,0x17,0x60,0x10,0x18,0x10,0x0C,0x14,0x06,0x18,0x04,0x10,0x00,0x00},/*"欢",0*/{0x02,0x02,0x04,0x82,0xF8,0x73,0x04,0x20,0x02,0x00,0xE2,0x3F,0x42,0x20,0x82,0x40,0x 02,0x40,0xFA,0x3F,0x02,0x20,0x42,0x20,0x22,0x20,0xC2,0x3F,0x02,0x00,0x00,0x00},/*"迎",1*/{0x00,0x01,0x04,0x02,0x1C,0x0C,0xC0,0x3F,0x1C,0xC0,0x02,0x09,0x02,0x16,0x92,0x60,0x4A,0x20,0x82,0x2F,0x02,0x20,0x0E,0x24,0x00,0x22,0x90,0x31,0x0C,0x20,0x00,0x00},/*"您",2*/{0x00,0x00,0x00,0x00,0x00,0x00,0xFA,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",3*/{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}/* " " */};void delay(void);int16 offset;void main(void){int8 i;int8 *p;flag=0x10;n=0;TMOD=0x01;TH0=0xb1;TL0=0xe0;ET0=1;EA=1;TR0=1;p=&table[0][0];while (1){for (i=0;i<8;i++) //显示左半边屏幕{P0=*(p+offset+2*i);P2=i|0x08; //P2.4=0,P2.3=1 选中U2, 输出扫描码给U6delay();P0=*(p+offset+2*i+1);P2=i|0x10; //P2.4=1,P2.3=0 选中U3, 输出扫描码给U7delay();}for (i=8;i<16;i++) //显示右半边屏幕{P0=*(p+offset+2*i);P2=(i-8)|0x20; //P2.5=1 P2.4=0, P2.3=0 选中U4,输出扫描码U8 delay();P0=*(p+offset+2*i+1);P2=(i-8)|0x40; //P2.6=1 P2.5=0, P2.4=0 选中U5,输出扫描码U9 delay();}}}void delay(void){int16 i;for (i=0;i<50;i++);}void timer0() interrupt 1 using 3{TF0=0;TH0=0xb1;TL0=0xe0;if (n<10){n++;}else{offset+=2;if (offset>1100) offset=0; n=0;}}。