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

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

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 ;汇编程序结束

#include

"reg52h"

#include

"intrinsh"

//循环移动函数要用到的头文件

void

Delay(unsigned

int

t)

//延时子程序

{

unsigned

i;

while(t--!=0)

{

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

{;}

}

}

void

main(void)

{

unsigned

char

temp,num1,num2;

P0=0xff;

//LED初始化

起始状态

P2=0xff;

while(1)

//大循环

{

temp=0xfe;

//送给P0口的初值

点亮一侧第一个灯

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

//循环体用于循环左移用

循环8次

{

P0=temp;

//给P0

P2=0xff;

//P2控制的灯灭

Delay(100);

//延时

temp

=

_crol_(temp

,

1);

//执行一次循环就循环左移一位

与汇编的

RL功能相同

}

temp=0x7f;

//送给P0口的初值

点亮另一侧第一个灯

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

{

P0=temp;

P2=0xff;

Delay(100);

temp

=_cror_(temp,1);

//循环右移

同RR

下面的就是控制P2口了

同上面类似

}

//这个程序实现的效果是:先让P0口控制的LED自右向左点亮(只亮一个灯)再自左向右点亮

然后就是P2口

temp=0xfe;

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

{

P2=temp;

P0=0xff;

Delay(100);

temp

=

_crol_(temp

,

1);

}

temp=0x7f;

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

{

P2=temp;

P0=0xff;

Delay(100);

temp

=_cror_(temp,1);

}

}

}

org 0000h

mov p1,#00h;P1口送00,全灭

clr a;累加器请0

l0:jnb p35,l1;P35为低转l1

k0:jb p35,l2;P35为高转l2

mov r4,#0fh;R4=0fH

l1:inc a;累加器加1

mov p1,a;P1=A

lcall dl;延时

djnz r4,l1;R4减1不为0转l1

ljmp k0;转k0

mov r2,#07h;R2=07H

mov a,#80h;累加器=80H

l4:mov p1,a;P1=A

dl:mov r7,#0c8h;R7=C8H延时外层循环

dl1:mov r6,#7dh;R6=7DH延时内存循环

dl2:djnz r6,dl2;内存循环

djnz r7,dl1;外层循环

ret

l2:mov r2,#07h;R2=07H

mov r5,#01h;R5=1

k1:mov a,#01h;A=1

l3:mov p1,a;P1=A

rl a;A循环左移

lcall dl;延时

djnz r2,l3;R2减1不为0转l3

rr a;A循环右移

lcall dl;延时

djnz r2,l4;R2减1不为0转l4

djnz r5,k1;R5减1不为0转k1

sjmp l0;转l0

end

工具:STC系列51单片机、串口转换器(USB转TTL 或232转TTL)

材料:实验板一块(可以买现成的,也可以买面包板自己搭建),电阻、LED灯 若干,5V电源等。

以下程序可以直接用Keil C 直接编译执行。

//可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。

//具体实现方法可以参考如下程序:

 

#include <reg51h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

void delay(uint a);

void main()

{

P1=0xfe;

while(1)

{

// 向左循环点亮LED

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

{

P1=_crol_(P1,1);  // 左移一位,点亮下一位LED

delay(55);

}

// 向右循环点亮LED

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

{

P1=_cror_(P1,1); // 右移一位,,点亮上一位LED

delay(55);

}

}

}

// 延时函数,延时a毫秒

void delay(uint a)

{

uint x,y;

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

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

}

#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);

}

以上就是关于c51单片机中如何用汇编语言编写流水灯全部的内容,包括:c51单片机中如何用汇编语言编写流水灯、请高手解释一下这个单片机流水灯C语言程序,新手~~、单片机控制流水灯程序注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存