急!急!急!单片机流水灯汇编语言程序

急!急!急!单片机流水灯汇编语言程序,第1张

5只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 ;完成第一次循环点亮,延时约025秒

AJMP START ;反复循环

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

DELAY: ;大约值:2us2562562=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

随便改了一个

#include<reg52h>

sbit LED1=P2^0;

//1ms延时程序

void delayms(unsigned int i)

{ unsigned int j;

while(i--)

{

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

;

}

}

void main()

{

LED1=0;

while(1)

{

delayms(1000);

LED1=~LED1;

};

}

假设P0口接LED,高电平点亮

#include

0;i--)

for(j=110j>0;j--)

for(k=125;k>0;k--);

}

void main()//主程序

{

while(1)

{

P0=0X01; delayms(500);

P0=0X04; delayms(500);

P0=0X10; delayms(500);

P0=0X40; delayms(500);

P0=0X80; delayms(500);

P0=0X20; delayms(500);

P0=0X08; delayms(500);

P0=0X02; delayms(500);

}

}

#include <reg51h>

#include<intrinsh>

#define uchar unsigned char

uchar j,temp;

void delay(unsigned int ms)

{

uchar t;

while(ms--)

for(t=0;t<123;t++);

}

void main()

{

P1=0xff;

delay(500);

temp=0xfe; //有点怪,led接在P23~P26

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

{

P1=temp;

delay(500);

temp=_crol_(temp,1);

}

P1=0xff;

while(1);

}

#include<reg52h>

#include <intrinsh>

void delayms(unsigned char ms) // 延时子程序

{

unsigned char i;

while(ms--)

{

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

}

}

main()

{

unsigned char LED;

LED = 0xff;

P0 = LED;

while(1)

{

delayms(1000);

LED = LED<<1; //循环右移1位,点亮下一个LED

if(LED==0x00)

{

LED=0xff;

}

P0 = LED;

}

}

#include<reg51h>

#include<intrinsh>

#define

uchar

unsigned

char

sbit

button=P1^0;

uchar

press=0;

void

Delay(uchar

z)

{

uchar

x,y;

for(x=z;x>0;x--)

for(y=255;y>0;y--);

}

void

Led_Continue()

{

P2=0xfe;

while(press==0|press==2)

{

P2=_crol_(P2,1);

Delay(255);

}

}

void

Led_Stop()

{

P2=0xff;

}

void

Keyscan()

{

if(button==0)

{

Delay(20);

if(button==0)

{

press+=1;

if(press==1)

{

Led_Stop();

}

if(press==2)

{

press=0;

}

}

}

}

void

main()

{

while(1)

{

Keyscan();

Led_Continue();

}

}

试试这个,在mian中要一直去扫描,否则就扫描一次不能达到目的。

然后你问用中断怎么完成,告诉你中断更简单,定时器用作延时用,键盘只需要写当这个按键按下时

TRx=~TRx

就是每一次按下,定时器开关都和上一次状态不一样,这样每按一次都会停止、开始、停止、开始

希望我的回答能帮助到你。

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

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

以上就是关于急!急!急!单片机流水灯汇编语言程序全部的内容,包括:急!急!急!单片机流水灯汇编语言程序、51单片机用keil4写LED流水灯程序,要求亮两秒,再过两秒又亮。假设LED1=P2^0。、单片机流水灯1357亮,然后2468亮,求程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存