单片机节日彩灯控制器设计彩灯控制器Word格式.docx
《单片机节日彩灯控制器设计彩灯控制器Word格式.docx》由会员分享,可在线阅读,更多相关《单片机节日彩灯控制器设计彩灯控制器Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
![单片机节日彩灯控制器设计彩灯控制器Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/16/ca7bddbf-f58e-48b7-896e-e45188208e95/ca7bddbf-f58e-48b7-896e-e45188208e951.gif)
正向循环
开始键按下?
是
否
停止键按下?
正向键按下?
灯全灭
反向键按下?
反向循环
图2程序流程图
2、键盘设计论证
方案一、独立式
独立式键盘是各按键相互独立,每个按键各接一根输入线,一根输入线上的按键工作状态不会影响到其他输入线上的工作状态。
因此,通过检测输入线的电平状态可以很容易判断那个键被按下了。
独立式按键电路配置灵活,软件简单,但每个按键需要占用一根输入口线,在按键数量较多时,需要较多的输入口线且电路结构复杂,故此种键盘适用于按键较少或操作速度较高的场合。
按键直接与单片机的I/O口线相接,通过读I/O口,判定I/O口线的电平状态,即可识别出按下的按键。
方案二、行列式
矩阵式键盘也称行列式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行\列的交叉点上。
如下图所示,一个4X4的行列结构可以构成一个16个按键的键盘。
很明显,在按键数量较多的场合,矩阵键盘与独立式键盘相比,要节省很多的I/O口线。
综上所述,本设计结构比较简单,所需按键较少就可以实现功能设计,故选择独立式键盘设计。
三、单元电路设计与参数计算
1、led彩灯模块设计
本设计使用PB口做输出端口来控制led灯的闪亮与灭掉,连接8个发光二极管的阴极。
8个发光二极管采用了共阳极设计,并且VCC通过pnp型三极管给二极管供电(vcc送发射极,集电极与二极管阳极连接,单片机通过PA2来控制二极管阳极电压供给)------(限流电阻R取值为1K)
具体硬件设计如下图所示:
-
2、按键模块设计
由于在单片机按键操作中,存在按键抖动的问题,会造成取值不稳定的情况,如下图即为按键操作波形:
所以必须考虑去抖动的问题,解决方法有如下两种:
●消除按键的抖动既可采用硬件方法,也可采用软件的方法。
使用硬件消抖的方式,需要在按键连接的硬件设计上增加硬件消抖电路,如采用R-S触发器或RC积分电路等。
采用硬件消抖方式增加了系统的成本,而利用软件方式消抖则是比较经济的做法,但增加了软件设计的复杂性。
●软件方式消抖的基本原理是在软件中对按键进行两次测试确认,即在第一次检测到按键按下后,间隔10ms左右再次检测该按键是否按下,只有在两次都测到按键按下时才最终确认有键按下,从而消除了抖动的影响。
由于用软件方式消抖比较方便,比较经济,而硬件消抖即复杂又不经济,所以本次设计我们采用的是软件消抖。
需特别注意的是:
在按键接口软件中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放以后,才能确定为一次完整的按键动作完成。
硬件按键设计如下:
四、总原理图及元器件清单
1.总原理图
功能说明:
※S1-开始,按此键,灯开始流动(从上到下)
※S2-停止,按此键,灯停止流动(灭灯)
※S3-上,按此键,灯从上而下流动
※S4-下,按此键,灯从下而上流动
2.元件清单
元件序号
元件说明
数量
备注
Atmega16
单片机芯片
1
R1—R9
限流电阻
9
1K
LED
发光二极管
8
KEY
按键开关
4
Q1
三极管
Pnp型
五、功能仿真实现
1、开始:
从上到下流动点亮
2、反向:
从下向上流动点亮
3、停止:
灭灯
六、安装与调试
七、结论与心得
本次课程设计既要求我们对知识掌握的牢固,又要求我们对知识能够灵活运用。
从所涉及的知识面来说,它不仅要求我们运用所学过的知识还要求我们去查找,学习,借鉴其他科目或门类的知识。
从时间上来说,这次设计的时间是最长的,因此我们有足够的时间去重新温习学过的知识,更有充足的时间去搜集学习一些我们没有涉猎过的知识。
这样不仅锻炼了我们学习新知识的能力,同时也拓宽了我们的知识面。
并且我们还有足够时间去修改我们的设计中的缺陷,这也是对我们将来走入社会独立完成一项课题的考验。
我们经过将近两周的努力,终于完成本次创新课程设计,过程虽是辛苦的,但从中我们却学到了很多东西。
首先巩固了课上学习的理论知识,对于计算机C语言的系统化整体化有了更深的认识。
整个设计过程最大的收获就是意识到理论知识扎实的重要性,实践是建立在理论之上的,平时的基础知识很重要。
另外就是合作的重要性,每个人都有他的特长一个人难免有疏漏,只有大家共同努力才能顺利的完成任务。
通过本次课程设计,提高了我们的自学能力,提高了理论联系实际的能力,把自己所学应用到实验中,对所用到的硬件有了更加深刻的理解;
同时我们更加明白团结合作、分工合作的重要性,提高了团结合作的能力与做事效率。
提高了我们克服困难的信心与决心。
八、参考文献
1.马潮编著.AVR单片机嵌入式系统原理与应用实践(第二版)北京航空航天大学出版社2011年8月。
2.周兴华编著.手把手教你学单片机C程序设计北京航空航天大学出版社2008年6月。
3、童诗白、华成英主编.模拟电子技术基础高等教育出版社。
附录:
1、设计程序代码
程序代码如下:
#include<
iom16v.h>
macros.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay_ms(uintcom)
{
uinti,j;
for(i=0;
i<
com;
i++)
for(j=0;
j<
1194;
j++);
}
ucharkey_press()
uchara;
DDRD|=0X0F;
PORTD|=0X0F;
DDRD&
=0XF0;
a=PIND;
a&
=0x0F;
if(a==0X0F)
return0;
else
return1;
ucharkey_scan()
{
uchara;
delay_ms(10);
if(key_press())
{
a=PIND;
a&
switch(a)
{
case0x0E:
a=1;
break;
case0x0D:
a=2;
case0x0B:
a=3;
case0x07:
a=4;
default:
a=16;
}
while(key_press());
}
else
returna;
voidzhengxiang(void)
unsignedinti;
8;
{
PORTB=~BIT(i);
delay_ms(255);
}
voidstop(void)
PORTA=BIT
(2);
voidfanxiang(void)
for(i=8;
i>
0;
i)
PORTB=~BIT(--i);
delay_ms(200);
}
voidmain(void)
{
uchari,j=0,a=0;
DDRA=BIT
(2);
PORTA=0x00;
DDRB=0XFF;
//PORTB=0XFF;
while
(1)
{
PORTB=0XFF;
//将LED关闭
i=key_press();
if(i)
a=key_scan();
{
case1:
zhengxiang();
j=1;
break;
case2:
//stop();
j=0;
case3:
if(j)
{zhengxiang();
case4:
if(j)
{fanxiang();
j=0;
}
2.电路板实物图
3.别人提的问题,及回答。