北京交大单片机课程设计8x8点阵实验报告.docx
《北京交大单片机课程设计8x8点阵实验报告.docx》由会员分享,可在线阅读,更多相关《北京交大单片机课程设计8x8点阵实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
![北京交大单片机课程设计8x8点阵实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/17/2aabdb27-4a26-46e9-8115-bdc3e34176ce/2aabdb27-4a26-46e9-8115-bdc3e34176ce1.gif)
北京交大单片机课程设计8x8点阵实验报告
点阵式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十六进制*/
int8ugRowBuff1[8]={0x10,0xFE,0x92,0xFE,0x92,0xFE,0x91,0x1F};
/*这是“子”的字模;该字模由LEDDOT生成;字模的提取方式为:
逐行提取;
字模的显示方式为:
单字单行显示;生成的字模格式:
C51十六进制*/
int8ugRowBuff2[8]={0xFE,0xC,0x10,0xFF,0x10,0x10,0x10,0x30};
/*这是“设”的字模;该字模由LEDDOT生成;字模的提取方式为:
逐行提取;
字模的显示方式为:
单字单行显示;生成的字模格式:
C51十六进制*/
int8ugRowBuff3[8]={0xDC,0x54,0xF7,0x7E,0x52,0x7C,0x4C,0x37};
/*这是“计”的字模;该字模由LEDDOT生成;字模的提取方式为:
逐行提取;
字模的显示方式为:
单字单行显示;生成的字模格式:
C51十六进制*/
int8ugRowBuff4[8]={0xC4,0x44,0xBF,0x44,0x44,0x64,0x44,0x04};
上下循环:
int8ugRowBuffa[]=
{
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//计
};
左右循环:
int8ugRowBuff[]=
{
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
#defineRowP1
#defineColP2
#defineResetBit(byte,i)((byte)&=(0x01<<(i)));
typedefunsignedintint16u;
typedefunsignedcharint8u;
/*************************************************
模块级变量申明——单字循环显示
*************************************************/
/*这是“电”的字模;该字模由LEDDOT生成;字模的提取方式为:
逐行提取;
字模的显示方式为:
单字单行显示;生成的字模格式:
C51十六进制*/
int8ugRowBuff1[8]={0x04,0x7F,0x49,0x7F,0x49,0x7F,0x84,0xF4};
/*这是“子”的字模;该字模由LEDDOT生成;字模的提取方式为:
逐行提取;
字模的显示方式为:
单字单行显示;生成的字模格式:
C51十六进制*/
int8ugRowBuff2[8]={0x7E,0x20,0xFE,0x10,0x10,0x10,0x14,0x10};
/*这是“设”的字模;该字模由LEDDOT生成;字模的提取方式为:
逐行提取;
字模的显示方式为:
单字单行显示;生成的字模格式:
C51十六进制*/
int8ugRowBuff3[8]={0x72,0xDF,0x05,0xF5,0x54,0x24,0x5C,0x85};
/*这是“计”的字模;该字模由LEDDOT生成;字模的提取方式为:
逐行提取;
字模的显示方式为:
单字单行显示;生成的字模格式:
C51十六进制*/
int8ugRowBuff4[8]={0x22,0x27,0xFC,0x24,0x24,0x24,0x2C,0x24};
/*************************************************
模块级变量申明——上下循环
*************************************************/
int8ugRowBuffa[]=
{
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
};
/*************************************************
模块级变量申明——左右循环
*************************************************/
int8ugRowBuff[]=
{
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
};
int8ui,j,n,s;
int16usec;
voidDelay1(void);
voidDelay2(void);
/*************************************************
子函数定义
*************************************************/
voidmain(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();
}
}
elseif((sec>200)&&(sec<=400))
{
for(i=0;i<8;i++)
{
Col=0xff;
ResetBit(Col,i);//扫描第i列;
Row=gRowBuff2[i];
Delay1();
}
}
elseif((sec>400)&&(sec<=600))
{
for(i=0;i<8;i++)
{
Col=0xff;
ResetBit(Col,i);//扫描第i列;
Row=gRowBuff3[i];
Delay1();
}
}
elseif((sec>600)&&(sec<=800))
{
for(i=0;i<8;i++)
{
Col=0xff;
ResetBit(Col,i);//扫描第i列;
Row=gRowBuff4[i];
Delay1();
}
}
elseif((sec>800)&&(sec<=801))