单片机8个流水灯程序 要求:间隔0.5秒流水灯一次(01234567) 两盏流水一次(01,23,45,67) 闪亮一次(8盏灯亮灭

单片机8个流水灯程序 要求:间隔0.5秒流水灯一次(01234567) 两盏流水一次(01,23,45,67) 闪亮一次(8盏灯亮灭,第1张

#include<reg51>

#define uchar unsigned char

#define uint unsigned int

void delay(uchar t)

{

uchar x;

for(x=0;x<t;x++)

{

TH0=0x3c;

TL0=0xb0;

TR0=1;

while(!TF0);

TF0=0;

}

}

uchar code display[]={0x03,0x06,0x60};

uchar k,m;

void main()

{

while(1)

{

TMOD=0x01;

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

{ P1= display[k];

delay(10);

}

}

顺手写的觉得好就采纳吧

假设灯接P0口,低电平点亮

主程序

void main()

{

unsigned char a=0, i=0;

TMOD=0X01;

TH0=(65536-50000)/256;/定时50ms

TL0=(65536-50000)%256;

EA=1;ET0=1;

TR0=1;

P0=0XFF ;

while(1);

}

中断程序

void timer0 (void) interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

a++;

if(a==20)//1秒时间到

{a=0;i++;P0=0XEF>>(i-1);}

if{i==8)i=0;

}

下列程序调试成功。使用晶振为12M。

//软件延时,使P1口外接的8个发光二极管,以每秒1位的速度,轮流发光。

//发光顺序:0123,1234,2345,3456,4567,5670,6701,7012。循环。

//----------------------------

#include<reg52h>

#include<intrinsh>

unsigned char a;

void main()

{

unsigned char i, j, k;

a = 0x0f;

while(1) {

P1 = a; //假设8个发光二极管接在P1口

a = _crol_(a, 1);

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

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

for(k = 250; k > 0; k--);

}

}

//----------------------------

补充提问:0123不是同时亮,而是0 1 2 3 按顺序亮,再1234按顺序亮

回答补充提问,改动如下:

#include<reg52h>

#include<intrinsh>

void main()

{

unsigned char a, b, c, i, j, k;

a = 0xfe;

while(1) {

b = a;

for(c = 0; c < 4; c++) {

P1 = b;

b = _crol_(b, 1);

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

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

for(k = 250; k > 0; k--);

}

a = _crol_(a, 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>

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

    ;

  }

}

以上就是关于单片机8个流水灯程序 要求:间隔0.5秒流水灯一次(01234567) 两盏流水一次(01,23,45,67) 闪亮一次(8盏灯亮灭全部的内容,包括:单片机8个流水灯程序 要求:间隔0.5秒流水灯一次(01234567) 两盏流水一次(01,23,45,67) 闪亮一次(8盏灯亮灭、求一个AT89C52单片机流水灯程序,8个灯从左到右亮1个,亮2个亮3个,以此类推,用定时器、求一c51单片机,8位流水灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存