51单片机汇编控制8个流水灯

51单片机汇编控制8个流水灯,第1张

思路:

循环控制常亮状态的值,将其从最高位循环到最低位。这个用于最后状态的常亮

在常亮循环中,控制不是常亮的其它所有位进行再次循环,逐渐从最低位亮灭循环到最高位

代码如下:

#include <reg51h>

unsigned char PData;   //整体结果

unsigned char CurrData;//变化的最高位

//延时,本函数是非精确延时,若需要精确延迟则需要根据本函数的汇编语句进行精确计算后调整循环体次数

void delay(unsigned int ms){ 

  unsigned char i;

  while(ms--){

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

      ;

    }

  }

}

void main(){

  unsigned char i=0,j=0;

  PData=0x00;//全灭状态

  for (i=8;i>0;i--){//控制常亮的位置,先从最高位开始,依次循环到最低位

    for (j=0;j<i-1;j++){//从最低位循环到不是常亮的最高位

      P1=~(PData+(1<<j));//第i位亮

      delay(500);

      P1=~PData;//第i位灭

      delay(500);

    }

    PData=PData+(1<<(i-1));//置最高位为常亮状态

    P1=~PData;

    delay(500);

  }

  //停机

  while(1){

    ;

  }

}

#include <REGX52H>

void Delay1ms(unsigned int count) /延时函数,延迟时间为count×1ms)/

{

unsigned int i,j;

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

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

}

main()

{

unsigned char LEDIndex = 0; /声明8位变量LEDIndex,用来指示8个LED中哪个被点亮,初始值为00000000/

bit LEDDirection = 1; /声明位变量LEDDirection,用来指示点亮的方向,初始值为1/

while(1) /一直循环执行大括号里面的语句/

{

if(LEDDirection) /当LEDDirection=1时,0000 0001左移LEDIndex位,取反后送给P2端口,点亮一个LED/

P2 = ~(0x01<<LEDIndex);

else /当LEDDirection=0时,1000 0000右移LEDIndex位,取反后送给P2端口,点亮一个LED/

P2 = ~(0x80>>LEDIndex);

if(LEDIndex==7) /当一次循环结束时,把LEDDirection取反,下次循环时将以相反的顺序点亮/

LEDDirection = !LEDDirection;

LEDIndex = (LEDIndex+1)%8; /LEDIndex+1对8取余,保证LEDIndex在0~7之间/

Delay1ms(500); /延时500ms,即LED的点亮间隔为05s/

}

}

#include "reg51h"

main()

{

unsigned int i,j;

while(1)

{

P1=0xfe; //点亮第一个LED

for(i=200;i>0;i--)

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

P1=0xfd; //点亮第二个LED

for(i=200;i>0;i--)

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

P1=0xfb; //点亮第三个LED

for(i=200;i>0;i--)

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

P1=0xf7; //点亮第四个LED

for(i=200;i>0;i--)

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

P1=0xef; //点亮第五个LED

for(i=200;i>0;i--)

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

P1=0xdf; //点亮第六个LED

for(i=200;i>0;i--)

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

P1=0xbf; //点亮第七个LED

for(i=200;i>0;i--)

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

P1=0x7f; //点亮第八个LED

for(i=200;i>0;i--)

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

}

}

或:

#include "reg51h"

void delay(unsigned int t)

{

unsigned inti,j;

for(i=t;i>0;i--)

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

}

main()

{

unsigned char w,i;

while(1)

{

w=0xfe;

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

{

P1=w; //循环点亮LED

w<<=1; //点亮灯的位置移动,最低位补0

w=w|0x01; //将最低位置1

delay(500); //延时

}

}

}

或:

#include "reg51h"

//程序中使用_crol_函数,所以要包含头文件"intrinsh"

#include "intrinsh"

void delay(unsigned int t)

{

unsigned int i,j;

for(i=t;i>0;i--)

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

}

main()

{

unsigned char temp;

temp=0xfe;

while(1)

{

P1=temp;

delay(500); //延时

temp=_crol_(temp,1); //点亮LED的位置循环左移一位

}

}

程序如下:

#include <reg52h>

sbit led1 = P2^0;

sbit led2 = P2^1;

sbit led3 = P2^2;

sbit led4 = P2^3。

让电子信息技术与单片机技术相融合,有效提高了单片机应用效果。作为计算机技术中的一个分支,单片机技术在电子产品领域的应用,丰富了电子产品的功能,也为智能化电子设备的开发和应用提供了新的出路,实现了智能化电子设备的创新与发展。

从二十世纪九十年代开始,单片机技术就已经发展起来,随着时代的进步与科技的发展,目前该技术的实践应用日渐成熟,单片机被广泛应用于各个领域。现如今,人们越来越重视单片机在智能电子技术方面的开发和应用,单片机的发展进入到新的时期。

无论是自动测量还是智能仪表的实践,都能看到单片机技术的身影。当前工业发展进程中,电子行业属于新兴产业,工业生产中人们将电子信息技术成功运用。

以上就是关于51单片机汇编控制8个流水灯全部的内容,包括:51单片机汇编控制8个流水灯、用AT89C51单片机的P2口控制8个Led的流水灯的C程序看不懂、keil软件用单片机控制8个LED流水灯来回点亮(C语言程序)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存