单片机流水灯汇编程序代码(单片机流水灯程序汇编 使灯来回闪烁)

http://www.itjxue.com  2023-03-06 22:38  来源:未知  点击次数: 

51单片机八个灯的流水灯代码

51单片机八个灯的流水灯代码:

1、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。

2、#include "reg51.h"首先写出单片机的头函数。

3、#include "intrins.h"输入位移函数。

4、unsigned int count=0,led;定义函数。

5、输入主函数,定义单片机的端口,写入延时函数。

编辑推荐

对于刚接触单片机的学习者,似乎都很迷茫,C语言、汇编语言、电路、开发板,不知道从哪儿开始学起。其实在学习单片机原理与应用系统开发时,只有在学习一些理论知识的基础上,多阅读单片机应用系统开发案例,注重单片机应用系统开发实践训练,才能透彻地理解和掌握单片机结构与原理,才能更快更好地掌握单片机应用知识和单片机应用系统开发技能。

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

汇编程序如下:

; 花样流水灯(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--);

}

单片机流水灯汇编程序

KEYFX EQU P1.0 ;方向控制键

KEYKM EQU P1.1 ;速度控制键

FX BIT 00H ;方向标志

SPEED BIT 01H ;速度标志

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000) ;50毫秒中断一次

MOV TL0,#LOW(65536-50000)

SETB TR0

SETB ET0

SETB EA

MOV R2,#2

MOV A,#0FEH ;灯初始化

CLR FX

CLR SPEED

MOV SPEED,#2

LOOP:

JB KEYFX,LOOP1 ;方向键按下否

JNB KEYFX,$

CPL FX

SJMP LOOP

LOOP1:

JB KEYKM,LOOP ;速度键按下否

JNB KEYKM,$

CPL SPEED

SJMP LOOP

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

JB FX,T001

RL A ;左循环

SJMP T002

T001:

RR A ;右循环

T002:

DJNZ R2,T0E

JB SPEED,T003

MOV R2,#2 ;快速

SJMP T0E

T003:

MOV R2,#10 ;慢速

T0E:

RETI

END

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

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

(责任编辑:IT教学网)

更多

推荐软件水平考试文章