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 <AT89X51H> //预处理文件里面定义了特殊寄存器的名称如P1 口定义为P1

void main(void)

{

//定义花样数据

const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

0xE7,0xDB,0xBD,0x7E,0xFF};

unsigned int a; //定义循环用的变量

unsigned char b; //在C51 编程中因内存有限尽可能注意变量类型的使用

//尽可能使用少字节的类型,在大型的程序中很

受用

do{

for (b=0; b<32; b++)

{

for(a=0; a<30000; a++); //延时一段时间

P1 = design[b]; //读已定义的花样数据并写花样数据到P1 口

}

}while(1);

}

程序中的花样数据可以自以去定义,因这里我们的LED 要AT89C51 的P1 引脚为低电平才

会点亮,所以我们要向P1 口的各引脚写数据O 对应连接的LED 才会被点亮,P1 口的八个引

脚刚好对应P1 口特殊寄存器的八个二进位,如向P1 口定数据0xFE,转成二进制就是

11111110,最低位D0 为0 这里P10 引脚输出低电平,LED1 被点亮。如此类推,大家不难算

出自己想要做的效果了。

留个邮箱给你发个入门文档

#include<reg51h>

void delay(int a)

{

while(a--);

}

main()

{

unsigned char i;

while(1)

{

P0=0xff;

for(i=0;i<8;i++){P0=P0<<1;delay(30000);}

P0=0x00;

for(i=0;i<8;i++){P0=(P0>>1)|0x80;delay(30000);}

}

}

我就写个顺时针亮的程序(详细解释,其它的你就自己写),全手打的哦,用的是汇编,我水平也不怎么高,但是你的问题也是入门级的,还有我假设是高电位亮,一共12灯从P00开始到P14(P14和P00相接)。ORG 4000HSTART:CLR P0CLR P1 /P0 P1清零MOV P0,#80H/1灯亮LCALL DEL/调用延时程序MOV P0,#0C0HLCALL DELMOV P0,#0E0HLCALL DELMOV P0,#0F0HLCALL DELMOV P0,#0F8HLCALL DELMOV P0,#0FCHLCALL DELMOV P0,#0FEHLCALL DELMOV P0,#0FFHLCALL DELSTEB P0/P0口值位,前8灯全亮MOV P1,#080HLCALL DELMOV P1,#0C0HLCALL DELMOV P1,#0E0HLCALL DELMOV P1,#0F0HLCALL DELMOV P1,#0F8HLCALL DELLJMP START/程序跳到开始,进行循环DEL:MOV R7,#200MOV R5,#20DEL1:MOV R6,#123 NOPDEL2:DJNZ R6,DEL2DJNZ R7,DEL1DJNZ R5,DEL1RET/延时程序 共约1SSJMP $起始位4000H 可能不对 要自己找。

//右边补0,直接移位就可以temp<,=1; 如果流水灯只有一个亮,下面的程序就是对的,移位之后补1

#include "reg51h"

void delay(unsigned char m);

main()

{

unsigned char temp;

temp=0xfe; //temp=1111 1110,使得P1口的某个引脚为低电平(亮)

while(1)

{

P1=temp; //P1口的数据来自temp,而temp的数据是不断变化的

temp=temp<<1 | 0x01;//temp向左移动一位,右边补0

if(temp==0xff)

temp=0xfe; //( 这里就是要填补的空!!!!!!!!!)

delay(20);

}

}

void delay(unsigned char m) //延时子程序

{

unsigned char i,j,k; //定义字符型变量,范围为0至255

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

{

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

{

for (k=0;k<100;k++);

}

}

1、首先要设计电路图,利用proteus软件进行电路图的设计。所需元器件:AT89C51单片机1个。LED-RED8个。电源VCC1个。

2、使用keil4软件进行流水灯程序的编辑。

3、方法一编写程序采用的是左移函数(_crol_(a,b))和右移函数(_cror_(a,b))的方法,需在前加上头文件#include。方法二是一个比较笨的方法,需要计算出每个灯亮的位编码。

4、总结:单片机流水灯的设计分为两个步骤,第一步是原理图的绘制;第二步是keil4流水灯控制程序的编写。在写程序的时候最好使用第一种方法,采用位移函数来进行流水灯的设计。

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

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

以上就是关于c51单片机中如何用汇编语言编写流水灯全部的内容,包括:c51单片机中如何用汇编语言编写流水灯、51单片机16路流水灯怎么用C语言写,并求每个步骤的讲解、51单片机流水灯,一开始全亮然后逐个熄灭,怎么编程序,大一c语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存