单片机流水灯设计方法

发布者:世界因你而精彩最新更新时间:2013-01-15 来源: 21IC 关键字:单片机  流水灯  汇编语言 手机看文章 扫描二维码
随时随地手机看文章

    这一课我们就结合at89sS51增强型单片机实验板、ISP编程器来手把手教你详细学习单片机流水灯设计方法。购买电路板联系qq125739409

图1:S51增强型单片机实验板
 
点击浏览下一页
图2: ISP编程器套件

  S51增强型单片机实验板上有8个高亮度发光二极管(见图1所示),可以用来做单片机流水灯、跑马灯。。。等实验,电路原理图见下图3。

点击浏览下一页
图3单片机流水灯设计方法

  从原理图可以看出,如果我们想让接在P1.0口的LED1亮起来,那么我们只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平就可以;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭方法方法同LED1。因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。

  实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。

  从上面中文表示看来实现单片机流水灯很简单,但是我们不能说P1.0你变低,它就变低了。因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”机器代码。我们又怎样来使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。这里的“程序语言”目前主要有汇编语言和C语言两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。[page]

实现8个LED流水灯汇编语言源程序 liu01.asm
 

    ;----- 主程序开始 -----
START: CLR   P1.0       ;P1.0输出低电平,使LED1点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.0       ;P1.0输出高电平,使LED1熄灭
    CLR   P1.1       ;P1.1输出低电平,使LED2点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.1       ;P1.1输出高电平,使LED2熄灭
    CLR   P1.2       ;P1.2输出低电平,使LED3点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.2       ;P1.2输出高电平,使LED3熄灭
    CLR   P1.3       ;P1.3输出低电平,使LED4点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.3       ;P1.3输出高电平,使LED4熄灭
    CLR   P1.4       ;P1.4输出低电平,使LED5点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.4       ;P1.4输出高电平,使LED5熄灭
    CLR   P1.5       ;P1.5输出低电平,使LED6点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.5       ;P1.5输出高电平,使LED6熄灭
    CLR   P1.6       ;P1.6输出低电平,使LED7点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.6       ;P1.6输出高电平,使LED7熄灭
    CLR   P1.7       ;P1.7输出低电平,使LED8点亮
    ACALL  DELAY      ;调用延时子程序
    SETB  P1.7       ;P1.7输出高电平,使LED8熄灭
    ACALL  DELAY      ;调用延时子程序
    AJMP  START      ;8个LED流了一遍后返回到标号START处再循环

    ;----- 延时子程序 -----
DELAY: MOV   R0,#255     ;延时一段时间
D1:   MOV   R1,#255
    DJNZ  R1,$
    DJNZ  R0,D1
    RET            ;子程序返回

    END           ;程序结束

 

  在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、END。

  CLR: 是将其后面指定的位清为0,程序中使对应端口输出低电平
  ACALL:是子程序调用指令,程序中调用了DELAY延时子程序
  SETB:是将其后面指定的位置成1,程序中使对应端口输出高电平
  AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行
  END: 是程序结束的伪指令,意思是告诉编译器,程序到此结束。伪指令只告诉编译器此程序到此有何要求或条件,它不参与和影响程序的执行。

  在上面源程序中"ACALL  DELAY"指令的作用是调用DELAY延时子程序。为什么要使用这指令呢?如果不用该指令能够实现"流水"效果吗?答案是肯定的,一定要用该指令才能看到我们需要的"流水"效果。如果不用该指令,则由于8个LED发光与熄灭的时间都很短,我们肉眼无法看到LED的熄灭与点亮,凭我们肉眼看到的是LED1~LED8都同时亮(半亮),而看不到“流水”效果的!注:初学者可以将上面源程序中所有"ACALL  DELAY"指令行删除后再编译后烧写到单片机进行验证一下。

  产生这种现象主要是因为单片机执行每条指令的时间很短,我们知道实验板上单片机的时钟高达11.0592MHz,在这个时钟信号(即晶体振荡信号)下,一个“机器周期”仅大约1.08uS(微秒)。本程序中我们用到的SETB P.x和CLR P.x均属于单周期指令,也就是说,执行一句 SETB P.x 用时仅1.08uS(微秒),CLR P.x 也是1.08uS(微秒);也就是点亮和熄灭时间都为1.08uS(微秒),在如此高速的流水速度下,8个LED发光与熄灭的时间都很短,当然凭我们的肉眼看不到“流水”效果了!

  这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:
  1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件或用UltraEdit文本编辑器编辑;
  2、源程序的扩展名应是 *.ASM;
  3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。
  4、每行的格式应为:标号: 命令 参数 ;注释 。即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。需要使用标号时标号后面必须有“:”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。

  标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:\'或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:\'(如上面程序中的 AJMP START中的START是不能再有:)。每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。在源程序中的字母不区分大小写,也就是说 start 和 START 是一样的,请不要用大小写方式去区分不同的标号。

  好啦!我们知道了汇编语言程序的规则,现在就动手编辑源程序吧。马上启动Keil单片机集成开发环境,建立新工程liu01.UV2,将上面的源程序liu01.asm导入到工程中,设置好Keil工程的编译参数,编译得到HEX格式的目标文件liu01.hex,用 ISP编程器 将目标文件liu01.hex烧写到AT89S51单片机中,接下来就是将烧写好的AT89S51从编程器上取下,放到“ S51增强型单片机实验板 ”上通电,我们就看到了LED1~LED8的"流水"效果了。[page]

