一键多控流水灯汇编语言怎么写,软件是keil

一键多控流水灯汇编语言怎么写,软件是keil,第1张

一键多空流水灯汇编语言程序编写方法是:设置一个变量,来检测按键的次数,从而控制程序分支来达到控制不同流水灯的效果例如:

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV R6,#0FEH

MOV R7,#0

LOOP:

JB P10,LOOP1

JNB P10,$

INC R7

CJNE R7,#2,LOOP1

MOV R7,#0

LOOP1: ;奇数次按键左向流水灯

MOV A,R7

JNZ LOOP2

MOV A,R6

MOV P0,A

RL A

MOV R6,A

LCALL DELAY

SJMP LOOP

LOOP2: ;偶数次按键右向流水灯

MOV A,R6

MOV P0,A

RR A

MOV R6,A

LCALL DELAY

LJMP LOOP

DELAY:

MOV R2,#200

DL1:

MOV R3,#250

DJNZ R3,$

DJNZ R2,DL1

RET

END

8个LED灯,LED1~LED8 灯按顺序点亮,一直循环

ORG 0000H ;复位入口

SJMP MAIN ;转到主程序

ORG 0030H ;主程序入口

SJMP DELAY ;跳到延时程序

MAIN:MOV P0,#0EEH;把#0EEH送到P0端口

CALL DELAY ;调用延时程序

MOV P0,#0EDH;把#0EDH送到P0端口

CALL DELAY ;调用延时程序

MOV P0,#0EBH;把#0EBH送到P0端口

CALL DELAY ;调用延时程序

MOV P0,#0E7H;把#0E7H送到P0端口

CALL DELAY ;调用延时程序

MOV P0,#0DEH;把#0DEH送到P0端口

CALL DELAY ;调用延时程序

MOV P0,#0DDH;把#0DDH送到P0端口

CALL DELAY ;调用延时程序

MOV P0,#0DBH;把#0DBH送到P0端口

CALL DELAY ;调用延时程序

MOV P0,#0D7H把#0D7H送到P0端口

CALL DELAY 调用延时程序

DELAY:MOV R0,#50H;延时程序,把#50H送进R0

D1:MOV R1,#100H;把#100H送进R1

D2:MOV R2,#100H;把#100H送进R2

DJNZ R1,D2;做R1减一运算,不等于0则跳到D2

DJNZ R0,D1;R0做减一运算,不等于0则跳到D1

RET;子程序返回

END ;程序结束

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

;50mS2=100mS

MOV

P1,LED

;

MOV

A,LED

;

RL

A

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

MOV

LED,A

;

MOV

YSJS,#0

;

;

QT1:

POP

ACC

;恢复现场

POP

PSW

;

RETI

;返回主程序

END

;汇编程序结束

ORG 000H //定位,使程序放在0000H处

MOV P1,#0FFH //使P1口全为高电平,八个灯全灭

L034: MOV A,#0FEH //11111110B值送入A,只使P10为低电平

L033: MOV P1,A //将A值送出P1口,只有D1亮

LCALL SE19 //调用延时子程序(决定每个灯亮的时间长度)

// {可在此再次(或多次)加入“LCALL SE19”使亮的时间增加一倍}

RL A //左循环位移,为了下次只使D2亮(再下次就是D3……)

SJMP L033 //跳转到L033处重新执行,使D1、D2、D3……D1轮流亮

//下面是延时程序,决定每调用一次延时多长时间

ORG 07A0H //定位,将下面的程序(延时程序段)放在07A0H处

SE19: MOV R6,#0A0H //更改#0A0H值

L036: MOV R7,#0FFH //或更改#0FFH值就可以改变其每次调用延时的时间

L035: DJNZ R7,L035

DJNZ R6,L036

RET

END

流水灯就是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 ;50mS2=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灯的亮灭。

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

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

做好中断现场保护和还原就可以解决这个问题了。

INT:

    PUSH PSW;先现场保护

    PUSH ACC;

    PUSH 00H;R0

    PUSH 01H;R1 

    PUSH 02H;R2 

    PUSH 03H;R3

    PUSH 04H;R4

    PUSH 05H;R5

    PUSH 06H;R6

    PUSH 07H;R7

    MOV A,#0AAH

MAG:

    MOV P2,A

    LCALL DELAY

    RL A

    JNB P33,MAG

    MOV A,#1

    MOV R2,#7

    POP 07H;R7;现场还原

    POP 06H;R6 

    POP 05H;R5 

    POP 04H;R4

    POP 03H;R3

    POP 02H;R2

    POP 01H;R1

    POP 00H;R0  

    POP ACC;       

    POP PSW;

    RETI

