彩色流水灯设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机彩色流水灯的设计
1.设计目的
单片机自制了一款简易的流水灯,重点介绍了其软件编程方法当今时代是一个技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。正在工厂、学校及企事业单位大规模地兴起。学习单片机的最有效方法就是理论与实践并重,我采用单片机89C51设计流水灯!
2.设计的主要内容和要求
随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,该设计将介绍一种基于单片机控制的发光二极管,通过改变发光二极管的发光顺序来实现不同的视觉效果,从而真正的达到“动态”的效果。
关键词:单片机,二极管,晶振,89C51。
3.整体设计方案
1、实现发光二极管发光
2、可以任意设定的发光顺序
流水灯的基本设计方案:使用查表指令,利用程序调用指令,延迟指令,及循环指令。实现任意方式输出,达到二极管任意方式流动.
4 .硬件电路的设计
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128B RAM、32根I/O 口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片
机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。其具体硬件组成如图1所示。
5 软件设计
单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难
点。下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。
运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水灯效果。我们首先把要显示流水花样的数据建在一个以TAB 为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。具体源程序如下,TAB标号处的数据表可以根据实现效果的要求任意修改。
ORG 0000H ;伪指令,指定程序从0000H开始存放
LJMP MAIN ;跳转指令,程序跳转至MAIN处执行
ORG 0030H ;伪指令,指定程序从0030H开始存放MAIN: MOV SP, #60H ;给堆栈指针赋初值
MOV P1,#0FFH ;给P1口赋值
MOV DPTR,#TABLE;查表
LIGHT: MOV R4,#50 ;设置循环次数
LOOP: MOV A,#50 ;给A赋初值
SUBB A,R4 ;将A的值与R4的值相减,结果存在A中
MOVC A,@A+DPTR ;将A+DPTR的值所对应的TABLE中的值赋给A MOV P1,A ;将A的值赋给P1口
LCALL DEL1S ;调用1S延时子程序
DJNZ R4,LOOP ;判断R4是否为0,不为0跳转,为0顺序执行 LJMP LIGHT ;跳转指令,跳转至LIGHT处继续执行DEL1S: MOV R5, #2 ;1S延时子程序(11.0592MHz晶振,误差0微秒)
DL1S0: MOV R6, #255
DL1S1: MOV R7, #255
DJNZ R7, $
DJNZ R6, DL1S1
DJNZ R5, DL1S0
RET
TABLE: ;定义表格数据
DB 0FFH ;全灭
DB 0FEH , 0FDH ,0FBH ,0F7H ,0EFH ,0DFH ,0BFH ,07FH ;依次逐个点亮
DB 0FEH ,0FCH ,0F8H ,0F0H ,0E0H ,0C0H ,080H ,000H ;依次逐个叠加
DB 080H ,0C0H ,0E0H ,0F0H ,0F8H ,0FCH ,0FEH ,0FFH ;依次逐个递减
DB 07FH , 0DFH , 0F7H , 0DFH , 0BFH , 0EFH , 0FBH , 0FEH ;间隔点亮DB 07EH ,0BDH ,0DBH ,0E7H ,0E7H ,0DBH ,0BDH ,07EH ;两边靠拢后分开
DB 07EH ,03CH ,018H ,000H ,000H ,018H ,03CH ,07EH ;两边叠加后递减
DB 000H ;全亮
END ;程序结束指令
1延时子程序的计算
延时子程序的延时计算问题
对于程序
Delay: MOV r5, #2
Dz1: MOV r7, #250
Dz2: MOV r6, #250
DINZ r6, $
DINZ r7, Dz2
DINZ r5, Dz1
RET
查指令表可知 MOV,DJNZ 指令均需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:
{[(1+250×2)×250+250×2]×2+2×2+2}×12÷11.059200=272.9mS
6.系统仿真
在Proteus的ISIS 7.1sp2软件环境下画出电路原理图,接下来就是将设计的程序在Keil C51 μVision2开发集成环境上编译成机器语言,进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“use romote debuger monitor”,便可实现KeilC与Proteus连接调试。首先在Proteus中双击单片机AT89C51,将KeilC下编程生成的 .HEX文件导入到AT89C51中,可在Proteus中单击全速仿真运行按钮
仿真结果如下:
1、先依次逐个点亮彩灯颜色为黄- 红-绿-蓝-蓝-绿-红-黄,每次只有一个灯亮着。
2、而后,逐次累计点亮这八个灯,点到最后一个的时候,八个灯全亮。