LED流水灯设计单片机控制.docx

上传人:b****8 文档编号:11239933 上传时间:2023-02-26 格式:DOCX 页数:14 大小:618KB
下载 相关 举报
LED流水灯设计单片机控制.docx_第1页
第1页 / 共14页
LED流水灯设计单片机控制.docx_第2页
第2页 / 共14页
LED流水灯设计单片机控制.docx_第3页
第3页 / 共14页
LED流水灯设计单片机控制.docx_第4页
第4页 / 共14页
LED流水灯设计单片机控制.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

LED流水灯设计单片机控制.docx

《LED流水灯设计单片机控制.docx》由会员分享,可在线阅读,更多相关《LED流水灯设计单片机控制.docx(14页珍藏版)》请在冰豆网上搜索。

LED流水灯设计单片机控制.docx

LED流水灯设计单片机控制

《微机应用系统设计与综合实验(实践)》

课程设计实验报告

实验课题

LED霓虹灯设计

姓名

学号

班级

指导老师

第一章设计概述3

1.1设计任务3

1.2设备器材3

第二章硬件设计方案3

2.1设计思想3

2.2硬件选择4

2.3AT89C52单片机介绍4

2.4硬件逻辑图7

2.5设计连线8

2.6仿真电路图8

第三章软件设计方案8

3.1软件设计思想8

3.2程序流程图9

第四章调试及运行结果10

第五章设计心得与体会10

参考资料11

11

源程序清单

第一章设计概述

1.1设计任务

设计内容:

利用汇编语言(或C语言),实现8个单色LED灯的左、右循环显示,并实现循环的速度可调。

选用芯片:

8255等

注:

由于实验室的没有提供8255芯片,所以改用单片机完成此实验,并且添加了调节灯明暗的功能,以实现明暗可调。

1.2设备器材

在本设计中,所用到的设备器材如下所示:

(1)计算机一台;

(2)唐都仪器实验箱一台;

(3)AT89C52单片机一片;

(4)导线若干。

第二章硬件设计方案

2.1设计思路

本课题需要用按钮开关实现流水灯的左右循环显示、调速、控制亮度的功能。

可以选用五个开关来实现这些操作。

单片机正在软件运行下通过不断扫描开关状态,来将相关操作对应量送入单片机的输入端口,然后判断属于哪一类操作。

五个开关分别为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的内部结构图如下:

引脚图如下:

引脚功能说明:

PO口:

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),

参见表1O

Flash编程和程序校验期间,P1接收低8位地址

表.P1.0和P1.1的第二功能

引脚号

功能特性

1

P1.0

T2,时钟输出

P1.1

T2EX(定时/

计数器2)

P2口:

P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出

缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对端口P2写“1”通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)o在访问外部程序存储器或16位地址的外部数据存储器(例如执行

MOVX@DPTR指令)时,P2口送出高8位地址数据。

在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器

的内容。

Flash编程或校验时,P2亦接收高位地址和一些控制信号。

P3口:

P3口是一组带有内部上拉电阻的8位双向I/O口。

P3口输

出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对P3口写入“T时,它们被内部上拉电阻拉高并可作为输入端口。

此时,被外部拉低的P3口

将用上拉电阻输出电流(IIL)oP3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。

P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

RST:

复位输入。

当振荡器工作时,RST引脚出现两个机器周期以上高

电平将使单片机复位。

ALE/PROG:

当访问外部程序存储器或数据存储器时,ALE(地址锁存

允许)输出脉冲用于锁存地址的低8位字节。

一般情况下,ALE仍以时钟

振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。

要注意的是:

每当访问外部数据存储器时将跳过一个ALE脉冲。

PROG)o如

