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