点击浏览下一页
图4: ISP编程器烧写目标文件liu01.hex

  到此,我们做的流水灯已成功,工作原理也清楚啦,若你完全掌握了上面程序,那么你就可以将“流水灯”的流向改变一下,可以将从"左向右流"改为从"右向左流",也可以改为"两边向内流"、"内部向外流"......,我想你一定能用前面学到的方法实现这些功能。可能有些高手说,前面的编程方法是最最笨的!不错!但初学单片机初期可以不必讲究语言的简练,只要能实现预先要求就好,最主要的是学好基本指令(111条)的用法,清楚各个指令的功能,这是初学者要知道的。那么还有更好的编程思路吗?当然有!请跟随站长继续学习下面的内容。

  在前面学习的程序中我们让LED流水是去逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们就采用新的思路来编程。新的编程思路如下:我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?的确如此!8051指令中没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC在指令中常写为A,累加器A数据左移指令为"RL A",累加器数据右移指令为"RR A",累加器在数据传输和数据处理过程中作用十分重要,累加器ACC为8位。他可与片内所有单字节寄存器交换数据,实际上P1和其他端口在单片机中也是一个寄存器。这样我们可以将需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。下面程序就是采用新的编程思路源程序liu02.asm。

实现8个LED流水灯汇编语言程序 liu02.asm
 

    ;----- 主程序开始 -----
START: MOV   ACC,#0FEH   ;ACC中先装入LED1亮的数据(二进制的11111110)
    MOV   P1,ACC     ;将ACC的数据送P1口
    MOV   R0,#7     ;将数据再移动7次就完成一个8位流水过程
LOOP:  RL   A       ;将ACC中的数据左移一位
    MOV   P1,A      ;把ACC移动过的数据送p1口显示
    ACALL  DELAY     ;调用延时子程序
    DJNZ  R0,LOOP    ;没有移动够7次继续移动
    AJMP  START     ;移动完7次后跳到开始重来,以达到循环流动效果

    ;----- 延时子程序 -----
DELAY: MOV   R0,#255    ;延时一段时间
D1:   MOV   R1,#255
    DJNZ  R1,$
    DJNZ  R0,D1
    RET          ;子程序返回

    END          ;程序结束

 

  接下来,我们将上述程序编译,并烧写到实验芯片中,放到实验板上可以看到程序的"流水"效果是一样的,但源程序看起来更加简洁,直观。其实8051单片机有111条指令,有的指令常用,有的指令不常用,只要遵守语法规则,你可以用这些指令“组合”成你想象到的任何程序。当然,有时一条指令可以替代很多条指令,这样会使程序简洁,程序代码减少,在编写较大程序时可以让程序存储器放得下你需要的代码,这也是单片机高手所追求的“程序简洁高效”。当然,初学者不必刻意去追求程序的简洁高效,主要是要全面地掌握各种指令的应用,只要你对基本指令都熟悉了,那么你也就可以编出简洁高效的程序了,不过这编程“内功”是需要你勤学苦练,日积月累的练习、实验才能达到的哦!马上拿起你的实验板,现在就开始动手吧:)

  上面我们学习的两个程序都是比较简单的流水灯程序,"流水"花样只能实现单一的"从左到右"流方式。下面介绍一个实用的流水灯程序,程序能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水。只要将下面的程序稍稍修改一下,通过S51增强型单片机实验板的扩展接口连接到霓虹灯高压驱动接口板就可以驱动真正的霓虹灯了。