对Flash存储器编程期间,该引脚还用于输入编程脉冲(

有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的DO位置位,

可禁止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.5设计连线

本实验的连线为:

开关使用唐都试验箱上的5个开关,分别接到单片机的

P1.0—P1.7口

P2.0-P2.4口,然后发光二极管分别接到单片机的

2.6实验仿真电路图

第三章软件设计方案

3.1软件设计思想

一个完整的系统仅有硬件是不够的,还要有软件的配合。

软件和硬件对一个系统来说都是不可或缺的。

本实验采用C语言编程,在具体设计中,通过GetKey()函数来不停的扫描开关的状态,通过KeyProcess()来确定输入的信号,即按键的位置,从而执行不同的子程序内容,实现LED灯的控制。

加速谎动

减速流动

3.2程序流程图

HD灯谎动运行

第四章调试及运行结果

通过设计和编写程序代码,讲程序通过Keil软件编译后生成的hex文件写进AT89C52中,便可操作。

为当拨动相应的开关时,看LED灯的变化。

调试过程中问题很多,主要原因是对单片机结构的不熟悉,其次就是程序中的一些问题。

但通过努力,都被一一解决。

实际接线前我们先用protues仿真了

一下实验结果,确认无误后接线,这样提高了调试的时间。

第五章心得体会

经过四次的上机课程设计,在我和**同学的共同努力下,顺利的完成了任务,并在其中体现了自己的独创部分。

同时我感觉自己学到了很多。

首先是要把理论和实际相结合起来,从理论中得出结论,然后再实践,从而提高自己的实际动手能力和独立思考问题的能力。

在设计的过程中遇到了很多的问题,也发现了自己的不足之处。

首先是之前对单片机并不十分了解,通过借阅书籍,找同学咨询慢慢的开始对其有了初步的认识。

其次是一些相关软件的用法,这个通过自己慢慢的摸索也逐渐熟悉了起来。

特别是protues的使用,它给了我们很大的帮助,帮助我们解决了很多调试过程中的问题。

在者是对PWM波的使用,这个问题很是伤到筋,因为之前对其并不了解,从熟悉到使用我们查阅了很多资料,请教了同学,最后终于掌握了。

同时也是设计更完善。

此课程设计让我加深理解了所学的理论知识,并进一步建立了计算机应用系统的整体概念,初步掌握了单片机软、硬件开发方法,为以后进行实际的单片机软、硬件应用开发奠定了良好的基础。

这对下学期单片机的学习会有很大的帮助,也使我对单片机产生了兴趣。

这次课程设计的顺利完成,离不开学长,同学和知道老师的帮助,特别是PWM波的运用,也是学长给我们提出的建议。

在此感谢老师和学长的无私帮助。

附录一参考文献

[1]《单片机原理及其接口技术》胡汉才编著北京:

清华大学出版社

[2]《MCS-51单片机原理及应用》张毅刚编著哈尔滨:

哈尔滨工业大学出版社

[3]《51单片机C语言应用程序设计实例精讲》(第二版)戴佳刘博文编著电子工业出版社

附录一C语言程序清单

/************************************************************/

*/

*/

*/

/*程序名:

可控流水灯

/*功能:

实现流水灯的方向、速度、亮度控制

********************************************************

/*硬件:

P2接开关,P1接LED

#include

#include

sbitK仁P2A0;

//方向

sbitK2=P2A1;

//加速

sbitK3=P2A2;

//减速

sbitK4=P2A3;

//加亮

sbitK5=P2A4;

//变暗

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;break;

case0xFB:

K=3;break;

case0xF7:

K=4;break;

case0xEF:

K=5;break;default:

K=0;break;

}

while(P2!

=0xFF);//等待释放按键returnK;

}

voidKeyProcess(unsignedcharKey)

{

switch(Key)

{

case1:

Dirtect=~Dirtect;break;//方向

case2:

if(Idx>1)Speed=sTable[--Idx];break;//加速

case3:

if(Idx<15)Speed=sTable[++Idx];break;//减速

case4:

duty++;if(duty>=20)duty=20;break;//加亮

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);}

}

**************************************************************

/****************************************************************

voidInitTimer0_Timer1(void)

{

TMOD=0x20;

TH1=0x06;

TL1=0x06;

EA=1;

ET0=1;

TR0=1;

ET1=1;

TR1=1;

}

/******************************************************************/

/*定时器中断函数*/

/******************************************************************/

voidtimer0(void)interrupt1

{

if(++tCount

tCount=0;

LED

if(Dirtect==1)LED=_cror_(LED,1);//循环右移1位,点亮下一个

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小学作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1