用AT89C51单片机的P2口控制8个Led的流水灯的C程序看不懂

用AT89C51单片机的P2口控制8个Led的流水灯的C程序看不懂,第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/

}

}

假设P1接8 个LED,高电平时LED点亮,主程序如下:

void main(void)

{

uchar i;

while(1)

{

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

{

P1=1<<i;

delay_ms(500);

}

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

{

P1=0x80>>i;

delay_ms(500);

}

}

}

简单点的,用表格,事先计算好,放到ROM中,用的时候逐行编译输出就可以。

复杂点的,开一个缓冲区,用循环程序,根据花样的不同,每次填充一行,并输出,然后再计算一下行。除非表格太大,不建议这样用。

#define len 8

char tablelist[][len] =

{

"",

"",

"",

"",

"",

}

outline( char s )

{

int i;

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

{

if ( s[i] == '0' )

{

// 对应的灯亮

}

else

{

// 对应的灯灭

}

}

}

main()

{

for(;;)

{

outline( tablelist[i]);

delay();

}

}

要看你的时钟周期,如果是12Mhz的话,每个时钟周期MC=6*2/12 M =1us,所以延迟是让机器计数1000000下,上面那个公式你自己套用24Mhz的就是2000000下。c语言的循环次数你自己算,每条指令一个周期,所以楼上的程序在12Mhz下是1s延迟。

思路:

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

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

代码如下:

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

    ;

  }

}

用汇编编程如下:

ORG 0000H

LJMP MAIN

MAIN:

ORG 0100H

MOV A ,#80H ; 高电平亮灯。如低电平亮灯,改成#7FH

;正向循环

ZXH :

MOV P0 , A

RR A

LCALL S50MS ; 延时50MS

JB P10 , FXH

LJMP ZXH

;

;反向循环

FXH :

MOV P0 , A

RL A

LCALL S50MS ; 延时50MS

JNB P10 , ZXH

LJMP FXH

;

;延时50MS 子程序,自己编编

S50MS:

RET

END

以上就是关于用AT89C51单片机的P2口控制8个Led的流水灯的C程序看不懂全部的内容,包括:用AT89C51单片机的P2口控制8个Led的流水灯的C程序看不懂、C语言控制单片机,控制八个流水灯从左到右依次亮,最后又从右到左依次亮回来,一直循环下去,求帮帮忙、51单片机c语言编写一个流水灯程序,要求如下(不能用数组,8个led指示灯从两边往中间移动,然后再分开)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存