可以调控的走马灯.docx
- 文档编号:8429514
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:19
- 大小:910.71KB
可以调控的走马灯.docx
《可以调控的走马灯.docx》由会员分享,可在线阅读,更多相关《可以调控的走马灯.docx(19页珍藏版)》请在冰豆网上搜索。
可以调控的走马灯
单片机课程设计说明书
可以调控的走马灯
1概述
1.1可控走马灯的意义
众所周知,走马灯以其绚丽的色彩赢得人们喜爱,在人们的日常生活中很常见,并在一些特定的节日里,重要场合中起着绚烂节日气氛,带给人们欢乐的作用。
可以调控的走马灯打破常规走马灯闪烁固定变化的现状,可根据人们不同的意愿进行编程设计出想要的变换的色彩效果。
1.2可控走马灯的发展和现状
当前,可以调控的走马灯广泛应用于各种商业场所,娱乐场所,以及建筑物的装饰等多种场合。
可以说,可控走马灯技术的应用已渗透大到世界博览会,奥林匹克开幕式,小到节日彩灯装饰。
深入研究可控走马灯是产品提高档次和推陈出新的有效途径。
纵观单片机的发展过程,可以预示走马灯的发展趋势,单片机的发展趋势如下:
低功耗CMOS化
MCS-51系列的80C51推出时的功耗达120mW,而现在的单片机普遍都在100mW左右,随着对单片机功耗要求越来越低,现在的各个单片机制造商基本都采用了CMOS(互补金属氧化物半导体工艺)。
CMOS虽然功耗较低,但由于其物理特征决定其工作速度不够高,而CHMOS则具备了高速和低功耗的特点,更适合于在要求低功耗像电池供电的应用场合。
所以这种工艺将是今后一段时期单片机发展的主要途径。
微型单片化
常规的单片机普遍都是将中央处理器(CPU)、随机存取数据存储(RAM)、只读程序存储器(ROM)、并行和串行通信接口,中断系统、定时电路、时钟电路集成在一块单一的芯片上,增强型的单片机集成了如A/D转换器、PMW(脉宽调制电路)、WDT(看门狗)、有些单片机将LCD(液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就越强大。
主流与多品种共存
现在虽然单片机的品种繁多,各具特色,但仍以MCS-51为核心的单片机占主流,兼容其结构和指令系统的有PHILIPS公司的产品,ATMEL公司的产品和中国台湾的WinBond系列单片机。
以8031为核心的单片机占据了半壁江山,在一定的时期内,这种情形将得以延续,将不存在某个单片机一统天下的垄断局面,走的是依存互补,相辅相成、共同发展的道路。
2.课题方案设计
2.1系统总体设计要求
显示效果使用16个LED;
设置三个按键,K1-模式键,通过按键调整显示结果,要求有8种模式;K2-加速键,提高走马灯显示效果的速度;K3-减速键,放慢走马灯的显示效果速度;
8种模式通过一个共阳型数码管显示出来,比如,走马灯的显示效果为模式一时,数码管显示数字“1”。
图2-1可控走马灯系统结构框图
2.2设计方案论证
根据设计内容要求,提出了如下方案:
本电路直接采用单片机配合数码管,按钮LED小灯,直接实现功能,主要取决于软件程序的设计。
采用的40脚、片内带8kBFlashROM的STC89C52单片机作为控制核心,采用两组高亮黄色二极管作为指示灯,采用四组一组一位LED数码管作为模式转化显示器,LED显示采用动态扫描方式,以节省端口数。
按照这种结构设计,单片机端口不需要外部扩展,资源刚好满足要求。
3.系统硬件设计
3.1总体设计
通过模式键改变单片机的工作模式,进行程序控制,一共八个模式。
LED灯工作在不同的模式下有不同的现象。
加速减速按钮来控制灯泡的闪亮快慢。
复位电路用来初始化芯片的状态。
对基于单片机的走马灯控制系统进行设计。
所设计的系统为:
以MCS-51系列单片机作为控制核心。
单片机执行指令是在时钟脉冲控制下进行的。
因此单片机必须外接振荡器构成时钟电路才能正常工作,另外,还应在单片机的RES端外接电阻电容构成复位电路,当单片机运行错误时可以给一个复位信号使其复位。
单片机对接口电路的控制是由软件向单片机的I/O口来实现的。
STC89C52单片机内部有两个定时/计数器,可以用其中的一个定时器来对时间进行计数,而另一个可以对显示器延时进行定时并通过中断把相应的数据通过I/O口送给显示器显示。
同时通过对外部按键的状态判断来进行时间的调整。
晶振
晶振
图3-1总电路的原理框图
3.2单片机运行的最小系统
1电源;
电源电路采用的是USB母口,提供+5V的电压。
其有四个引脚,1引脚接的是电源,4引脚接地。
由于USB接口使用的是开关电源,不是很稳定的。
接10UF的去耦电容起到缓冲的作用,可以得到稳定的+5V电压。
把电流比做水流,水流很急,但去耦电容就像一条水沟,可以缓冲水流。
电容的作用是蓄能的作用。
图3-2-1电源电路
2晶振;
晶振为单片机提供时钟信号。
图3-2-2晶振电路
3复位电路。
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:
手动按钮复位和上电复位。
图3-2-3复位电路
3.3按键电路
按键用独立式按键表示。
图3-3按键模块
3.4LED显示模块
LED显示模块采用16个发光二极管并联在电源上,其中一边8个二极管接在P1口上,另外8个二极管接在P0口,上拉电阻与之分别并联。
图3-4LED显示模块
3.5数码管显示模块
发光二极管显示管简称LED,具有结构简单、价格低廉、使用方便、耗电少、与单片机接口容易等特点,在单片机应用系统使用非常普遍,一位共阳数码管结构如下。
图3-5-1一位共阳数码管
LED数码显示器由七段条形的发光二极管组成“”字形显示字段,用一只圆形的发光二极管做小数点。
LED数码显示器中,通常将各段发光二极管的阴极或阳极连在一起做公共端,这样可以使驱动电路简单。
共阳极数码管是指发光二极管的阳极都与正极接在一起,引脚接输出端,故低电平有效,其原理图如下;
图3-5-2共阳极数码管原理图
共阳极的管脚示意图如下;
图3-5-3共阳极管脚示意图
要使LED数码管显示数字,只要点亮相应字段的发光二极管即可。
如要显示“1”,点亮b、c段;要显示“0”,点亮a、b、c、d、e、f段。
从图中不难看出,对于共阳极数码管,点亮字段则用低电平“0”来表示,所以低电平有效。
这样我们就可以把要显示的数字与一串二进制代码对应起来,即对LED数码显示器实现编码。
由于这种编码是与显示器结构相对应的,因此不考虑小数点的编码只有七位,常称为七段显示码;
如果对小数点也进行编码,则称为八段显示码。
常用字符的八段显示码如下图所示;
图3-5-4常用字符的八段显示码
分为共阴显示码和共阳显示码两种。
图3-5-5数码管显示模块
4.系统软件的设计
本课程设计是采用89C52单片机设计的可以调控的跑马灯,通过keil进行c语言编程,通过protues进行软件硬件仿真。
本设计成果,主要通过按键开关对跑马灯进行控制,包括跑马灯模式的选择、跑马灯模式的显示、跑马灯速度变化控制。
定时器中断延时程序设计:
采用delay()函数进行的延时是不精确的,主要有以下两个原因。
(1)该类型的delay()函数采用的延时是通过对变量进行递减或递增实现的,很难计算精确的延时时间。
(2)由于跑马灯的状态函数和延时函数是和主任务耦合到一起的,因此主任务的执行时间要对延时的时间产生影响。
假设一个跑马灯的延时函数的延时时间是1s,但是由于主函数可能存在不同的分支,因此当主函数执行不同分支程序时,实际的跑马灯延时时间是不一样的。
流程图如下图4-1所示。
图4-1流程图
采用中断来进行跑马灯的状态更换有以下几个优点。
(1)采用中断函数进行延时,可以精确保证延时的精度,即有效地保证跑马灯状态更换的频率;
(2)采用中断函数进行跑马灯状态的更换,在进行延时期间,并不占用单片机资源,单片机可以执行其他的任务。
5软硬件联调及调试结果
5.1软硬件调试中出现的问题及解决措施
硬件调试
单片机基础电路包括电源、单片机、外部时钟震荡电路、复位电路和外部接口电路。
调试过程需要注意以下几点:
(1).检查电源是否完好。
(2).单片机电源要连接正确,并且保证STC89C51的31号引脚接高电平。
STC89C51的31号引脚是外部程序存储器选择信号端,当该引脚为高电平时,单片机会一直从片内程序存储器内取指令。
(3).如果使用P0口做I/O口,要接上拉电阻。
(4).使用万用表排查电路中是否存在断路或者短路情况。
笔者在制作外部接口电路时使用的是排针,焊接时容易出现管脚之间短路,所以在上电以前必须先排查电路。
(5).编辑一个简单程序,上电运行,检查单片机是否正常工作,复位电路是否正确。
软件调试
软件调试相对比较简单,但是要掌握仿真软件的用法,首先在仿真软件(Proteus)上建立仿真模型(电路图),然后用KeilC编程序和Proteus进行联机仿真调试,分别对显示、按键、时钟等各个部分进行调试,检测电路原理图的正确与否。
5.2实物图
图5-2-1实物图正面
图5-2-2实物图反面
5.3调试结果
可控走马灯7种显示模式如下,效果理想。
图5-3调试结果图
结束语:
通过学习单片机这门课程设计,不仅了解了STC89c52的功能、还加强了单片机的理论知识得了解,而且进一步接触并了解到了软硬件的结合这个实践问题。
不仅如此,此次设计也加强了我们动手培养了我的动手能力及分析思考和解决问题的能力,更令我的创造性思维得到拓展。
本次课程设计,我们有以下几点切身体会:
1.要注意细节。
细节决定成败,这句话在这次课题中不仅一次得到了印证,特别是小系统制作过程中,一点点的错误就会使你整个电路板不能运行。
因此我们不仅仅要有整体意识,也要注意细节,不要因一个关键地方的一个细节而导致满盘皆输。
2.要与同学们互相沟通,交流。
第一次做单片机课程设计,难免会遇到各种各样的问题,因此我们遇到问题,就要积极地与同学交流,必要时向老师请教。
遇到的问题
1、刚着手此设计时,不知道如何下手,但经过老师的指导及自己查阅相关的资料,逐渐有了自己的设计想法,制定出了系统的结构框图。
2、软件设计是耗时最长的一项,涉及到整个系统工作的稳定性。
我们首先编写总体框架,然后做简单的测试,保证能正常运行,接下来编写单个的子状态程序,写完一个测试一个,这样保证了最后调试的成功率。
在编写程序过程中需要很好的编写习惯,结构要明显,标明注释,随时存档,程序尽量简约。
另外要兼顾到硬件结构,尽量使得硬件结构简单,所用资源更少。
3、焊接时,由于对焊接的不熟练,经常会使两条电锡焊线不经意间连接在一起,所以要多用万用电表测试,一个模块一个模块的焊接,在进行测试,这样出错的概率会小很多,刚开始时就是从头焊到尾,结果错了却不知道从何检查起。
所以焊接时应该一个子模块一个子模块的焊接,并且布线要简单明了,尽量不要用飞线,这样才能够保证实物的成功率。
否则到了后期,很难检测出实物的问题。
4、第一次做出实物时,发现流水灯全亮,却没有闪烁,这与软件仿真的结果大不同。
于是,我找来了一块C52试验开发板,用来调试器件。
希望以此发现问题。
在C52试验开发板上我发现必须加晶振才能够正常工作,于是,在电路板上加上了晶振,最后,实现了电路板的正常工作。
5、实物做出来,验证成功后。
过了几天,我在装上芯片发现现实上出现了一个小问题,刚开始时,我以为是布线太密了,有焊锡不经意间连在一起了,可是用万用电表测试后,却没有发现焊锡连在一起的问题。
我百思不得其解,最后我想到实物成功时,底座摇杆对芯片的影响,认为是底座出现来了问题。
经调试,确实是底座的问题,底座不是很紧,芯片的引脚不能很好的了解。
参考文献:
【1】肖洪兵.跟我学用单片机.北京:
北京航空航天大学出版社,2002.8
【2】《单片机C语言程序设计实训100例—基于8051+Proteus仿真》
【3】赵晓安.MCS-51单片机原理及应用.天津:
天津大学出版社,2001.3
【4】李广第.单片机基础.第1版.北京:
北京航空航天大学出版社,1999
【5】徐惠民、安德宁.单片微型计算机原理接口与应用.第1版.北京:
北京邮电大学出版社,1996
附录:
附录1:
可以调控的走马灯原理图
图6-1可以调控的走马灯原理图
附录2:
可以调控的走马灯PCB图
图6-2可以调控的走马灯PCB图
附录3:
Ptoteuse仿真图
图6-3Ptoteuse仿真图
附录4:
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(++tCount tCount=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); } } 附录5: 可控走马灯元件清单表 元件序号 类别 主要参数 数量 R1—R16 色环电阻 220Ω 16 R17 色环电阻 10KΩ 1 R18-R26 色环电阻 500Ω 8 X1 晶振 12MHz 1 C1、C2 陶瓷电容 30pF 2 C3 电解电容 10μF 1 U1 单片机 STC89C51 1 D1~D17 发光二极管 LED(黄色) 17 DC2.1 电源插座 ULN2803 2 RN1 排阻 A102J 3 S1~S4 按键 6×6×6 4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可以 调控 走马灯