流水灯实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:基于AT89C52单片机的多模式流水灯设计——程序设计

一、概述

AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程。

P为40 脚双列直插封装的8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和X TAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义。

二、实验原理与设计方案

设计平台:

AT89C51单片机;PC机,含Keil软件平台,Proteus软件平台;单片机开发板。

如下图2为开发板:

设计思路:

本系统主要通过P1口来控制LED的闪烁,有10种模式(0~9)可供选择。通过模式按键来选择需要的闪烁方式,这里主要通过几个计数器来控制,按下一次按键,计数器加1,模式切换到下一种模式。同时利用数码管将模式显示出来。另外还有一个加速和减速的按键,系统设定有30种速度可供选择。按下一次加速键,速度计数器加1,按下一次减速键,速度计数器减1。其中加速减速主要是通过设定定时器2的定时时间来改变的,加速,减速主要是将定时器的时间加减。特别一提的是,按键的按下读取要消除抖动。

设计方案与电路模块:

要实现流水灯功能,我们只要将发光二极管LED1~LED16依次点亮、熄灭,16只LED灯便会一亮一暗的做流水灯了。在这个设计中,我们不只是单一的做向左运动或向右运动,而是设计了十个模式,而每一种模式也有30种速度可供选择,因此我们在普通的流水灯基础上增加了模式的选择功能、速度的选择功能和一个数码显示管来显示模式编号。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

该流水灯实验一共可分为六个模块:晶振电路模块、复位电路模块、数码管显示模块、AT89C 52单片机模块、功能模式选择模块、LED流水灯模块。

其中五个模块连接在AT89C52单片机上构成一个完整的系统。此系统的原理框图如图1所示:

图1

1、晶振电路模块

晶振是晶体振荡器的简称。在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率是串联谐振,较高的频率是并联谐振。由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。

晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。一般的晶振的负载电容为15p或12.5p,如果再考虑元件引脚的等效输入电容,则两个22p的电容构成晶振的振荡电路就是比较好的选择。

2、复位电路模块

这个模块主要进行复位操作。

3、LRD流水灯模块

要实现流水灯功能,我们只要将发光二极管LED1~LED16依次点亮、熄灭,16只LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。且每一个LED灯于一个电阻串联。

4、功能模式选择模块

在该模块中,我们要运用3个键,分别是模式键、加速键和减速键。因为该设计一共设有10种模式,因此模式键的功能就是选择运行哪一个模式。加速键顾名思义,是调节增加流水灯的运行速度。减速键就是减少流水灯的运行速度。

5、数码管显示模块

此模块主要是用来显示按下模式键后选择是哪个模式,其选择范围为0—9,既10个模式,因此只用一个数码管就可以了。

三、硬件电路图与流程图

1、电路图:

硬件电路图

2、消抖模块流程图

因为在按键产生高电平的时候,数码管会产生抖动。在上升沿处抖动不强烈,可以忽略。但在下降沿处抖动会很强烈,而使我们很难观察到数码管的变化,只是会看到数码管在一直闪动,因此我们需要增加延迟的时间来消除抖动。如减慢键的程序:

if(!(CheckValue&0x20)) //判断是否被按下

{

delay(5); //判断上升沿

if(!(CheckValue&0x20))

{

Key|=0x01;

delay(500); // 下降沿,消除抖动

}

else

return 0x00;

}

上升沿的抖动可以忽略,故延迟时间只是5ms,而下降沿抖动剧烈,故延迟时间给了500ms,用以消除抖动。

3、定时器中断和速度改变模块

定时器中断程序:

unsigned int TimerCount,SystemSpeed,SystemSpeedIndex;

void InitialTimer2(void)

{

T2CON = 0x00; //8位自动重装模式,设定时间,控制中断,控制流水灯速度

TH2 = RCAP2H = 0xFC; //重装值,初始值TL2 = RCAP2L = 0x18;

ET2=1; //定时器2 中断允许

TR2 = 1; //定时器2 启动

EA=1;

}

中断处理函数:

void Timer2(void) interrupt 5 using 3

{

TF2 = 0; //中断端口,中断标志清除( Timer2 必须软件清除标志)

if(++TimerCount>=SystemSpeed)

{

TimerCount = 0;

TimerEventRun();

}

}

速度改变程序:

unsigned int code SpeedCode[]={ 1, 2, 3, 5, 8, 10, 14, 17, 20, 30,

40, 50, 60, 70, 80, 90, 100, 120, 140, 160,

180, 200, 300, 400, 500, 600, 700, 800, 900,1000}; //30种速度

相关文档
最新文档