51单片机中如何用汇编语言编写流水灯

51单片机中如何用汇编语言编写流水灯,第1张

流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:

ORG 0000H复位启动

AJMP START

ORG 001BHT1中断

AJMP T1INT

定义变量========================

YSJSEQU 30H延时计数器

LEDEQU 31HLED控制缓冲器

主程序==========================

START:MOV LED,#0FEH初始化数据

MOV YSJS,#0

MOV TMOD,#10H定时器1工作于方式1,16位定时器

MOV TL1,#0B0H设置定时初值

MOV TH1,#3CH定时时间=50mS

SETB ET1使能定时器1中断

SETB TR1启动定时器1

SETB EA开总中断

MOV P1,LED初始化流水

LOOP:JMP LOOP循环等待中断

T1INT:PUSH PSW定时器1中断程序

PUSH ACC保护现场

MOV TH1,#3CH定时时间=50mS

MOV TL1,#0B0H

INC YSJS

PUSH ACC保护ACC

MOV A,YSJI

CJNE A,#2,QT150mS*2=100mS

MOV P1,LED

MOV A,LED

RL A累加器A的值循环左移1位

MOV LED,A

MOV YSJS,#0

QT1:POP ACC恢复现场

POP PSW

RETI返回主程序

END汇编程序结束

扩展资料:

实现流水灯的三个方法:

第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。

第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

第三种,库函数实现流水灯。利用左移函数进行。

ORG 0000H 程序开始

SJMP START 跳转到START

ORG 0050H START从ROM的0050H开始存储

START: MOVE P1.0,#00000001B 把二进制数00000001B送到P1口

LCALL DELAY 调用延时子程序

MOVE P1.0,#00000010B 把二进制数00000010B送到P1口

LCALL DELAY

MOVE P1.0,#00000100B

LCALL DELAY

MOVE P1.0,#00001000B

LCALL DELAY

MOVE P1.0,#00010000B

LCALL DELAY

MOVE P1.0,#00100000B

LCALL DELAY

MOVE P1.0,#01000000B

LCALL DELAY

MOVE P1.0,#10000000B

LCALL DELAY

LJMP START 跳转到START

延时子程序DELAY,改变R5、R6、R7中的值(0到255),可以改变延时时间

DELAY: MOV R5,#20 把20放到寄存器R5中,

D1: MOV R6,#20

D2: MOV R7,#248

DJNZ R7,$ 把寄存器R7中的内容减1,如果结果不定于0,则跳转到本身,如果等于0,执行下一条程序

DJNZ R6,D2 把寄存器R6中的内容减1,如果结果不定于0,则跳转到本身,如果等于0,跳转到D2

DJNZ R5,D1

RET

END

4只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

用最直接的方式实现流水灯

ORG 0000H

START:MOV P1,#01111111B 最下面的LED点亮

LCALL DELAY 延时60秒

LCALL DELAY 延时60秒

MOV P1,#10111111B 最下面第二个的LED点亮

LCALL DELAY 延时60秒

LCALL DELAY 延时60秒

MOV P1,#11011111B 最下面第三个的LED点亮 (以下省略)

LCALL DELAY

LCALL DELAY 延时60秒

MOV P1,#11101111B

LCALL DELAY

LCALL DELAY 延时60秒

MOV P1,#11110111B

LCALL DELAY

LCALL DELAY 延时60秒

MOV P1,#11111011B

LCALL DELAY 延时60秒

LCALL DELAY 延时60秒

LCALL DELAY 延时60秒

LCALL DELAY 延时60秒

LCALL DELAY 完成第一次循环点亮,延时约0.25秒

AJMP START 反复循环

延时子程序,12M晶振延时约250毫秒

DELAY: 大约值:2us*256*256*2=260ms,也可以认为为250ms

PUSH PSW现场保护指令(有时可以不加)

MOV R4,#240

L3: MOV R2 ,#00H

L1: MOV R3 ,#00H

L2: DJNZ R3 ,L2最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2)

DJNZ R2 ,L1中层循环:256次

DJNZ R4 ,L3外层循环:240次

POP PSW

RET

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10991336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存