电子说
节日彩灯控制器的设计
一、设计要求:
以单片机为核心,设计一个节日彩灯控制器:
K1—开始,按此键则灯开始流动(由上而下)。
K2—停止,按此键则停止流动,所有灯为暗。
K3—下,按此键则灯由下向上流动。
K4—交替闪烁,按此键则奇数序号灯与偶数序号灯交替闪烁。
二、方案论证:
通过查阅大量相关技术资料,并结合自己的实际知识,我提出课两种技术方案来实现该公能。下面我将首先对这两种方案的组成框图和实现原理分别进行说明,并分析比较它们的特点,然后阐述我最终选择方案的原因。
1 方案比较
彩灯控制器课分为两种方案实现。一种是利用数字逻辑电路装置控制,另一种是采用单片机控制。
1.1 方案一
根据任务要求介绍的彩灯控制电路的基本组成,可以确定彩灯控制器应由振荡器、计数/时序分配电路、移位寄存器和彩灯显示五部分组成。其框图如图所示。
1.2 方案二
本方案主要是通过对基于单片机的多控制、多闪烁方式的LED彩灯循环系统的设计,来达到本设计的要求、其硬件构成框图如图所示,以单片机为核心控制,由单片机最小系统(时钟电路、复位电路、电源)、按键控制电路、LED发光二极管和5V直流电源组成。
2 方案论证
如果采用方案一,利用数字逻辑电路装置控制,其电路不是很复杂,制作相对较容易,成本也相对较低,但可调性差,亮灯模式少而且样式单调,达不到设计任务要求或实现困难。而采用方案二,以单片机控制其优点是电路集成度高,工作原理简单,清晰明了,自定义编程,控制的图案花样多,移植性好等。
3 方案选择
综上,显然方案二各方面优于方案一,以及为了体现专业优势,本次设计采用方案二。
三、理论设计:
1、主程序设计
程序启动时跳转到键盘判断模块程序中,此程序里面包含K1—K4的按键情况判断,循环检测直到有按键按下的时候,程序转去相对应的按键的彩灯显示的模块。
2、键盘扫描程序
四、电路仿真和仿真结果分析:
1 仿真电路
1.1 时钟电路和复位电路
1.2 按键控制电路
1.3 LED显示电路
2 仿真结果分析:
此次系统设计结果较好,经Proteus软件仿真系统的调试,可检测出仿真电路正常;对应按键按下,彩灯出现不同花型,实现了多控制、多闪烁的LED彩灯循环;经以上仿真测试证实,本设计能实现设计系统要求的预期功能。
五、心得体会:
本次作业设计以C51单片机为核心,控制电路、LED显示电路、以及单片机最小系统等模块组成的核心主控制电路,实现了由单片机对LED灯的控制。
通过对软件的仿真调试,对彩灯控制器的运行成果满意,实现了题目的要求,同时此设计具有电路简单、易操作、成本小、体积小、耗能低等优点。
但是在设计中也出现了一些问题,在程序编写过程中发现自己有的知识模块模糊,导致实验速度减缓,通过c程序的编写实验就发现自己很多地方的不足,在查阅资料和同学的帮助下才解决了困难,这都是以后要多学习的地方。
单片机源程序如下:
#include
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit k1=P1^2; //位定义
sbit k2=P1^3;
sbit k3=P1^4;
sbit k4=P1^5;
uchar a=0; //定义所需变量
uchar b;
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //从上到下流水数组
uchar code table2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //从下到上流水数组
void delay_ms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void key_scan(uchar b) //按键扫描
{
if(b==1) //若K1按下
{
while(k2==1&&k3==1&&k4==1)
{
for(a=0;a<8;a++) //执行从上到下流水操作
{
P0=table1[a];
delay_ms(100);
}
a=0;
}
}
if(b==2) //若K2按下
{
while(k1==1&&k3==1&&k4==1)
{ //P0全部输出高电平,关闭LED
P0=0xff;
}
}
if(b==3) //若K3按下
{
while(k1==1&&k2==1&&k4==1)
{
for(a=0;a<8;a++) //执行从下到上流水操作
{
P0=table2[a];
delay_ms(100);
}
a=0;
}
}
if(b==4) //若K4按下
{
while(k1==1&&k2==1&&k3==1)
{
P0=0xaa; //奇偶位分别点亮
delay_ms(100);
P0=0x55;
delay_ms(100);
}
}
}
void main(void) //主函数
{
TMOD=0X01; //定时器中断初始化
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void T0_time() interrupt 1 //中断服务函数
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(k1==0)b=1;
if(k2==0)b=2;
if(k3==0)b=3;
if(k4==0)b=4;
key_scan(b);
}
复制代码
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !