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

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

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

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

#include<reg51h>

voiddelay(void)

{

unsignedinti,j;

for(i=0;i<200;i++)

for(j=0;j<1000;j++)

;

}

voidmain(void)

{

while(1)

{

P3=0xfe;//第一个灯亮

delay();//延时

P3=0xfd;//第二个灯亮

delay();

P3=0xfb;//第三个灯亮

delay();

P3=0xf7;//第四个灯亮

delay();

P3=0xef;//第五个灯亮

delay();

P3=0xdf;//第六个灯亮

delay();

P3=0xbf;//第七个灯亮

delay();

P3=0x7f;//第八个灯亮

delay();

}

}

扩展资料

单片机C语言16种方式流水灯

voidmain()

{

while(1)

{

P1=0xfe;//点亮第一个发光管

Delay(5000);

P1=0xfd;//点亮第二个发光管

Delay(5000);

P1=0xfb;

Delay(5000);

P1=0xf7;

Delay(5000);

P1=0xef;

Delay(5000);

P1=0xdf;

Delay(5000);

P1=0xbf;

Delay(5000);

P1=0x7f;//点亮第八个发光管

}

}

①最外层的 j for循环,用来执行8次流水(第一次、第二次);

②内层的 i for循环,用来执行每次流水 需要执行多少步(第一次8步,第二次7步);

③a=_crol_(a,j) 确实如LZ说的,对a 左移 j 位,不过要求带 C 左移,就是循环移位,把a^7移到a^0上,也确实已经对a 进行赋值了;

④a=a<<1,这也是左移一个位,这个移,不带C,就是把a^7踢出去,不要了,a^0补0;这个移的意义在于每次流水都会增加一颗灯,不过它必须是 低电平驱动 的LED 才有效。

执行过程简析如下:当第一次流水完成后(亮完最后一颗灯),第一次 i 循环结束,执行 i 循环内的最后一条语句带C左移,a 又回到第一颗灯状态(0xfe=1111 1110b);执行第③点的左移,此时j=0,相当于不移。再执行第④点的左移,a=0xfc(1111 1100),就变成了2颗灯;

下一个i 循环开始(第二次流水),流水步数为8-j=7(j 已经+1),a现在是2颗灯,7步后亮到最高2颗灯(a=0011 1111),经循环内最后一句带C左移,a=0111 1110,i 循环结束,执行第③点的带C左移,此时 j=1,a=1111 1100,又回到第二次流水时的起始状态。再执行第④点的左移,a=1111 1000,变成了3颗灯,下一个 i 循环开始一直到8颗灯亮

1、i用于依次点亮(熄灭)4个灯,for(j=0;j<a;j++)用于重复“依次点亮(熄灭)4个灯” *** 作的次数,次数函数就是函数形参a。

2、 (800,1) 指延时800个延时单位后,再点亮一个灯,依次亮的重复次数为1。其它的类似。

3、延时要精确计算,需看dalay函数内的指令执行时间。一般是设个t值,把程序烧进芯片里,估约延时长短,调几次,就得出经验值。

;//

;//实现功能:本程序实现在P0口模拟一种流水灯程序

;//

p_out equ P0 ;宏定义P0为p_out

org 00h ;程序的开始地址

ajmp main ;跳到main

org 030h

;//主函数

;//描 述:实现在P0口模拟一个流水灯程序

;//设计人: lishengling24

;//

main: ;主函数

mov sp,#50h ;设置sp堆栈的初始位置

mov a,#0feh ;初始化acc

main_1:

mov p_out,a ;点亮一个灯

mov r1,#250 ;

mov r0,#250 ;

Call delay_time;调用时间延迟子程序,上面两句是设置延迟时间

mov p_out,#0ffh;熄灭灯

RL a ;循环左移一位准备点亮下一个灯

JMP main_1 ;跳到main_1循环

;//时间延迟函数

;//描 述:用指令实现延时一段时间

;//入口参数:r1为高位,r0为低位,都是十六进制表示

;//出口参数:无

;//设计人:lishengling24

;//

delay_time:

push acc ;acc入栈

push psw ;psw入栈

mov a,r0 ;把r0赋给acc

inc r1 ;r1加1,因为djnz是先减1再比较是否为零,如果不加1

;当r1的初值为0的时候,减1后变成了0x0ff,改变了当

;初预想的延迟时间计数值

inc r0 ;道理和inc r1 一样,当然r0和r1的初值不能为0x0ff

loop:

nop

nop

nop

nop

nop

nop

djnz acc,loop ;

mov a,r0 ;

djnz r1,loop ;

pop psw ;psw出栈

pop acc ;acc出栈

ret

end ;需要其他5种方案的程序和电路,在百度HI我。

以下是C的写法:

//

//实现功能:本程序实现在P0口模拟一个流水灯程序

//

#include <reg51h>

#define p_out P0 //宏定义输出的i/o口为p0

//时间延迟函数

//描 述:用指令实现延时一段时间

//入口参数:int i,为时间延迟参数

//

void delay_time(int i)

{

while(i)

i--;

}

//主函数

//描 述:实现在P0口模拟一个流水灯程序

//

void main(void)

{

unsigned char i=0; //初始化一个局部变量为0

p_out=0xff; //初始化将要输出的i/o口,输出高电平,熄灭所有灯

while(1)

{

for(i=0;i<8;i++)

{

p_out=~(1<<i);//点亮一个灯,

delay_time(50000); //延迟一段时间

p_out=0xff;//熄灭所有灯

}

}

}

单片机流水灯程序代码(汇编语言):ORG0000HAJMPMAINORG0030HMAIN:MOVP1,#11111110BACALLDELAY;跳转到子程序MOVP1,#11111101BACALLDELAYMOVP1,#11111011BACALLDELAYMOVP1,#11110111BACALLDELAYMOVP1,#11101111BACALLDELAYMOVP1,#11011111BACALLDELAYMOVP1,#10111111BACALLDELAYMOVP1,#01111111BACALLDELAYAJMPMAINDELAY:MOVR7,#10;延时1s子程序开始DEL1:MOVR6,#200DEL2:MOVR5,#250DJNZR5,$DJNZR6,DEL2DJNZR7,DEL1RETEND

1、流水灯是若干个灯泡依次点亮,视觉上感觉到灯光在流动就叫做流水灯。2、它是由无数个LED灯组成的,而LED就是发光二极管的简称,它有个特性:就是它只允许电流单一方向流过。如果让LED灯亮起来,他需要连接一个高电平和一个低电平,当它遇到低电平时它会亮起来而遇到高电平它就会熄灭。由于他只能单方向流过电流,所以也就会一亮一暗。

以上就是关于51单片机中如何用汇编语言编写流水灯全部的内容,包括:51单片机中如何用汇编语言编写流水灯、用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)、单片机C程序 LED流水灯的 看不懂 求解释。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10142485.html

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

发表评论

登录后才能评论

评论列表(0条)

保存