北京交大单片机课程设计8x8点阵实验报告
- 格式:doc
- 大小:368.50 KB
- 文档页数:13
点阵式LED显示器
一、实验目的
1.了解点阵式LED显示原理。
2.掌握单片机与8×8点阵块之间接口电路设计及编程。
3.掌握8155工作原理及与单片机的接口电路设计。
二、设计任务及要求
系统设计要求:
利用8×8点阵显示屏,自己设计、焊接并调试电路板,实现在单片机的控制下,点阵显示屏显示“ 电子设计”,显示方式分别为单字循环显示、左右滚动显示、上下滚动显示。
系统功能说明:
系统在正常工作模式下为单字循环显示“ 电子设计”四个字,当按下第一个开关时,点阵显示屏开始上下滚动显示“ 电子设计”,循环显示三次。而当按下第二个开关时,点阵显示屏开始左右滚动显示“ 电子设计”,循环显示三次。当按下复位开关时,单片机复位,程序重新开始。
三、工作原理及设计思路
(1)电路原理图:点阵显示模块的硬件电路设计如图1所示:
图1
复位电路的基本功能是:系统上电时提供复位信号,在加电瞬间,RST端出现一定时间的高电平,直至系统电源稳定后,撤销复位信号。 如下图:
晶振电路如下图:
(2)电路设计原理:
8X8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置0电平,某一行置1电平,则相应的二极管就亮;8X8点阵的列输入为C0~C7,行输入为R0~R7,它们通过驱动电路(芯片1416及74LS245)接至发光二极管的阴极和阳极。 要显示某一个字,首先要设计该字的点阵字形,编好行(或列)点阵码,然后在单片机的控制下对点阵进行逐行(或列)扫描。在人眼的暂存效应下我们会看到完整的字形,从而实现了字体在点阵显示屏上的输出。
(3)设计思路:
由于只控制8*8点阵显示屏,故不需要扩展单片机的I/O接口。考虑到P0口需要接上拉电阻,使得电路较为复杂,因此利用单片机的P1口来控制点阵的行,用P2口控制点阵的列。
(4)芯片原理
1.单片机STC89C51RC引脚功能:
4KB程序存储器,512B的数据存储器,中断源8个,定时器3个,32位I/O口,有看门狗电路。
STC89C51RC/RD+系列单片机ISP编程原理
2.74HC245
管脚图如下:
芯片中数据传输方向:
根据所设计的电路原理图,数据由A口传向B口,故应使=0,DIR=1。数据从A口输出后需接1K电阻,再接到点阵的行。
3.MC1416BP
管脚图如下:
由于需要八个数据传送口,故应有两片MC1416BP,任选其中八个即可。此芯片不用接电源,8脚接地。数据直接接到点阵的列。
(5)字模表生成:
字模由LEDDOT生成,字模的提取方式为:逐行提取,
字模的显示方式为:单字单行显示,生成的字模格式:C51十六进制
以下是生成的字模表:
/*这是“电”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
int8u gRowBuff1[8] = {0x10,0xFE,0x92,0xFE,0x92,0xFE,0x91,0x1F};
/*这是“子”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
int8u gRowBuff2[8] = {0xFE,0xC,0x10,0xFF,0x10,0x10,0x10,0x30};
/*这是“设”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
int8u gRowBuff3[8] = {0xDC,0x54,0xF7,0x7E,0x52,0x7C,0x4C,0x37};
/*这是“计”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */ int8u gRowBuff4[8] = {0xC4,0x44,0xBF,0x44,0x44,0x64,0x44,0x04};
上下循环:
int8u gRowBuffa[]=
{
0x04,0x7F,0x49,0x7F,0x49,0x7F,0x84,0xF4,0x00, //电
0x7E,0x20,0xFE,0x10,0x10,0x10,0x14,0x10,0x00, //子
0x72,0xDF,0x05,0xF5,0x54,0x24,0x5C,0x85,0x00, //设
0x22,0x27,0xFC,0x24,0x24,0x24,0x2C,0x24,0x00 //计
};
左右循环:
int8u gRowBuff[]=
{
0xC0,0xBE,0xAA,0xAA,0x7F,0x2A,0x2A,0x3E,0x00, //电
0x04,0x04,0x05,0x45,0xFD,0x07,0x05,0x02,0x00, //子
0x02,0x03,0xFE,0xCA,0x5B,0x29,0x5B,0x8A,0x00, //设
0x02,0x03,0xFE,0x88,0xD8,0x7F,0x08,0x08,0x00 //计
};
四、软件设计
(1)设计说明:
主函数中共分为三部分,主循环为单字循环显示,外部中断0的中断函数为上下循环,外部中断1的中断函数为左右循环。采用边沿触发方式产生中断,每次中断都循环显示“ 电子设计”。
(2)软件参数设置:
1.Keil软件:
在Keil中选择AT89C52进行仿真,选择频率为11MHZ,如下图:
选择仿真输出.hex文件,方便进行烧录,如下图:
设置Debug,如下图:
2.STC烧录软件:
(3)源程序:
#include
#define Row P1
#define Col P2
#define ResetBit(byte,i) ((byte) &= (0x01<<(i)));
typedef unsigned int int16u;
typedef unsigned char int8u;
/*************************************************
模块级变量申明——单字循环显示
*************************************************/
/*这是“电”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
int8u gRowBuff1[8] = {0x04,0x7F,0x49,0x7F,0x49,0x7F,0x84,0xF4};
/*这是“子”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
int8u gRowBuff2[8] = {0x7E,0x20,0xFE,0x10,0x10,0x10,0x14,0x10};
/*这是“设”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
int8u gRowBuff3[8] = {0x72,0xDF,0x05,0xF5,0x54,0x24,0x5C,0x85};
/*这是“计”的字模;该字模由LEDDOT生成;字模的提取方式为:逐行提取;
字模的显示方式为:单字单行显示;生成的字模格式:C51十六进制 */
int8u gRowBuff4[8] = {0x22,0x27,0xFC,0x24,0x24,0x24,0x2C,0x24};
/*************************************************
模块级变量申明——上下循环
*************************************************/
int8u gRowBuffa[]=
{
0x04,0x7F,0x49,0x7F,0x49,0x7F,0x84,0xF4,0x00,
0x7E,0x20,0xFE,0x10,0x10,0x10,0x14,0x10,0x00,
0x72,0xDF,0x05,0xF5,0x54,0x24,0x5C,0x85,0x00,
0x22,0x27,0xFC,0x24,0x24,0x24,0x2C,0x24,0x00
};
/*************************************************
模块级变量申明——左右循环 *************************************************/
int8u gRowBuff[]=
{
0xC0,0xBE,0xAA,0xAA,0x7F,0x2A,0x2A,0x3E,0x00,
0x04,0x04,0x05,0x45,0xFD,0x07,0x05,0x02,0x00,
0x02,0x03,0xFE,0xCA,0x5B,0x29,0x5B,0x8A,0x00,
0x02,0x03,0xFE,0x88,0xD8,0x7F,0x08,0x08,0x00
};
int8u i,j,n,s;
int16u sec;
void Delay1(void);
void Delay2(void);
/*************************************************
子函数定义
*************************************************/
void main(void)
{
IT0=1; //INT0边沿触发
IT1=1; //INT1边沿触发
EA=1; //允许所有中断
EX0=1; //允许INT0中断
EX1=1; //允许INT1中断
while(1)
{
Col = 0xff; //屏幕清零
sec++;
if(sec <= 200) //每个汉字显示四秒;
{
for(i=0;i<8;i++)
{
Col = 0xff;
ResetBit(Col,i); //扫描第i列;
Row = gRowBuff1[i]; //送显示码;
Delay1();
}
}
else if((sec > 200) && (sec <= 400))
{
for(i=0;i<8;i++)