ORG是伪指令,代表这行在存储介质上的地址。

ORG0000H就是存储介质上的第一行。

MOV R2,#08H 没有具体意义,只是让流水灯一直运行的一个数量位而已。一次会运行8组,但是会重新赋值,所以会一直不停的流动。

JB 只是一个检测位址是否为1,如果为1则跳转,否则不跳转程序。

JB P00,LOOP1 这条指令的意思是,如果P00为1,则程序跳转到LOOP1的程序位置上。

其他指令和上面的指令是一样的,如果都不为1,则执行

AJMP MAIN 也就是说程序一直在判断,外部的三个按钮是否按下,如果按下,就跳转到对应的子程序执行,如果都没有按下,则程序跳转到MAIN的地方,重新开始那三个JB,如果按钮没按下,一直查询按钮,无限循环。

现在假设P00的按钮被按下,则程序跳转到LOOP1的位置上。

所以开始跳转到第7行开始执行MOV,R2,#08H。这条指令和第一条指令是一样的,意义不大,就不重复了。

然后继续往下执行,MOV A,#0FEH,把累加器ACC的内存设置为16进制的FE,也就是最低位为0,其他位为1

然后AJMP BUTTTON1。跳转到BUTTON1的位置,也就是下一行了。

然后是MOV P1,A。把累加器ACC里的FE给P1端口,这时候流水灯才开始亮起来了。按你图上的画法,是P10的灯亮,其他的灯不亮。

然后执行ACALL DELAY。这是子程序调用。调用名字为DELAY的子程序。这个时候程序跳转到最左边的那张图的DELAY的位置上。开始执行延时程序。

MOV R3,#14H 是设置延迟的次数。一次延迟,执行14次定时器。

下面的几条指令,我就不一一讲了,自己去看定时器的调用吧,符号和C语言的是一模一样的,设置定时器的类型,设置定时器的初始值。

SETB TR1 定时器1的运行标志位,设置为1,定时器开始工作。

JBC TF1,LP2。检查TF1标志位,定时器定时时间到了,TF1位为1,则跳转到LP2的位置。

然后重新给定时器赋值。然后R3减一,如果R3减到0,子程序调用结束,执行RET,完成子程序调用,否则,跳转到LP1的位置,继续执行定时器延迟程序。

现在假设延迟程序执行完毕,执行RET,完成子程序调用,返回主程序。

也就是程序第11行的位置上。因为这里是我们调用DELAY延迟函数开始的地方。程序会自动返回的,但是第一次写汇编的人,程序一大了,可能搞不清楚,你调用的位置在哪了,这很正常。

然后执行下一条指令,RL A 这条指令很简单,把累加器ACC里的值往左边移动一位,在51单片机里,就是向高位移动一位。

然后判断,其他的两个按钮是否被按下,两条JB指令,在前面已经讲过了,这里不赘述了。

如果按下了,就跳转到相应的位置上。否则执行DJNZ R2,BUTTON1,因为其他按钮没有按下来,所以继续执行BUTTON1的流水灯程序,R2的值不为0,则跳转到BUTTON1的位置上,重新开始执行,如果R2为0,则执行MOV R2,#08H,就重新给R2赋初值。然后执行AJMP BUTTON1,也就是没变。

现在我们假设P01的按钮被按下,则跳转到LOOP2。也就是第18行。

之后的指令是一样的,R2的作用是一样的就不解释了,然后直接解释下一条指令

MOV A,#7FH。这是给累加器ACC赋值,这次赋7H,跟BUTTON1正好相反,是最高位0,其他位为1,BUTTON1是最低位为0,其他位为1。

然后跳转到BUTTON2,执行MOV P1,A。把累加器的值给P1端口。

RR A,把累加器的值向右移动一位。

然后是两条JB指令,不解释了啊,忘了的,上边有写。然后调用DELAY延迟函数,执行过程,跟上面的是一样的。

后面的指令都是一样的,包括LOOP3的,自己看吧。已经写的很详细了,望采纳,还有不懂,再问吧。

以上就是关于一键多控流水灯汇编语言怎么写,软件是keil全部的内容,包括:一键多控流水灯汇编语言怎么写,软件是keil、汇编语言 做流水灯指教、、c51单片机中如何用汇编语言编写流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9306077.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存