1、1单片机控制流水灯前言随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯不断变化闪烁。LED 灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。但目前市场上各式样的 LED 灯控制器大多数用全硬件电路实现,电路结构复杂、功能单一,这样一旦制作成品只能按照固定的模式闪亮,不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。这种彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。因此有必要对现有的彩灯控制器进行改进
2、。流水灯是一串按一定的规律像流水一样连续闪亮。流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。流水灯控制可用多种方法实现,但对现代可编程控制器而言,利用移位寄存器实现最为便利。通常用左移寄存器实现灯的单方向移动;用双向移位寄存器实现灯的双向移动。本案例利用价格低廉的AT89C52 系列单片机控制基色LED灯泡从而实现丰富的变化。2目 录前言 21、 课程设计的目的和要求 61.1 设计目的 61.2 设计要求 62、 设计方案选择 .63、硬件设计 .73.1 设计思路 .73.2 流水灯电路原理图 73.2.1 元件清单 .83.2.2 硬件电路模块分析 .83.
3、3 主要元件说明 .113.3.3 振荡器特性 153.3.4 芯片擦除 .154、软件设计 154.1 主程序设计 .154.2 程序流程图 .185、 使用 keil、proteus 软件调试仿真说明 195.1 仿真过程 195.2 仿真结果 196、 结束语 .197、参考文献 2031、课程设计的目的和要求1.1 设计目的近年来随着科技的发展,单片机的应用正在不断走向深入,同时带动传统控制检测日新月异更新,在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象点的软件结合,加以完善。流水灯,可以更
4、简单、方便的使用。通过本课程设计使学生进一步巩固单片机原理及应用的基本概念、基本理论,分析问题的基本方法,增强系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力。培养一定的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案。1.2 设计要求设计流水灯的基本要求:设计一个 16 个 LED 灯的流水灯,应用 AT89C51 实验开发板的定时器功能实现,电路开启后 LED 灯在时钟信号作用下按一定规律转换状态。42、设计方案选择根据设计的基本要求,要实现其基本要求有两种设计方案的选择,这两种设计方案都是基于 AT89C51 单片机的基础上设计的。一种
5、是使用两片 74LS138译码器芯片扩展成为 4 线16 线具有 16 种输出状态,从而可以控制 16 个 LED灯;另一种是直接使用单片机的两个端口控制,这样也可以实现控制 16个 LED 灯。比较这两种设计方案,我们小组选用了后者。因为这个设计只是简单的要求实现 16 个 LED 灯循环点亮的流水功能,不用实现其他的功能,即不需要考虑占用 I/O 口多的问题;而前者的设计方案需要外添加两个 74LS138 芯片,这样就增加了硬件电路的复杂性。3、硬件设计3.1 设计思路 如果要让接在 P0.0 口的 LED1 亮起来,那么只要把 P0.0 口的电平变为低电平就可以了;相反,如果要接在 P0
6、.0 口的 LED1 熄灭,就要把 P0.0 口的电平变为高电平;同理,接在 P0.1P0.7 和 P2.0P2.7 口的其他 15 个 LED 的点亮和熄灭的方法同 LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1LED16 依次点亮、熄灭,16 只 LED 灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。3.2 流水灯电路原理图5图 3-1 硬件接线图利用单片机的 P0、P2 口高低电平控制 LED 灯的发光闪烁,再利用编程实现流水灯的功能。用
7、软件来实现对 LED 的控制,实现的软硬件结合。每个 LED 灯接一个限流电阻,来控制流入 LED 发光管的电流。复位电路 AT89C51 核心部件闪烁系统振荡系统硬件系统方框图3.2.1 元件清单表 3-1 元件清单名称型号 个数AT89C51 122pF 电容 210uF 电解电容 1220 欧姆电阻 1610k 电阻 1晶振 11.0592M 1发光二极管 166连接线 若干3.2.2 硬件电路模块分析(1)核心部件89C51 单片机是整个流水灯循环系统的核心功能的部件,其中内部有 ROM、有 RAM、有并行 I/O 口等,在 51 单片机内部有一个 CPU 用来运算、控制,有四个并行
8、I/O 口,分别是 P0、P1、P2、P3,有 ROM,用来存放程序,有 RAM,用来存放中间结果,此外还有定时/计数器,串行 I/O 口,中断系统,以及一个内部的时钟电路。(2)复位系统电路中 C1、R1、VCC 等组成复位电路,它的作用是将单片机内部特殊功能寄存器和端口寄存器恢复到初始状态,从内部 FLASH 存储器的初始状态开始执行。如图所示,当要对晶片重置时,只要按此开关就能完成 LED 和开关的重置。复位是单片机的初始化操作,其主要功能是把 PC 初始化为 0000H,使单片机从0000H 单元开始执行程序。单片机的 RST 管脚为主机提供了一个外部复位信号输入口。复位信号是高电平有
9、效,高电平有效的持续时间为 2 个机器周期以上。单片机的复位方式可由手动复位方式完成。RST 引脚是复位信号输入端,复位信号为高电平有效,其有效时间应持续24 个振荡周期以上才能完成复位操作,若使用 6MHz 晶振,则需持续 4S 以上才能完成复位操作。图 2.10 中,在通电瞬间,由于 RC 的充电过程,在 RST 端出现一定宽度的正脉冲,只要该正脉冲保持 10ms 以上,就能使单片机自动复位7图 3-2 复位电路CPU 在第二个机器周期内执行内部复位操作,以后每个机器周期重复一次,直至 RST 端电平变低。在单片机复位期间,AlE 和 信号都不产生。复位操作将对部分专用寄存器产生影响,复位
10、后,这些内部寄存器状态如表 2-6。表 1-2 部分专用寄存器复位状态寄存器 值 寄存器 值 PC 0000H ACC 00H B 00H PSW 00H SP 07H DPTR 0000H P0P3 0FFH IP XXX00000 IE 0XX00000 TMOD 00H TCON 00H TL0,TL1 00H TH0,TH1 00H SCON 00H SBUF 不定 PCON 0XXX0000 上电瞬间由于电容 C 上无储能,其端电压近似为零,RST 获得高电平,随着电容器 C 的充电,RST 引脚上的高电平将逐渐下降,当 RST 引脚上的电压小于某一数值后,单片机就脱离复位状态,进入
11、正常工作模式。只要高电平能保持复位所需要的时间(约两个机器周期) ,单片机就能实现复位。(3)振荡系统单片机本身如同一个复杂的同步时序电路,为了保证同步工作,电路应在唯一的时钟信号控制下,严格地按规定时序工作。而时钟电路就用于产生单片机工作所需要的时钟信号。为 LED 灯循环系统提供稳定频率波在由多片单片机组成的系统中,为了各单片机之间时钟信号的同步,引入唯一的外部脉冲信号作为各单片机的振荡脉冲。这时外部的脉冲信号是经单片机 89C51 的 XTAL2 引脚注入的;在 MCS518单片机片内有一个高增益的反相放大器,反相放大器的输入端为 XTAL1,输出端为 XTAL2,在芯片的外部通过这两个
12、引脚跨接晶体振荡器和微调电容 C1、C2形成反馈电路,可构成稳定的自激振荡器,振荡频率范围通常是 1.212MHz。晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。如图所示 图 3-3 振荡电路晶体振荡器的振荡信号从 XTAL2 端送入内部时钟电路,它将该振荡信号二分频,产生一个两相时钟信号 A 和 B 供单片机使用。时钟信号的周期称为状态时间 S,它是振荡周期的 2 倍,A 信号在每个状态的前半周期有效,在每个状态的后半周期 B 信号有效。CPU 就是以两相时钟 A 和 B 为基本节拍协调单片机各部分有效工作的。 M
13、CS-51 单片机时钟电路示意图如图下图所示。 XTAL1XTAL2fOSC二 分 频三 分 频六 分 频状 态 时 钟机 器 周 期ALE236C1C2晶 振 反 相放 大器MCS-51 单片机时钟振荡电路示意图振荡电路产生的振荡脉冲并不直接使用,而是经分频后再为系统所用。振荡脉冲在片内通过一个时钟发生电路二分频后才作为系统的时钟信号。片内时钟发生电路实质上是一个二分频的触发器,其输入来自振荡器,输出为二相时钟信号,即状态时钟信号,其频率为 fosc/2;状态时钟三分频后为 ALE 信号,其频率为 fosc/6;状态时钟六分频后为机器周期,其频率为 fosc/12。9(4)显示电路 如图 3
14、-4 所示,P0 口控制 LED 灯 D1D8 的显示,P2 口控制 LED 灯 D10D17的显示。限流电阻为 220 欧姆,经过的电流大概为 15mA。图 3-4 LED 显示电路3.3 主要元件说明此电路主要元件是 AT89C51 单片机,单片机内部主要包含下列几个部件: 一个 8 位 CPU; 一个时钟电路; 4Kbyte 程序存储器; 128byte 数据存储器; 两个 16 位定时/计数器; 64Kbyte 扩展总线控制电路; 四个 8-bit 并行 I/O 端口; 一个可编程串行接口; 五个中断源,其中包括两个优先级嵌套中断。10AT89C51 硬件结构框图3.3.1 主要特性A
15、T89C51 是一种低功耗/低电压、高性能的八位 CMOS 单片机,片内有一个4KB 的 FLASH 可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory) ,它采用了 CMOS 工艺和 ATMEL 公司的高密度非易失性存储器技术,而且其输出引脚和指令系统都与 MSC51 兼容。片内置通用8 位中央处理器(CPU)和 FLASH 存储单元,片内的存储器允许在系统内改编程序或用常规的非易失性存储器编程。因此,AT89C51 是一种功能强、灵活性高且价格合理的单片机,可方便的应用于各种控制领域。3.3.2 主要引脚功能
16、1.电源引脚 Vcc 和 Vss 11Vcc:电源端,接5V。 Vss:接地端。 通常在 Vcc 和 Vss 引脚之间接 0.1 高频滤波电容。 2.时钟电路引脚 XTAL1 和 XTAL2 XTAL1:接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,若使用外部 TTL 时钟时,该引脚必须接地。 XTAL2:接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,若使用外部 TTL 时钟时,该引脚为外部时钟的输入端。 3.地址锁存允许 ALE 在系统扩展时,ALE 用于控制地址锁存器锁存 P0 口输出的低 8 位地址,从而实现数据与低位地址的复用。当单片机上电正常工作后,
17、ALE 端就周期性地以时钟频率的 1/6 的固定频率向外输出正脉冲信号,ALE 的负载能力为 8 个LSTTL 器件。 4.外部程序存储器读选通信号 是读外部程序存储器的选通信号,低电平有效。CPU 从外部存储器取指令时,它在每个机器周期中两次有效。 5.程序存储器地址允许输入端 /VPP 当 为高电平时,CPU 执行片内程序存储器指令,但当 PC 中的值超过0FFFH 时,将自动转向执行片外程序存储器指令。当 为低电平时,CPU 只执行片外程序存储器指令。对于 8031,由于其无片内 ROM,故 必须接低电平。6.复位信号 RST 该信号高电平有效,在输入端保持两个机器周期的高电平后,就可以
18、完成复位操作。此外,该引脚还有掉电保护功能,若在该端接5V 备用电源,在使用中若 Vcc 掉电,可保护片内 RAM 中信息不丢失。 7.输入/输出口引脚 P0、P 1、P 2和 P3 P0 口(P0.0P0.7):该端口为漏极开路的 8 位准双向口,负载能力位 8高 LSTTL 负载,它为 8 位地址线和 8 位数据线的复用端口。 P1 口(P1.0P1.7):它是一个内部带上拉电阻的 8 位准双向 I/O 口,P112口的驱动能力为 4 个 LSTTL 负载。 P2 口(P2.0P2.7):它为一个内部带上拉电阻的 8 位准双向 I/O 口,P2口的驱动能力也为 4 个 LSTTL 负载。在
19、访问外部程序存储器时,它作存储器的高 8 位地址线。 P3 口(P3.0P 3.7):P 3口同样是内部带上拉电阻的 8 位准双向 I/O 口,P3口除了作为一般的 I/O 口使用之外,其还具有特殊功能。3.3.3 振荡器特性XTAL1 和 XTAL2 分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2 应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度3.3.4 芯片擦除AT89C51 设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种
20、软件可选的掉电模式。在闲置模式下,CPU 停止工作。但 RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存 RAM 的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 134、软件设计4.1 主程序设计#include #define T 10 /定时器时间 T*50ms void Init_Timer0(void);unsigned char Time; void main(void)int flag = 1;/P0 口先开始亮灯Time=0;P0=0x7f;P2 = 0xff;Init_Timer0();/初始化定时器while(1) if(flag =
21、1) /P0 口准备亮灯if(Time=T)/0.5s 移动一次P0 = 1;P0=P0|0x80;Time=0;if(P0 = 0xfe)/到了 P0 的最后一个灯 1111 1110flag = 0;if(flag = 0)/P2 口准备亮灯14if(Time = T /P2 口开始亮灯 0111 1111P0 = 0xff;/P0 口不亮灯 1111 1111Time = 0;if(Time = T)P2=1;P2=P2|0x80;Time = 0;if(P2 = 0xfe)/到了 P2 口的最后一个灯 1111 1110P1 = 0x00; /调试代码if(Time = T)P0 =
22、0x7f;P2 = 0xff;flag = 1;/P0 口准备亮灯Time = 0;P1 = 0xff; /调试代码continue;/重新循环; 15void Init_Timer0(void)TMOD = 0x01; /选择工作方式 1TH0 = 0x3C; /设置初始值,定时 50MSTL0 = 0xB0; EA = 1; /打开总中断ET0 = 1; /打开定时器 0 中断TR0 = 1; /启动定时器 0void Timer0() interrupt 1TH0 = (65536-50000)/256; /设置初始值TL0 = (65536-50000)%256;Time+;此程序中加
23、入了一个 P1 口用来调试代码,这个调试代码的主要作用就是为了观察 LED 灯循环点亮后作为明显的结束标志。在仿真中可以看到 LED 灯有规律的一个一个的点亮如此循环。4.2 程序流程图16图 4-1 程序流程图5、使用 keil、proteus 软件调试仿真说明5.1 仿真过程Proteus 仿真时,单片机需要加载程序,加载程序为.HEX 文件。本设计利用 Keil Vision4, 在新建 Keil 项目时选择 AT89C51 单片机作为 CPU,将 C语言源程序导入,在“Options For Target”对话窗口中,选中 “Output”选项中的“Create HEX File”,编
24、译链接后就可以生成 .HEX 文件。在 Proteus ISIS 中,选中 AT89C51 并单击鼠标左键,对 AT89C51 进行设置,设置单片机时钟频率为 12MHz,按照正确的文件路径加载.HEX 文件。对单片机设置完毕后就可以开始仿真了。5.2 仿真结果17图 5.1 Proteus 仿真环境6、结束语通过这次课程设计我学到了很多东西,我更加体会到理论知识与动手能力相结合的重要性,而且设计过程中使我懂得在设计程序之前,务必要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源,懂得设计的关键是要有一个清晰的思路和一个完整的软件流程图。在设计程序时,不能妄想一次就将整个程序设
25、计好, “反复修改,不断改进”是程序设计的必经之路。要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你思路,这样也为资料的保存和交流提供了方便。整个设计的过程中,还是碰到了一些问题。比如,对于 P0 口控制的 LED 灯点亮完后怎么样过渡到 P2 口控制的 LED 灯点亮,对于编程的顺序及各模块程序调用掌握得还不够好,主要是因为一些相关的应用软件没能熟练掌握。通过这几天的反复思考,以及参考网上的程序,最终还是完成了设计。设计中我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识187、参考文献胡汉才单片机原理与接口技术M北京:清华大学出版社,1995.6楼然苗等51 系列单片机设计实例M北京:北京航空航天出版社,2003.3何立民. 单片机高级教程M北京:北京航空航天大学出版社,2001夏继强. 单片机实验与实践教程M. 北京:北京航空航天大学出版社, 2001