问答

单片机汇编流水灯实验(单片机汇编流水灯)

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

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

ORG 0000H;复位启动

AJMP START;

ORG 001BH;T1中断

AJMP T1INT;

;定义变量========================

YSJSEQU 30H;延时计数器

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

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

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

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

;汇编程序结束

单片机流水灯用汇编语言写怎么从两边向中间亮再从中间

汇编程序如下:

; 花样流水灯(8个发光二极管以各种形式循环点亮)

; 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮)

ORG 0000H ;伪指令,指定程序从0000H开始存放

LJMP MAIN ;跳转指令,程序跳转至MAIN处执行

ORG 0030H ;伪指令,指定程序从0030H开始存放

MAIN: MOV SP, #60H ;给堆栈指针赋初值

MOV P1,#0FFH ;给P1口赋值

MOV DPTR,#TABLE;查表

LIGHT: MOV R4,#42 ;设置循环次数

LOOP: MOV A,#42 ;给A赋初值

SUBB A,R4 ;将A的值与R4的值相减,结果存在A中

MOVC A,@A+DPTR ;将A+DPTR的值所对应的TABLE中的值赋给A

MOV P1,A ;将A的值赋给P1口

LCALL DEL1S ;调用1S延时子程序

DJNZ R4,LOOP ;判断R4是否为0,不为0跳转,为0顺序执行

LJMP LIGHT ;跳转指令,跳转至LIGHT处继续执行

;1S延时子程序(11.0592MHz晶振,误差0微秒)

DEL1S: MOV R5, #089H

DL1S0: MOV R6, #0A4H

DL1S1: MOV R7, #013H

DJNZ R7, $

DJNZ R6, DL1S1

DJNZ R5, DL1S0

RET

TABLE: ;定义表格数据

DB 0FFH ;全灭

DB 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐个点亮

DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H 080H 000H ;依次逐个叠加

DB 080H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐个递减

DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;两边靠拢后分开

DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;两边叠加后递减

DB 000H ;全亮

END ;程序结束指令

C语言程序如下:

/* 该实验是花样流水灯(8个发光二极管以各种方式循环点亮),功能是花样流水灯(8个发光二极管以1S间隔以各种方式循环点亮) */

#include//包含reg.52文件

#define uint unsigned int//宏定义

#define uchar unsigned char//宏定义

void delay(uint z);//声明延时函数

uint a;//定义循环用变量

uchar code table[]={

0xff,//全灭

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加

0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减

0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开

0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减

0x00,//全亮

};//定义循环用数据表格

/*亮的现象:先是全灭,然后依次逐个点亮,然后依次逐个叠加,

然后依次逐个递减,然后两边靠拢后分开,然后两边叠加后递减,

最后全亮。循环!*/

void main()//main函数

{

a=0;//给a赋初值

while(1)//while循环

{

P1=table[a];//将a所在的table中的值赋给P1口

delay(1000);//1S延时子程序

a++;//a的值加一

if(a==42)//测试a是否等于42

a=0;//给a赋值

}

}

void delay(uint z)//1ms延时子程序,通过z值改变延时时间

{

uint x,y;

for(x=z;x0;x--)

for(y=110;y0;y--);

}