关于走马观花灯的单片机实训报告概要.docx
《关于走马观花灯的单片机实训报告概要.docx》由会员分享,可在线阅读,更多相关《关于走马观花灯的单片机实训报告概要.docx(17页珍藏版)》请在冰豆网上搜索。
关于走马观花灯的单片机实训报告概要
目录
1前言2
2.总体设计2
2.1系统总体设计要求2
2.2系统总体设计图2
3.单片机运行的最小系统3
3.1电源3
3.2晶振3
3.3复位电路3
4.可以调控的走马灯硬件电路模块4
4.1系统总原理图····························································4
4.2按键模块································································5
4.3LED显示模块····························································5
4.4数码管模块······························································6
5系统软件设计9
5.1软件程序设计流程图9
5.2C语言程序设计9
6软件仿真12
7软硬件调试出现的问题及解决办法14
8实训体会14
9参考文献·······································································15
10致谢·········································································15
前言
众所周知,走马灯以其绚丽的色彩赢得人们喜爱,在人们的日常生活中很常见,并在一些特定的节日里,重要场合中起着绚烂节日气氛,带给人们欢乐的作用。
可以调控的走马灯打破常规走马灯闪烁固定变化的现状,可根据人们不同的意愿进行编程设计出想要的变换的色彩效果。
2总体设计
2.1设计方案
1.显示效果使用16个LED。
2、设置三个按键,K1-模式键,通过按键调整显示结果,要求有8种模式K2加速键,提高走马灯显示效果的速度;K3-减速键,放慢走马灯的显示效果速度;
3、8种模式通过一个共阳型数码管显示出来,比如,走马灯的显示效果为模
式一时,数码管显示数字“1”。
2.2系统总体设计图如下:
3.单片机运行的最小系统
3.1电源
电源电路采用的是USB母口,提供+5V的电压。
其有四个引脚,1引脚接的是电源,4引脚接地。
由于USB接口使用的是开关电源,不是很稳定的。
接10UF的去耦电容起到缓冲的作用,可以得到稳定的+5V电压。
把电流比做水流,水流很急,但去耦电容就像一条水沟,可以缓冲水流。
电容的作用是蓄能的作用。
电源电路
3.2晶振
晶振为单片机提供时钟信号。
晶振电路
3.3复位电路
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:
手动按钮复位和上电复位。
复位电路
4可以调控的走马灯硬件电路模块
4.1系统总原理图如下
系统总原理图
4.2按键模块
按键模块
按键模块,使用P3.0,P3.1,P3.2分别接入开关S1,S2,S3。
当按键按下后呈低电平,表示系统中有控制按键按下。
4.3LED显示模块
LED显示模块采用16个发光二极管并联在电源上,其中一边8个二极管接在P1口上,另外8个二极管接在P0口,上拉电阻与之分别并联。
LED显示模块
4.4数码管显示模块
发光二极管显示管简称LED,具有结构简单、价格低廉、使用方便、耗电少、与单片机接口容易等特点,在单片机应用系统使用非常普遍,一位共阳数码管结构如下。
一位共阳数码管
LED数码显示器由七段条形的发光二极管组成“”字形显示字段,用一只圆形的发光二极管做小数点。
LED数码显示器中,通常将各段发光二极管的阴极或阳极连在一起做公共端,这样可以使驱动电路简单。
共阳极数码管是指发光二极管的阳极都与正极接在一起,引脚接输出端,故低电平有效,其原理图如下;
共阳极数码管原理图
共阳极的管脚示意图如下;
共阳极管脚示意图
要使LED数码管显示数字,只要点亮相应字段的发光二极管即可。
如要显示“1”,点亮b、c段;要显示“0”,点亮a、b、c、d、e、f段。
从图中不难看出,对于共阳极数码管,点亮字段则用低电平“0”来表示,所以低电平有效。
这样我们就可以把要显示的数字与一串二进制代码对应起来,即对LED数码显示器实现编码。
由于这种编码是与显示器结构相对应的,因此不考虑小数点的编码只有七位,常称为七段显示码;
如果对小数点也进行编码,则称为八段显示码。
常用字符的八段显示码如下图所示;
常用字符的八段显示码
数码管模块的原理图如下
5系统软件设计
5.1软件程序设计流程图
软件程序设计主要由开始、初始化、主程序、以及延时程序等组成。
其程序流程如下图所示:
图中K1键用来选择模式的,初始时运行模式0,按一次运行模式1,以此类推按7次则云行模式7,当再一次按下时又运行模式0。
K2键用来加速按的次数越多则速度越快。
K3用来减速同K2按的越多则越慢。
速度的选择可见附录4程序中的调速表,程序通过不同的顺序来改变速度。
图中数码管的数字显示是根据K1的模式选择的,初始时数码管显示0,程序运行模式0,同理当运行模式7时,则数码管显示7。
5.2 C语言程序设计
//
//C语言程序清单:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharModeNo;
uintSpeed;
uchartCount=0;
ucharIdx;
ucharmb_Count=0;
bitDirtect=1;
ucharcodeDSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uintcodesTable[]={0,1,3,5,7,9,15,30,50,100,200,230,280,300,350};
voidDelay(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
ucharGetKey()
{
ucharK;
if(P2==0xFF)return0;
Delay(10);
switch(P2)
{
case0xFE:
K=1;break;
case0xFD:
K=2;break;
case0xFB:
K=3;break;
default:
K=0;
}
while(P2!
=0xFF);
returnK;
}
voidLed_Demo(uintLed16)
{
P1=(uchar)(Led16&0x00FF);
P0=(uchar)(Led16>>8);
}
voidT0_TNT()interrupt1
{
if(++tCounttCount=0;
switch(ModeNo)
{
case0:
Led_Demo(0x0001<case1:
Led_Demo(0x8000>>mb_Count);break;
case2:
if(Dirtect)Led_Demo(0x000F<elseLed_Demo(0xF000>>mb_Count);
if(mb_Count==15)Dirtect=!
Dirtect;
break;
case3:
if(Dirtect)Led_Demo(~(0x000F<elseLed_Demo(~(0xF000>>mb_Count));
if(mb_Count==15)Dirtect=!
Dirtect;
break;
case4:
if(Dirtect)Led_Demo(0x003F<elseLed_Demo(0xFC00>>mb_Count);
if(mb_Count==15)Dirtect=!
Dirtect;
break;
case5:
if(Dirtect)Led_Demo(0x0001<elseLed_Demo(0x8000>>mb_Count);
if(mb_Count==15)Dirtect=!
Dirtect;
break;
case6:
if(Dirtect)Led_Demo(~(0x0001<elseLed_Demo(~(0x8000>>mb_Count));
if(mb_Count==15)Dirtect=!
Dirtect;
break;
case7:
if(Dirtect)Led_Demo(0xFFFE<elseLed_Demo(0x7FFF>>mb_Count);
if(mb_Count==15)Dirtect=!
Dirtect;
break;
}
mb_Count=(mb_Count+1)%16;
}
voidKeyProcess(ucharKey)
{
switch(Key)
{
case1:
Dirtect=1;mb_Count=0;
ModeNo=(ModeNo+1)%8;
P3=DSY_CODE[ModeNo];
break;
case2:
if(Idx>1)Speed=sTable[--Idx];break;
case3:
if(Idx<15)Speed=sTable[++Idx];
}
}
voidmain()
{
ucharKey;
P0=P1=P2=P3=0xFF;
ModeNo=0;Idx=4;
Speed=sTable[Idx];
P3=DSY_CODE[ModeNo];
IE=0x82;
TMOD=0x00;
TR0=1;
while
(1)
{
Key=GetKey();
if(Key!
=0)KeyProcess(Key);
}
}
6软件仿真
软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
本设计通过protues进行软件硬件仿真,设计的原理图如图所示;
仿真设计的原理图
系统运行后的示意图如下图所示
7软硬件调试中出现的问题及解决办法
硬件调试
单片机基础电路包括电源、单片机、外部时钟震荡电路、复位电路和外部接口电路。
调试过程需要注意以下几点:
(1).检查电源是否完好。
(2).单片机电源要连接正确,并且保证STC89C51的31号引脚接高电平。
STC89C51的31号引脚是外部程序存储器选择信号端,当该引脚为高电平时,单片机会一直从片内程序存储器内取指令。
(3).如果使用P0口做I/O口,要接上拉电阻。
(4).使用万用表排查电路中是否存在断路或者短路情况。
笔者在制作外部接口电路时使用的是排针,焊接时容易出现管脚之间短路,所以在上电以前必须先排查电路。
(5).编辑一个简单程序,上电运行,检查单片机是否正常工作,复位电路是否正确。
软件调试
软件调试相对比较简单,但是要掌握仿真软件的用法,首先在仿真软件(Proteus)上建立仿真模型(电路图),然后用KeilC编程序和Proteus进行联机仿真调试,分别对显示、按键、时钟等各个部分进行调试,检测电路原理图的正确与否。
8.实训体会
经过三周单片机的实训,对我来说,是一段非常充实而又有意义的经历与学习过程。
这一段学习过程给我的体会就是收获。
从这段实训中,我学到了单片机设计的整体流程。
在整个单片机系统的设计过程中,首先在确定设计内容后,便是对方案的初步设计及选择。
在我们的可以调控的流水灯系统中,先是确定方案后便是使用proteus仿真软件对方案进行验证。
对于仿真,不仅需要硬件的原理图,还需要相应的程序。
在将用C语言编制好的程序送入仿真用的单片机中后,便可以进行仿真验证。
在经过一定的修改与调试后仿真得到预期效果,仿真完成。
在整个仿真过程中,我的收获就是相关软件的使用。
在此过程我学会了keil、proteus及程序烧入单片机的方法。
紧接着便是电路板的焊接,在电路板的焊接前,首先搞清楚了单片机的最小系统。
包括如下:
1晶振电路晶振与XTAL1和XTAL2串接起来,晶振两端在接入30pF的电容再接地。
2复位电路 使用的是手动与上电复位。
3电源端 40引脚接入+5v电源,如果需要只使用内部存储器,则31脚EA端也需加入+5v电平。
在经过了相应的准备后,进行了电路的焊接。
电路的焊接需要很好的布线,尽量不用或少用跳线。
焊接同样是个艰辛的过程。
在经过数小时焊到眼花了后,终于完成。
焊完并且拷入单片机程序后。
接入电源竟是无法工作。
这个是一个插曲吧!
在检查一会电路,用万用表测量时发现USB接口内侧无电压,而外侧才是正常的+5v。
而后则调整电源端USB管脚后,重新测试,功能实现正常。
对于这次的实训机会,我自己也是十分的珍惜。
从这三周的亲自动手实践,也深刻领悟了那句话:
“纸上得来终觉浅,绝知此事要躬行”仅从书本上看确实无法真正掌握要学的知识。
而亲自动手去做才可以学的懂,学的透。
此次的实训让我对单片机从不懂到了初步的认识。
我会抓住这个势头在课后继续对单片机进行学习,争取早日的学懂,早日的会应用。
9.参考文献
张鑫.单片机原理及应用(第2版).北京:
电子工业出版社.2010.10
刘海宽.包建华.张兴奎.南京:
东南大学出版社.2009.1
郭天祥.新概念51单片机C语言教程.北京:
电子工业出版社.2009.1
赵晓安.MCS-51单片机原理及应用.天津:
天津大学出版社,2001.3
李广第.单片机基础.第1版.北京:
北京航空航天大学出版社,1999
徐惠民、安德宁.单片微型计算机原理接口与应用.第1版.北京:
北京邮电大学出版社,1996
10.致谢
本次实训中遇到了一些不懂的问题,通过老师的帮助讲解都一一解决了,在此感谢包建华、秦海鹏、甘良志、丁启胜、赵明伟老师对我本次实训的帮助。