新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机流水灯设计方法

单片机流水灯设计方法

作者: 时间:2013-01-15 来源:网络 收藏
点击浏览下一页
图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           ;程序结束


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