流水灯的单片机控制设计(二)

3.2循环移位法   在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水”效果啦。由于8051系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。具体编程如下所示,程序结构确实简单了很多。

  ORG 0000H ;单片机上电后从0000H地址执行
  AJMP START ;跳转到主程序存放地址处
  ORG 0030H ;设置主程序开始地址
  START:MOV SP,#60H ;设置堆栈起始地址为60H
  MOV  A,#0FEH ;ACC中先装入LED1亮的数据(二进制的11111110)
  MOV  P1,A ;将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 ;程序结束

3.3查表法
  上面的两个程序都是比较简单的流水灯程序,“流水”花样只能实现单一的“从左到右”流方式。运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水灯效果。我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。具体源程序如下,TAB标号处的数据表可以根据实现效果的要求任意修改。
  ORG 0000H ;单片机上电后从0000H地址执行
  AJMP START ;跳转到主程序存放地址处
  ORG 0030H ;设置主程序开始地址
  START:MOV SP,#60H ;设置堆栈起始地址为60H
  MOV DPTR,# 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 ;子程序返回
  TAB:     ;下面是流水花样数据表,用户可据要求任意编写
  DB 11111110B ;二进制表示的流水花样数据,从低到高左移
  DB 11111101B
  DB 11111011B
  DB 11110111B
  DB 11101111B
  DB 11011111B
  DB 10111111B
  DB 01111111B
  DB 01111111B ;二进制表示的流水花样数据,从高到低右移
  DB 10111111B
  DB 11011111B
  DB 11101111B
  DB 11110111B
  DB 11111011B
  DB 11111101B
  DB 11111110B
  DB 0FEH,0FDH,0FBH,0F7H ;十六进制表示的流水花样数据
  DB 0EFH,0DFH,0BFH,7FH
  DB 7FH,0BFH,0DFH,0EFH
  DB 0F7H,0FBH,0FDH,0FEH
  ……
  DB 0FFH ;流水花样结束标志0FFH
  END ;程序结束
  4.结语
  当上述程序之一编写好以后,我们需要使用编译软件对其编译,得到单片机所能识别的二进制代码,然后再用编程器将二进制代码烧写到AT89C51单片机中,最后连接好电路通电,我们就看到LED1~LED8的“流水”效果了。本文所给程序实现的功能比较简单,旨在抛砖引玉,用户可以自己在此基础上扩展更复杂的流水灯控制,比如键盘控制流水花样、控制流水灯显示数字或图案等等。
  参考文献:
  [1]徐煜明,韩雁.单片机原理及接口技术[M].北京:电子工业出版社,2005.1
  [2]万光毅,严义,邢春香.单片机实验与实践教程[M].北京:北京航空航天大学出版社,2006.4