基于单片机的流水灯系统设计与实现Word文件下载.docx
《基于单片机的流水灯系统设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的流水灯系统设计与实现Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
众多的寄存器以及片内数据存储器都可参加多种运算。
这些内核指令均为单周期指令,功能强,运行的速度快。
图2单片机选型模块
3.2LED流水灯模块
要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
且每一个LED灯于一个电阻串联。
电阻的作用就是对通过LED灯的电流进行一定的限制起到去LED灯进行的保护作用。
使得其在高电压的时候使得LED在电阻的保护下不会烧坏。
此图为共阴极接法,因此当LED_RED给高电平“1”时LED_RED亮;
当LED_RED给低电平“0”时,LED_RED灭。
图3LED流水灯模块图
如图3可知此原理图的LED灯为共阴极的接法,因此我们只要给它一个高电平就能点亮此LED灯。
3.3功能模式选择模块
此设计有6种功能模式可以选择:
功能
(1):
○○○○○○○●○○○○○○●●○○○○○●●●○○○○●●●●
○○○○○○●●○○○●●●●●
○○○○○●●●○○●●●●●●
○○○○●●●●○●●●●●●●
○○○●●●●●○○●●●●●●○●●●●●●●●●●●●●●●
功能
(2):
○○○○○○○●○○○○○○●○○○○○○●○○○○○○●○○○
○○○○○○●○○○○●○○○○
○○○○○●○○○○●○○○○○
○○○○●○○○○●○○○○○○
○○○●○○○○○○●○○○○○○●○○○○○○●○○○○○○○
图4流水灯的功能示意图
4软件设计
4.1主程序
本系统整体工作主要由单片机程序控制实现,其工作过程为:
对端口进行初始化,在主程序中用不同的端口定义分别来点亮流水灯。
再用switch语句来对不同的LED灯进行不同类型的流水灯效果。
在用延时程序来实现每一个LED的亮灭。
程序整体框架如下图5所示。
图5程序流程图
4.2子程序
一个完整的程序是由一个主程序和若干个子程序组成。
在一个加工程序中,如果其中有些加工内容完全相同或相似,为了简化程序,可以把这些重复的程序段单独列出,并按一定的格式编写成子程序。
主程序在执行过程中如果需要某一子程序,通过调用指令来调用该子程序,子程序执行完后又返回到主程序,继续执行后面的程序段。
本系统中所使用的子程序都是比较简单的,用for语句实现循环之后再使用延时函数进行延时。
子函数的功能流程图如下:
功能1流程图:
功能2流程图:
图6功能程序流程框架图
5系统调试
本单片机的流水灯系统的设计分为硬件电路设计和软件设计两个部分,因此调试也分成两部分进行调试。
5.1硬件调试
主要根据系统框图和硬件原理设计进行原理的绘制、各参数的设置、电路板的制作,以及元器件的焊接等。
具体如下:
5.1.1各单元电路,确认各单元电路链接无误,尤其是关键元器件,一定要接保护电阻。
(1)选择合适规格的元器件,在放置期间前一定要检查规格;
(2)关键器件放置:
在器件布置方面与其它逻辑电路一样,应把相互有关的器件尽量放靠近些,这样可以减少材料,更加美观。
5.1.2PCB设计原则:
在进行PCB设计时,必须遵守PCB设计的一般原则,并应符合要实现的效果设计的要求。
(1)尽量采用印制电路板,印制电路板不像万用板一样会有一定的接触不好或者焊盘不稳和线路连接有问题的情况,印制电路板的制作可防止产生地电位差和元件之间的耦合。
(2)元件面和焊接面应采用相互垂直、斜交、或者弯曲走线,避免相互平导线尽量短,使用45°
或者圆弧折线布线,不要使用90°
折线,以减小高频信号的发射。
5.2程序调试
在本系统中,主要分为主程序部分、中断程序、子程序等。
在调试过程中,按照程序功能一项项进行调试,首先确认主程序正确,在确认其他程序。
调试方法主要跟踪调试、断点调试等等,可以参考相关专业书籍。
5.1.1CCSV5的打开步骤
(1)右键CodeComposerStudiov5快捷方式,左键打开。
会出现如图6所示界面:
图6CodeComposerStudiov5软件加载界面
(2)加载完毕之后会有如图7所示界面出现:
图7CodeComposerStudiov5软件打开界面
(3)选择Project->
ImportExistingCCSEclipseProject,导入程序文件夹中的工程;
具体操作如图8:
图8CodeComposerStudiov5程序导入步骤图
5.3联合调试
整个系统的软硬件都完成后,需要进行联合调试,主要是针对系统设定的功能能否完成和完善进行调试。
调试步骤:
(1)将PC和硬件电路通过USB线相连;
(2)选择
对该工程进行编译链接,生成.out文件。
然后选择
,将程序下载到实验板中。
程序下载完毕之后,可以选择全速运行程序,也可以选择
单步调试程序,选择F3查看具体函数。
也可以程序下载之后,按下
,软件界面恢复到原编辑程序的画面。
再按下实验板的复位键,运行程序。
(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)
图9联合调试效果图
6外延
花样流水灯的流水方式各式各样,因此我们在以上功能基础上,还能将程序稍作修改,使之有如下花样流水效果。
(1)在以上功能下,当再次按下此按键后,执行8个LED灯从中间2个开始每隔0.2s向左右两边依次点亮,直到8个LED灯全亮,再由两边开始灭,直到全灭以此循环;
(2)第三次按下此按键之后,执行与上次相反的效果,以此循环;
(3)第四次按下此按键之后,8个LED灯同时闪烁,时间间隔为0.1s;
(4)第五次按下按键之后,依次执行前面五个程序的效果,以此循环。
以上花样流水灯的流水功能如图10,功能(4)是前面几种功能集中的效果。
○○○○○○○○○○○●●○○○○○●●●●○○○●●●●●●○
○○○●●○○○○○●●●●○○○●●●●●●○●●●●●●●●
●○○○○○○●●●○○○○●●●●●○○●●●●●●●●●●●
○○○○○○○○●○○○○○○●●●○○○○●●●●●○○●●●
功能(3):
●●●●●●●●
○○○○○○○○
图10流水灯的功能示意图
功能2流程图:
功能3流程图:
图11功能程序流程框架图
7项目演练
对于本设计,尚可以进一步进行如下设计:
(1)设计一个心形呼吸流水灯
设计思路如下:
运用MSP430g2553单片机(28PIN、TSSOP封装)、74HC573锁存器(20PIN、SOIC封装)、TLV117稳压组成。
主要原理是利用430单片机产生PWM信号,通过573的使能控制一定数量的LED产生同节奏的“呼吸”效果。
通过对产生PWM信号的寄存器的设置,可以得到程度不同的“呼吸”效果。
(2)如今大多数电子产品都是触碰式按键,可以把流水灯的按键设计成触摸式,实现商品现代化;
8项目总结
基于单片机的流水灯系统设计与实现,充分运用了LED灯通过MSP430单片机为控制核心,多个中断程序控制其亮灭,来实现多样化的亮灭样式,从而使单一的LED灯变得多元化。
主要利用的知识点有中断操作、单片机原理知识等,并利用C语言编程,最后制作出一个完善的作品,该作品再经过一定的功能完善和外观制作,符合现代化商场和各市场的装饰,更有利于推广。
附录1电路设计原理图(参考)
附录2PCB设计原理图(参考)
附录3关键程序(参考)
功能
(1)子程序:
voideffect1()
{
inti,j;
for(i=0;
i<
=8;
i++)
{
P2OUT|=(1<
<
i);
//1左移i位
delay_ms(200);
//延时200MS
}
for(j=0;
j<
8;
j++)
{//0x80右移j位
P2OUT&
=~(0x80>
>
j);
}
功能
(2)子程序:
voideffect2()
P2OUT=(1<
P2OUT=(0x80>
//0x80右移j位
主程序:
voidmain(void)
WDTCTL=WDTPW+WDTHOLD;
//关闭看门狗
Clock_init();
//时钟设置子程序
IO_init();
//IO口子程序
//_EINT();
__enable_interrupt();
//中断控制开启
while
(1)
switch(a)
case1:
effect1();
break;
//a==1执行效果1
case2:
effect2();
//a==2执行效果2
case3:
effect3();
//a==3执行效果3
case4:
effect4();
//a==4执行效果4
case5:
effect5();
//a==5执行效果5
case6:
effect6();
//a==6执行效果6
default:
P2OUT&
=~0XFF;
//a为其他结果时P2口清零
#pragmavector=PORT1_VECTOR
__interruptvoidPort_1(void)
//判断P1.3按键是否按下
if(!
(P1IN&
BIT3))
{
delay_ms(100);
//延时消抖
if(!
{
a++;
}
if(a==7)
{
a=0;
}
}
P1IFG&
=~(BIT3);
//消除中断标志
外延功能
(1)子程序:
voideffect3()
=4;
P2OUT|=(BIT4<
i)+(BIT3>
//BIT4左移i位BIT3右移i位
=~((0x01<
j)+(0x80>
j));
//0x01左移j位0x50右移j位
delay_ms(200);
外延功能
(2)子程序:
voideffect4()
P2OUT|=(0x01<
i)+(0x80>
//0x01右移i位0x80右移i位
=~((0x10<
j)+(0x08>
//0x10左移j位0x08右移j位
外延功能(3)子程序:
voideffect5()
inti;
P2OUT^=0XFF;
//状态反转
delay_ms(100);
//延时100MS
外延功能(4)子程序:
voideffect6()
inta=0;