实用的查表方式多功能流水灯程序 liu03.asm
 

    ;----- 主程序开始 -----
    ORG   0000H       ;上电复位,程序从0000H开始执行
START: MOV   SP,#60H      ;堆栈初始化为60H
    MOV   DPTR,#LIU_TAB   ;流水花样表首地址送DPTR
LOOP:  CLR   A
    MOVC  A,@A+DPTR
    CJNE  A,#0FFH,SHOW   ;检查流水结束标志
    AJMP  START       ;所有花样流完,则从头开始重复流
SHOW:  MOV   P1,A       ;将数据送到P1口
    ACALL  DELAY
    INC   DPTR
    AJMP  LOOP

    ;----- 延时子程序 -----
DELAY: MOV   R0,#255     ;延时一段时间
D1:   MOV   R1,#255
    DJNZ  R1,$
    DJNZ  R0,D1
    RET            ;子程序返回

 

    ;----- 下面是流水花样数据表 -----
LIU_TAB:
    DB 01111111B       ;二进制表示的流水花样数据
    DB 10111111B
    DB 11011111B
    DB 11101111B
    DB 11110111B
    DB 11111011B
    DB 11111101B
    DB 11111110B
    DB 11111110B
    DB 11111101B
    DB 11111011B
    DB 11110111B
    DB 11101111B
    DB 11011111B
    DB 10111111B
    DB 01111111B
    DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;十六进制表示
    DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
    DB 7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EH
    DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H
    DB 0FFH          ;流水花样结束标志0FFH

    END           ;程序结束

 
关键字:单片机  流水灯  汇编语言 引用地址:单片机流水灯设计方法

上一篇:51单片机最小系统原理及编程电路设计
下一篇:51单片机原理介绍

推荐阅读最新更新时间:2024-03-16 13:16

