88点阵实验报告.docx
《88点阵实验报告.docx》由会员分享,可在线阅读,更多相关《88点阵实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
88点阵实验报告
2016年电子工程专业2014级卓越工程师班
《单片机与微机原理及应用》
课程设计报告
设计题目:
8*8LED点阵设计
专业班级:
电子卓越1401班
学生姓名:
林晓强
学生学号:
5120141478
指导教师:
聂诗良、许超(助教)
答辩日期:
第13周周六上午9点
答辩地点:
综合楼4-311实验室
西南科技大学信息工程学院制
2016年5月
8*8LED点阵设计
1摘要
(1)近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
(2)LED点阵是由发光二极管排列组成的显示器件, 在我们日常生活的电器中随处可见,极为普通也广为人知。
特别是它的发光类型属于冷光源,效率及发热量是普通发光器件难以比拟的,它采用低电压扫描驱动,具有:
耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可视距离远、规格品、可靠耐用、应用灵活、安全、响应时间短、绿色环保、控制灵活种等特点。
目前LED显示屏作为新一代的信息传播媒体,已经成为城市信息现代化建设的标志。
随着社会经济的不断进步,以及LED显示技术的不断完善,人们对LED显示屏的认识将越来越深入,其应用领域将会越来越广。
(3)经过琢磨,觉得4*4点阵过于简单化,后续显示过程中显示效果有限,只能显示出有限的简单字符效果,表现不够良好。
而8*8点阵虽结构较4*4点阵复杂些许,但是其显示效果叫4*4点阵有了很大提升空间。
可以显示比方案一更加复杂良好的字符。
动态显示方式是LED点阵常用的显示方式,动态显示方式动态显示采用扫描的方式工作,由峰值较大的窄脉冲电压驱动,从上到下逐次不断地对显示屏的各行进行选通,同时又向各列送出表示图形或文字信息的列数据信号,反复循环以上操作,就可显示各种图形或文字信息,
1.1课程设计制作题目及要求
用AT89S52单片机控制8*8LED点阵构成任意图形。
要求:
用8*8LED组合成数字3/2/1加上定时器这样倒计时,然后组合成相应的简单图形。
要求:
(1)组成3/2/1字符:
用8*8LED点阵64个LED不同的LED亮来组成相应的字符。
(2)3/2/1字符切换时间为1S:
字符切换时间用定时器精确控制。
(3)8*8流水灯:
控制LED组合挨个亮灭,流水状。
2.系统方案设计
2.1设计思路
利用AT89S52单片机作为整个控制搭电路的核心,并编制软件程序,在8X8LED点阵上实现字符的显示很LED灯的随机闪烁显示。
选用如下主要元器件:
AT89S52单片机、电阻3K欧、三极管8550、按钮开关、共阳8*8LED点阵显示块。
此设计的时间控制用AT89s52的定时器进行,设定定时器初值为46080,(由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断),记录20次中断标志为1s,用这个控制LED切换时间。
2.2总体设计框图
3.硬件设计
3.1硬件选型
单片机特点:
(1)高集成度,体积小,高可靠性单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。
芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。
单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。
(2)控制功能强为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:
分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。
(3)低电压,低功耗,便于生产便携式产品为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。
(4)易扩展片内具有计算机正常运行所必需的部件。
芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。
(5)优异的性能价格比单片机的性能极高。
为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。
单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。
由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。
数字逻辑电路特点:
用数字电路逻辑器件组成控制电路,这样原理简单清楚,但是调节起来很复杂,需要更改电路结构。
根据设计要求及设计的需要我采用单片机来作为控制手段,选用AT89S52单片机作为该课程设计的核心来对数字信息进行处理及储存。
它是一个低电压,高性能的CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口,AT89S52可以按照常规方法进行编程,也可以在线编程。
3.2系统硬件电路原理详图
3.2.1复位电路原理图以及时钟电路原理图
3.3实际连线详图
3.3.18*8LEDAD原理图
3.3.28*8LEDADPCB图
3.3.38*8LED点阵原理仿真电路
3.3.451单片机主控实物图以及原理图
4.软件设计
4.1软件功能设计
利用单片机的定时器产生准确的时钟信号,从而进行时间控制,控制十字路口的红、黄、绿灯交替亮灭。
并且使用共阴极四位LED数码管,时刻显示当前路口的红灯或者绿灯还将持续的时间。
两个方向的通行时间可用按键进行设置,可以控制路口的红绿灯的持续时间,这样模拟现实中的不同时间段,车流量不同而智能控制时间,这样更加合理的控制路口的通行,提高道路的通行效率,系统的启停和复位也由按键控制。
4.2软件流程设计
4.2.1主流程图
5.软件调试
5.1单元调试
5.1.1显示模块测试
首先在硬件电路上按照要求连接数码管,然后由单片机控制,看能否控制LED显示任何组合,测试通过则开始调试LED灯单个控制程序代码,不通过则检查问题,硬件问题或者软件问题。
最后将LED灯组合起来控制,看能否达到理论状态,不能则分析原因,是否程序代码有误还是硬件焊接,测试完成后,确认无误则进行下一步测试。
5.1.2LED点阵模块测试
在8*8LED点阵接入电路之后,用万用表的测试通断档检测每个LED是否能正常工作,点阵电路硬件无误,在软件程序里面测试,每个LED的控制程序都单独检测,如果控制没有问题则检查完成。
5.2总体测试
在程序搭建完成之后,结合硬件进行最后的测试,用按键控制时间加减,然后观察程序的BUG,做多种尝试,尽量消除完程序存在的BUG,比如时间如果减为0,或者时间加到数码管显示的最大值之后怎么处理,都是我们程序里面要考虑到的问题,然后检测中断程序控制的时间与实际时间的差距,尽量调整时间没有差距,这也是程序控制与实际的结合,达到误差标准之后,然后运行程序,要求时间持续时间长,如果出现问题,那么就要分析问题原因,是硬件问题还是软件BUG,将问题处理完之后,作品完成。
6.心得体会
虽然本设计只使用了一块8*8LED点阵,电路简单,但是已经包涵了LED显示屏的电路基本原理和基本程序,在设计的过程中应该使显示图形和文字稳定、清晰无串扰。
图形或文字显示有静止、移入移出等显示方式。
本系统具有硬件少,结构简单,容易实现,性能稳定可靠,成本低等特点。
在此次设计中通过查阅大量的相关资料,详细了解了LED的发光原理和LED显示屏的原理,了解了LED的现状,清楚地了解了LED显示屏与其它显示屏相比较有那些优点,明确了研究目标。
通过这次课程设计,重新复习并进一步学习了AT89S52;熟练掌握了WORD软件的使用。
进一步提高了自己在实际设计过程中研究问题、发现问题、解决问题的能力。
但是从中也存在不足之处:
对知识的积累还不够,有些问题自己不能够独立解决,对实验操作还要进一步熟练,只有这样才能让自己在不断的学习中提高自己。
在这次课程设计中,我们运用到了以前所学的专业课知识,如:
AD制图、汇编语言、模拟和数字电路知识等。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
短短两周的课程设计已经结束了,通过这次的课程设计锻炼了我们的实践能力,也是对我们以后的实际工作能力的具体训练和考察过程。
现在是一个高科技的时代,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在的。
因此对于我们这一专业的同学来说,学好单片机,并正确应用单片机是非常重要的。
7.参考文献
[1]周伟,淮阴师范学院,数学科学学院,《c语言程序设计》课程教学研究,维普期刊资源整合服务平台。
[2]谭浩强,《c语言程序设计》(第四版),清华大学出版社,北京,2010年。
[3]郭天祥.十天学会单片机。
[4]张友德等 单片微型机原理、应用与实验 第五版 上海:
复旦大学出版社 2003
附录1
《C语言源程序代码》
#include
#include
unsignedchartable0[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//顺列
unsignedchartable00[8]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe};//倒列
unsignedchartable1[8]={0xFF,0xE7,0xF7,0xF7,0xF7,0xC3,0xFF,0xFF};//显示数字1
unsignedchartable2[8]={0xFF,0xC3,0xFB,0xC3,0xDF,0xC3,0xFF,0xFF};//显示数字2
unsignedchartable3[8]={0xFF,0xC3,0xFB,0xC3,0xFB,0xC3,0xFF,0xFF};//显示数字3
unsignedchartable4[]={0xFF,0xFE,0xDF,0xFF,0xFF,0xF7,0xFF,0xBD,//显示各个点
0xFF,0xFF,0xF3,0x4D,0xFD,0xD7,0xFD,0xBD,//行加点
0xFB,0xEB,0xFF};
unsignedchartable5[8]={0xFe,0xFd,0xFb,0xF7,0xeF,0xdF,0xbF,0x7F};//行减点
unsignedchartable6[8]={0x80,0xc0,0xe0,0xf0,0xf8,0xFc,0xFe,0xFf};
unsignedchartable7[8]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xFf};//循环矩阵
chara,b,c,d,x;
chart2,t3,m;
intt1;//定义变量
bitflash_flag;//显示可控数据标志
voiddelay(unsignedintt)//短时间延时
{
chark;
while(t--)
{
for(k=0;k<100;k++);
}
}
voiddelayus(unsignedinti)//US延时
{
while(i--);
}
voidtimer_init(void)//定时器初始化
{
EA=1;
ET0=1;
ET1=1;
TMOD=0X11;
TH0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断
TL0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断
TH1=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断
TL1=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断
TR0=1;
TR1=1;
PT0=0;
PT1=1;
}
voidimage1()//显示数字1子函数
{
chari;
for(i=7;i>=0;i--)
{
P0=~(table1[i]);
P2=table0[i];
delayus(180);
}
}
voidimage2()//显示数字2子函数
{
chari;
for(i=7;i>=0;i--)
{
P0=~(table2[i]);
P2=table0[i];
delayus(180);
}
}
voidimage3()//显示数字3子函数
{
chari;
for(i=7;i>=0;i--)
{
P0=~(table3[i]);
P2=table0[i];
delayus(180);
}
}
voidimage4()//显示点与行子函数
{
chari,j;
intT=5000;
//
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[7];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[6];
delayus(T);
}
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[5];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[4];
delayus(T);
}
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[3];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[2];
delayus(T);
}
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[1];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[0];
delayus(T);
}
///////////////////////////////////////
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[0];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[1];
delayus(T);
}
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[2];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[3];
delayus(T);
}
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[4];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[5];
delayus(T);
}
for(j=7;j>=0;j--)
{
P0=~(table5[j]);
P2=table0[6];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=~(table5[j]);
P2=table0[7];
delayus(T);
}
/////////////////////////////////////////////
for(j=0;j<=7;j++)
{
P0=table6[j];
P2=table00[7];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=table7[j];
P2=table00[6];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=table6[j];
P2=table00[5];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=table7[j];
P2=table00[4];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=table6[j];
P2=table00[3];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=table7[j];
P2=table00[2];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=table6[j];
P2=table00[1];
delayus(T);
}
for(j=0;j<=7;j++)
{
P0=table7[j];
P2=table00[0];
delayus(T);
}
//
}
voidflash1()//显示函数调用函数
{
if(t1<30)
{
image3();
}
elseif(t1>=30&&t1<60)
{
image2();
}
elseif(t1>=60&&t1<90)
{
image1();
}
elseif(t1>=90&&t1<300)
{
image4();
}
else
{
t1=0;
}
}
voidmain()//主函数
{
intn,s;
timer_init();
while(n<440)
{
flash1();
n++;
}
while
(1)
{
x=a+b+c;
for(s=0;s<8;s++)
{
P0=(table0[s]);
P2=(table4[x]);
delay(50);
}
}
}
voidtrmer0()interrupt1//随机数调用函数
{
a=(char)(rand()%10);
b=(char)(rand()%10);
c=(char)(rand()%10);
a=(char)(rand()%10);
d=(char)(rand()%10);
a=(char)(rand()%10);
c=(char)(rand()%10);
TH0=(65535-10000)/256;
TL0=(65536-10000)%256;
}
voidtimer1()interrupt3//时间变量中断
{
m++;
if(m=20);
{
m=0;
t1++;
}
TH1=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断
TL1=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断
}
附录2
程序模块原理图以及部分实物图