北京交大单片机课程设计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 <AT89X52.H>
#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++)
{
Col = 0xff;
ResetBit(Col,i); //扫描第i列;
Row = gRowBuff2[i];
Delay1();
}
}
else if((sec > 400)&&(sec <= 600))
{
for(i=0;i<8;i++)
{
Col = 0xff;
ResetBit(Col,i); //扫描第i列;
Row = gRowBuff3[i];
Delay1();
}
}
else if((sec > 600)&&(sec <= 800))
{
for(i=0;i<8;i++)
{
Col = 0xff;
ResetBit(Col,i); //扫描第i列;
Row = gRowBuff4[i];
Delay1();
}
}
else if((sec>800)&&(sec<=801))
{
for(s=0;s<29;s++)
{
for(j=200;j>0;j--) //每屏显示时间{
for(i=0;i<8;i++)
{
Col = 0xff;
ResetBit(Col,i); //
Row = gRowBuffa[i+s]; //
Delay1();
}
}
}
}
else if((sec>801)&&(sec<=802))
{
for(s=0;s<29;s++)
{
for(j=100;j>0;j--) //每屏显示时间
{
for(i=0;i<8;i++)
{
Row = 0xff;
ResetBit(Row,(7-i)); //
Col= gRowBuff[i+s]; //
Delay2();
}
}
}
}
else
{
sec = 0;
}
}
}
void Delay1(void)
{
unsigned char i,j;
for(i=1;i>0;i--)
for(j=248;j>0;j--);
}
void Delay2(void)
{
unsigned char i,j;
for(i=2;i>0;i--)
for(j=248;j>0;j--);
}
/********************************************************
**** End Of File
*********************************************************/
五、调试及过程分析:
本次试验调试中出现了很多问题,首先是管脚座的误接很容易引发错误,这个经过自习排查之后可以排除,后面的则主要在于烧制,在烧程序的时候,我发现很多实验板烧完之后蜂鸣器响报警,但是经过排查之后,发现我使用的是P1口和P2口,对应了开发板上面的蜂鸣器,但是程序始终少不上去,经过多方试验之后通过找同学借到了一块可以烧制的。
在最开始,本人买的单片机芯片为AT 系列的,后来发现AT的烧制必须要有相对应的烧制接口,并非串口烧制,所以在换了RST芯片之后就解决了。
最后在于程序,程序的最大难度就在于字码表,最开始出现了左右相反的问题,经过调试之后,我画了一张8x8的点阵图,然后在图上画出相应的字就可以通过图轻松画出来了。
六、实验总结
这次实验经历了很多问题,一共焊了两块板子,感觉第一块主要是自己太过于急功近利,所以导致很多东西并不算是很懂的情况下就开始做了,其中的单片机试用了P0口作为输出,这个时候P0口的输出一般只有2.2v左右,需要使用上啦电阻才能实现正常功能,然后我就只有改用P1口,其次对于245芯片的不了解,因为其A通道到B通道使用的是不同的连接方式,在做第二块板子的时候,重新做的时候就好多了,而且经历了之前的失败,也让我小心很多避开了很多失误。
然后在于板子的程序方面,主要在于子码表,子码表其实原理很简单,我的方法就是自己画一个8x8的矩阵,然后自己把字画出来,然后把对应的点的标为1,然后写出其代码就可以了。
只要仔细点就不会出现问题了。
整个实验我经历了很多,我慢慢也发现做单片机其实还是存在很多了去,经过仔细研究,我觉得单片机可以做更深层次的探究,而且最后经历了各种错误之后也学习到了很多东西,这几天通过网上查资料,问同学都又学习到了很多东西。
也感谢在这次试验中给我提供帮助的各位老师和同学。