基于51单片机汇编写的校园作息控制系统
单片机作息时间控制实现了对时间控制的智能化,摆脱了传统由人来控制时间的长短的不便,是现代学校必不可少的教学设备。针对单片机课程的学习与熟练运用,本设计预计完成一套完整的校园作息时间控制系统,锻炼学生的独立思考能力与学习能力,在学生本人积极实践、查阅资料的基础上完成设计。 1.2设计任务要求 能按照作息时间发出铃声提示信息,以蜂鸣器模拟,响铃15秒;能按照需要调整作息时间(夏季和冬季),并能调整当前系统的时间;用数码管显示当前时间。 2. 系统硬件电路的设计 2.1 51单片机时钟电路 时钟电路就是一个振荡器,给单片机提供一个节拍,单片机执行各种操作必须在这个节拍的控制下才能进行。因此单片机没有时钟电路是不会正常工作的。在M
[单片机]
基于51<font color='red'>单片机</font>汇编写的校园作息控制系统
51单片机最小系统制作笔记
上面所示是51系列单片机最小系统全家福照片,组装完成后的照片如下:   本电路各输入、输出脚全部用插针引出,可以连接外围电路进行单片机电路的实验,芯片可以采用ATMEGA系列单片机和51系列单片机,51系列支持AT89S(ISP方式下载)及STC89C(串口方式下载)等型号的芯片。 一、原理图的准备 1.供电部分电路图 供电部分采用了USB取电和充电器取电两种方式,注意:两种方式只能选择使用一种,不能同时使用,否则容易损坏USB接口。 2.通讯部分电路图 利用通讯部分电路,可以进行串口通讯实验,也可做为宏晶芯片STC89S的程序下载接口。 3.程序下载部分电路图 AT89S系列芯片采用下面电路
[单片机]
51单片机外部引脚英文全称是什么?
51单片机外部引脚英文全称 缩写 英文解释 中文解释 RXD (10--P3.0) Receive Data 串口接收端 TXD (11--P3.1) Transmit Data 串口发送端 PSEN (29)progammer saving enable 外部程序存储器读选通信号 ALE (30) Address Latch Enable 地址锁存允许信号 EA (31)enable 外部ROM选择信号 51内部寄存器 SFR special funtion register 特殊功能寄存器 PSW progammer status word 程序状态字
[单片机]
基于AT89C51应用系统的串行通信设计
1 引 言 在红外成像技术的电力设备状态检测系统中,基于AT89C51单片机的应用系统,采用美国雷态公司的型号为3iLRL3的非接触式红外测温仪.该测温仪采用的是RS232C串行通信标准接口,该接口在很多通信设备中通用,目前与PC机的直接串行通信也是RS 232C接口。尽管RS232C性能指标并非很好,但还是有广泛的市场支持。串行通信技术在测控系统中占有很重要的地位,只用三根线.就可以方便的在2个数字设备之间进行信息的交换,实现全双工的传送数据,硬件成本低.而且通用性好。 2 串行通信的硬件设计 在所开发的系统中.红外测温仪将检测电力没备的工作和环境温度,通过RS 232C串口传给单片机,同时由单片机控制检测装置的在线工作组态
[单片机]
C51单片机定时器/计数器中断功能详细分析(二)
一.外部中断相关寄存器 1.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IT1:外部中断1触发方式控制位 当IT1=0时,为电平触发方式(低电平有效) 当IT1=1时,为边沿触发方式(下降沿有效) 2.中断允许控制寄存器(IE) EX0:外部中断0允许位; EX1:外部中断1允许位; EA :CPU中断允许(总允许)位。 二.外部中断的处理过程 1、设置中断触发方式,即IT0=1或0,IT1=1或0 2、开对应的外部中断,即EX0=1或EX1=1; 3、开总中断,即EA=1; 4、等待外部设
[单片机]
C51<font color='red'>单片机</font>定时器/计数器中断功能详细分析(二)
部署处理特定任务的单片机来简化复杂设计
部署处理特定任务的单片机来简化复杂设计 Microchip Technology Inc. 8位单片机产品部 Robert Perkel 摘要: 处理特定任务的单片机可减轻主单片机或微处理器的任务和工作负荷,从而有助于简化各种应用的设计流程。 如今,运行实时操作系统(RTOS)的大型32位单片机(MCU)和微处理器(MPU)日益普及。不过,如果使用一个大型单片机处理复杂的应用,可能会在执行小型后台处理任务时遇到CPU资源方面的问题,这些任务虽然并不复杂,但十分耗时。8位和16位MCU等小型器件可用于减轻32位器件的工作负荷。 试想一下这样一个示例:将一个32位MCU用于控制汽车的非安全功能,如娱乐系统、环境
[单片机]
部署处理特定任务的<font color='red'>单片机</font>来简化复杂设计
单片机按键扫描程序 状态机方法
#define key_input PIND.7 // 按键输入口 #define key_state_0 0 #define key_state_1 1 #define key_state_2 2 char read_key(void) { static char key_state = 0; char key_press, key_return = 0; key_press = key_input; // 读按键I/O电平 switch (key_state)
[单片机]
8051单片机由什么组成 8051单片机有多少管脚
8051单片机介绍 8051单片机是一款广泛应用于嵌入式系统中的8位单片机,由Intel公司在1980年推出,是当时业界最先进的8位单片机之一,也是单片机领域的经典之作。 8051单片机具有较低的功耗、高度集成、强大的功能和易于编程等优点,广泛应用于各种嵌入式系统中,如家电控制、自动化设备、工业控制、仪器仪表、汽车电子、通讯设备、电子游戏等领域。 8051单片机内部包含了CPU、存储器、定时器、串行通信接口、并行输入输出端口等基本模块,同时还具有多种外设和扩展接口,可以根据不同应用需要进行灵活配置和扩展。 在编程方面,8051单片机支持多种编程语言和开发工具,如C语言、汇编语言、BASIC语言等,并且有许多成熟的开源或商业的集
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved