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

如题所述

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

ORG 0000H ;复位启动
AJMP START ;
ORG 001BH ;T1中断
AJMP T1INT ;

;定义变量========================
YSJS EQU 30H;延时计数器
LED EQU 31H;LED控制缓冲器

;主程序==========================
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,QT1 ;50mS*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口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-05-11

流水灯就是让一排LED灯,依次点亮或熄灭,以一定的时间间隔来实现这种效果,看起来像“流水”样。51单片机实现流水灯的控制十分容易,以下是源代码和仿真效果图。

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
LOOP:
MOV P0,A
JNB 00H,NEXT
RR A
SJMP LOOP1
NEXT:
RL A
LOOP1:
JB P2.0,LOOP2
JNB P2.0,$
CPL 00H
LOOP2:
MOV R7,#2
LCALL DELAY
SJMP LOOP
DELAY:
MOV R2,#200
DLY:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DLY
DJNZ R7,DELAY
RET
END

第2个回答  2015-05-17
51单片机用汇编语言编写流水灯程序,就是控制多个LED ,使其在特定时间间隔内,只有一个LED 发光,其他熄灭,用这种方式顺序移动点亮LED的位置,就形成了流水灯的效果。以下是程序:
;假设晶振12MHZ,P1控制8个LED低电平亮
;启动入口========================
ORG 0000H ;复位启动
AJMP START ;
ORG 001BH ;T1中断
AJMP T1INT ;
;定义变量========================
YSJS EQU 30H;延时计数器
LED EQU 31H;LED控制缓冲器
;主程序==========================
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,QT1 ;50mS*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 ;汇编程序结束
第3个回答  2013-12-01
ORG 0100H
LTOR: MOV A,#01H
LOOP: RR A ;从左到右亮,每次亮一盏
MOV P1,A
ACALL DELAY
JNB ACC.0,LOOP
LOOP1: RL A
MOV P1,A ;从右到左亮,每次亮一盏
ACALL DELAY
JNB ACC.7,LOOP1
LOOP2: RR A
ORL A,#80H
MOV P1,A ;从左到右依次点亮每一盏灯
ACALL DELAY
JNB ACC.0,LOOP2
LOOP3: RL A
ANL A,#0FEH
MOV P1,A ;从右到左依次熄灭每一盏灯
ACALL DELAY
JB ACC.7,LOOP3
SJMP LTOR

DELAY: MOV R6,#01H ;延时子程序
L2: MOV R7,#01H
L1: NOP
DJNZ R7,L1
DJNZ R6,L2
RET

END本回答被网友采纳
第4个回答  2013-12-01
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV DPTR,#TAB
MOV R7,#4FH
LOOP: MOVC A,@A+DPTR
INC DPTR
MOV P1,A
ACALL DELAY
CLR A
DJNZ R7, LOOP
AJMP MAIN

ORG 0200H
TAB: ;从左到右,再从右到左,一次亮一个
DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;15,0FH
DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
;从右到左,再从右到左,依次点亮
DB 0FFH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H
DB 0FFH,7FH,3FH,1FH,0FH,07H,03H,01H,00H
相似回答