基于单片机的LED流星雨设计Word下载.docx
- 文档编号:21612561
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:13
- 大小:205.42KB
基于单片机的LED流星雨设计Word下载.docx
《基于单片机的LED流星雨设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的LED流星雨设计Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
2.1设计思想………………………………………………………………………2
2.2硬件选择………………………………………………………………2
2.3AT89C52单片机介绍…………………………………………………………2
2.4硬件逻辑图……………………………………………………………5
2.5设计连线………………………………………………………………………6
2.6仿真电路图……………………………………………………………………6
第三章软件设计方案……………………………………………………………7
3.1软件设计思想…………………………………………………………………7
3.2程序流程图……………………………………………………………………8
第四章调试及运行结果…………………………………………………………9
第五章设计心得与体会………………………………………………………10附录一参考资料1
附录二源程序清单…………………………………………………………………………11
、
第一章简介
1.1概述
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本操作;
单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。
为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件——存储器中。
存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。
程序通常是顺序执行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是程序计数器PC(包含在CPU中),在开始执行程序时,给PC赋以程序中第一条指令所在的地址,然后取得每一条要执行的命令,PC在中的内容就会自动增加,增加量由本条指令长度决定,可能是1、2或3,以指向下一条指令的起始地址,保证指令顺序执行。
利用单片机,实现8个单色LED灯的左、右循环显示,并实现循环的速度可调。
选用芯片:
8255等
注:
由于实验室的没有提供8255芯片,所以改用单片机完成此实验,并且添加了调节灯明暗的功能,以实现明暗可调。
1.2主要内容要求
基于W79E2051单片机和LED恒流专用驱动芯片MBI5026设计了一款模拟流星雨LED控制电路,LED使用高亮白色,可根据需要接上36,48,64颗LED,通上电源,一字型排开的LED,会产生从上到下,从最亮的到渐暗的流星雨效果,效果逼真,可作为屋外,广场装饰灯.
在本设计中,所用到的设备器材如下所示:
(1)计算机一台;
(2)唐都仪器实验箱一台;
(3)AT89C52单片机一片;
(4)导线若干。
第二章硬件设计方案
2.1设计思路
本课题需要用按钮开关实现LED流星雨灯的左右循环显示、调速、控制亮度的功能。
可以选用五个开关来实现这些操作。
单片机正在软件运行下通过不断扫描开关状态,来将相关操作对应量送入单片机的输入端口,然后判断属于哪一类操作。
五个开关分别为K1,K2,K3,K4,K5,分别控制流水灯的调向、加速、减速、变亮、变暗。
在设计过程中,接开关的端口要全部保持高电平,当按下一个开关时,输入一个低电平,即为状态改变信号。
不能同时有两个端口同为高电平。
在设计中我主要负责了用云脉冲宽度调制(PWM)波控制LED灯的亮度环节,开始对PWM并不是很了解,通过请教同学和查阅相关资料,渐渐明白了其中的原理。
在主程序运行时通过中断方式调整其输出电压的占空比,从而改变灯泡的亮度。
原理是这样的,主程序的始终频率和中断的始终频率并不相同,大约是中断的一千倍,LED灯在移动时如果响应了中断,则在执行中断程序时,LED灯近似看做没有移动,此时在中断程序中设计一个初值和一个上限,当计数到初值时置灯泡灭掉,在计数到上限之前小灯泡都是熄灭的,到达上限后回0,并置灯泡为亮,继续计数,在到设定的初值时置小灯泡为灭掉。
这样在主程序的一个周期内,中断程序将小灯泡置明置暗了近一千次,通过改变设定的初值可以改变小灯泡的亮度。
2.2硬件选择
本实验选用AT89C52单片机、五个按键开关和8个发光二极管。
其中AT89C52为控制核心,当5个开关的状态改变时,单片机检测到开关信号后就通过软件输出控制发光二极管。
2.3AT89C52单片机介绍
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线。
AT89C52的内部结构图如下:
引脚图如下:
图2-2
引脚功能说明:
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),
参见表1。
Flash编程和程序校验期间,P1接收低8位地址。
表.P1.0和P1.1的第二功能
引脚号
功能特性
P1.0
T2,时钟输出
P1.1
T2EX(定时/计数器2)
图2-3
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN:
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:
外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:
振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:
振荡器反相放大器的输出端。
2.4硬件连接框图
单片机从开关上提取不同输入信号,进行相应的软件操作,反映输出在发光二极管上。
图2-4
2.5设计连线
本实验的连线为:
开关使用唐都试验箱上的5个开关,分别接到单片机的P2.0—P2.4口,然后发光二极管分别接到单片机的P1.0—P1.7口。
2.6实验仿真电路图
第三章软件设计方案
3.1软件设计思想
一个完整的系统仅有硬件是不够的,还要有软件的配合。
软件和硬件对一个系统来说都是不可或缺的。
本实验采用C语言编程,在具体设计中,通过GetKey()函数来不停的扫描开关的状态,通过KeyProcess()来确定输入的信号,即按键的位置,从而执行不同的子程序内容,实现LED灯的控制。
3.2/*程序名:
可控流星雨灯*/
/*功能:
实现流水灯的方向、速度、亮度控制*/
/*硬件:
P2接开关,P1接LED*/
/************************************************************/
#include<
reg52.h>
#include<
intrins.h>
sbitK1=P2^0;
//方向
sbitK2=P2^1;
//加速
sbitK3=P2^2;
//减速
sbitK4=P2^3;
//加亮
sbitK5=P2^4;
//变暗
unsignedcharSpeed,LED;
unsignedinttCount=0;
unsignedcharIdx;
//速度取值索引
bitDirtect=1;
//滚动方向
charduty=10;
//占空比
unsignedintcodesTable[]={0,1,3,7,9,15,30,50,100,200,230,280,300,350};
//调速表
voidInitTimer0_Timer1(void);
voiddelay(unsignedintx)
{
unsignedchari;
while(x--)for(i=0;
i<
20;
i++);
}
unsignedcharGetKey(void)
unsignedcharK;
if(P2==0xFF)return0;
delay(10);
switch(P2)
{
case0xFE:
K=1;
break;
case0xFD:
K=2;
case0xFB:
K=3;
case0xF7:
K=4;
case0xEF:
K=5;
default:
K=0;
}
while(P2!
=0xFF);
//等待释放按键
returnK;
voidKeyProcess(unsignedcharKey)
switch(Key)
case1:
Dirtect=~Dirtect;
case2:
if(Idx>
1)Speed=sTable[--Idx];
//加速
case3:
if(Idx<
15)Speed=sTable[++Idx];
//减速
case4:
duty++;
if(duty>
=20)duty=20;
case5:
duty--;
if(duty<
=0)duty=1;
break;
voidmain(void)
unsignedcharKey;
P1=P2=0xFF;
Idx=4;
Speed=sTable[Idx];
IP=0x02;
//中断优先级
InitTimer0_Timer1();
LED=0xfe;
P1=LED;
while
(1)
Key=GetKey();
if(Key!
=0)KeyProcess(Key);
/******************************************************************/
/*定时器0和定时器1初始化*/
voidInitTimer0_Timer1(void)
TMOD=0x20;
TH1=0x06;
TL1=0x06;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
/*定时器中断函数*/
voidtimer0(void)interrupt1
if(++tCount<
Speed)return;
tCount=0;
if(Dirtect==1)LED=_cror_(LED,1);
//循环右移1位,点亮下一个LED
elseLED=_crol_(LED,1);
P1=LED;
voidTimer1(void)interrupt3//调节占空比
staticchart=0;
t++;
if(t==20)
t=0;
P1=(0x00|LED);
if(duty==t)P1=0xFF;
程序流程图
第四章调试及运行结果
当上述程序之一编写好以后,我们需要使用编译软件对其编译,得到单片机所能识别的二进制代码,然后再用编程器将二进制代码烧写到AT89C51单片机中,最后连接好电路通电,我们就看到LED1~LED8的“流水”效果了。
本文所给程序实现的功能比较简单,旨在抛砖引玉,用户可以自己在此基础上扩展更复杂的流水灯控制,比如键盘控制流水花样、控制流水灯显示数字或图案等等。
通过设计和编写程序代码,讲程序通过Keil软件编译后生成的hex文件写进AT89C52中,便可操作。
为当拨动相应的开关时,看LED灯的变化。
调试过程中问题很多,主要原因是对单片机结构的不熟悉,其次就是程序中的一些问题。
但通过努力,都被一一解决。
实际接线前我们先用protues仿真了一下实验结果,确认无误后接线,这样提高了调试的时间。
第五章心得体会
经过四次的上机课程设计,在我和**同学的共同努力下,顺利的完成了任务,并在其中体现了自己的独创部分。
同时我感觉自己学到了很多。
首先是要把理论和实际相结合起来,从理论中得出结论,然后再实践,从而提高自己的实际动手能力和独立思考问题的能力。
在设计的过程中遇到了很多的问题,也发现了自己的不足之处。
首先是之前对单片机并不十分了解,通过借阅书籍,找同学咨询慢慢的开始对其有了初步的认识。
其次是一些相关软件的用法,这个通过自己慢慢的摸索也逐渐熟悉了起来。
特别是protues的使用,它给了我们很大的帮助,帮助我们解决了很多调试过程中的问题。
在者是对PWM波的使用,这个问题很是伤到筋,因为之前对其并不了解,从熟悉到使用我们查阅了很多资料,请教了同学,最后终于掌握了。
同时也是设计更完善。
此毕业设计让我加深理解了所学的理论知识,并进一步建立了计算机应用系统的整体概念,初步掌握了单片机软、硬件开发方法,为以后进行实际的单片机软、硬件应用开发奠定了良好的基础。
这对下学期单片机的学习会有很大的帮助,也使我对单片机产生了兴趣。
这次课程设计的顺利完成,离不开学长,同学和知道老师的帮助,特别是PWM波的运用,也是学长给我们提出的建议。
在此感谢老师和学长的无私帮.
附录
附录一参考文献
[1]《单片机原理及其接口技术》胡汉才编著北京:
清华大学出版社
[2]《MCS-51单片机原理及应用》张毅刚编著哈尔滨:
哈尔滨工业大学出版社
[3]《51单片机C语言应用程序设计实例精讲》(第二版)戴佳刘博文编著电子工业出版社
[4]李响初.数字电路基础与应用.北京:
机械工业出版社,2008
[5]吴丙申.模拟电路基础.北京:
北京理工大学出版社,2007
........忽略此处.......
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 LED 流星雨 设计