单片机控制流水灯程序注释

单片机控制流水灯程序注释,第1张

org 0000h

mov p1,#00h;P1口送00,全灭

clr a;累加器请0

l0:jnb p35,l1;P35为低转l1

k0:jb p35,l2;P35为高转l2

mov r4,#0fh;R4=0fH

l1:inc a;累加器加1

mov p1,a;P1=A

lcall dl;延时

djnz r4,l1;R4减1不为0转l1

ljmp k0;转k0

mov r2,#07h;R2=07H

mov a,#80h;累加器=80H

l4:mov p1,a;P1=A

dl:mov r7,#0c8h;R7=C8H延时外层循环

dl1:mov r6,#7dh;R6=7DH延时内存循环

dl2:djnz r6,dl2;内存循环

djnz r7,dl1;外层循环

ret

l2:mov r2,#07h;R2=07H

mov r5,#01h;R5=1

k1:mov a,#01h;A=1

l3:mov p1,a;P1=A

rl a;A循环左移

lcall dl;延时

djnz r2,l3;R2减1不为0转l3

rr a;A循环右移

lcall dl;延时

djnz r2,l4;R2减1不为0转l4

djnz r5,k1;R5减1不为0转k1

sjmp l0;转l0

end

1灭)。编译器keil

C代码如下:

#include

#include

//包含循环左移函数

_cro_l头文件

unsigned

char

tmp;

//中间变量

//////////////////////////////////////////////////////////////////////////////////////////////////

//

延时子程序

////////////////////////////////////////////////////////////////////////////////////////////////

void

delay(unsigned

int

cnt)

{

while(--cnt);

}

//////////////////////////////////////////////////////////////////////////////////////////////////

//

主函数

////////////////////////////////////////////////////////////////////////////////////////////////

main()

{

while(1)

//外层循环

{

tmp

=

0xfe;

P1

=

tmp;

while(1)

//内层循环,执行1、3、5、7亮灯循环

{

delay(30000);

//延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定

tmp

=

_crol_(tmp,2);

P1

=

tmp;

if(tmp

==

0xbf)

//判断是否已经点亮到第7灯。是,则退出进入2、4、6、8循环

{

break;

}

}

tmp

=

0xfd;

P1

=

tmp;

while(1)

//内层循环,执行2、4、6、8亮灯循环

{

delay(30000);

//延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定

tmp

=

_crol_(tmp,2);

P1

=

tmp;

if(tmp

==

0x7f)

//判断是否已经点亮到第8灯。是,则退出进入1、3、5、7循环

{

break;

}

}

}

}

内循环你应当能看懂,就是完成灯流水。循环次数取决于外循环,例如第一次外循环(第1个灯)要循环8次、第二次外循环(第1、2个灯)要循环7次。

内循环执行完一遍之后,a回复到了最低位为第一个0的状态,因此要_crol_(a,j)将后续的0也都提上来。最后a

=

a<<1,是为下一次外循环做准备,即下一次将开始多点一个灯。

和你说一句关键的(别告我你整个程序一句都看不懂):

P1=0xfe;

0xfe是十六进制表示的数,二进制就是1111 1110,通过你的程序和相关注释可以看出,硬件上你有8个led灯连接P1口,且这些led是低电平亮。P1=0xfe(1111 1110)也就是表示七个灯灭,一个灯亮。接下来的代码就是让P1数据0xfe左移且低位补1,移一次就是1111 1101,、两次就是1111 1011,三次是1111 0111。。。以此类推,可以看出它是0由最低位到最高位依次移过去的,而刚说了0表示led亮,这也就是led从一边到另一边依次点亮的效果。

后面的代码按我上面说的自己理解,完全对你解释太麻烦,对你也没多大好处,只有你自己理解了才能学好单片机

#include

"reg52h"

#include

"intrinsh"

//循环移动函数要用到的头文件

void

Delay(unsigned

int

t)

//延时子程序

{

unsigned

i;

while(t--!=0)

{

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

{;}

}

}

void

main(void)

{

unsigned

char

temp,num1,num2;

P0=0xff;

//LED初始化

起始状态

P2=0xff;

while(1)

//大循环

{

temp=0xfe;

//送给P0口的初值

点亮一侧第一个灯

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

//循环体用于循环左移用

循环8次

{

P0=temp;

//给P0

P2=0xff;

//P2控制的灯灭

Delay(100);

//延时

temp

=

_crol_(temp

,

1);

//执行一次循环就循环左移一位

与汇编的

RL功能相同

}

temp=0x7f;

//送给P0口的初值

点亮另一侧第一个灯

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

{

P0=temp;

P2=0xff;

Delay(100);

temp

=_cror_(temp,1);

//循环右移

同RR

下面的就是控制P2口了

同上面类似

}

//这个程序实现的效果是:先让P0口控制的LED自右向左点亮(只亮一个灯)再自左向右点亮

然后就是P2口

temp=0xfe;

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

{

P2=temp;

P0=0xff;

Delay(100);

temp

=

_crol_(temp

,

1);

}

temp=0x7f;

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

{

P2=temp;

P0=0xff;

Delay(100);

temp

=_cror_(temp,1);

}

}

}

uchar

code

display_P0[]={

0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//P0口由低位向高位依次亮灯(前一位的灯灭)

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//P0口灯全灭

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,,//P0口灯全灭

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//P0口由高位向低位依次亮灯(前一位的灯灭),最后全灭

0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,//P0口由低位向高位依次亮灯(前一位的灯b不灭)

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

//P0口灯全亮

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//P0口灯全亮

0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,

//P0口灯由高位向低位依次灭(前一位不亮),最后仅剩最低位亮灯。

0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x7F,//P0口以两个亮灯为单位,由低位向高位逐位移动,最后移至最高位,仅剩最高位亮灯。

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

//P0口全灭

0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,//P0口中间两位亮灯,然后两个亮灯分别向两端移动,当分别移至最高位和最低位时,再按原方法返回,返回至起始状态后全灭。

0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,//P0口中间两位亮灯,然后两个亮灯分别向两端扩散,当分别扩散至次高位和次低位时,再按原方法恢复,返回至起始状态后全灭。

0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,//差位两灭,先是最高位亮,然后最高位灭;再变成中间两位灭,其余的全亮;全灭→低四位亮→高四位亮→全灭。

0xFF,0x00,0x00,0xFF,0xFF

};//全灭→全亮→全亮→全灭→全灭

uchar

code

display_P2[]={

//P2口可参照P0口流水灯情况。基本相同。

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

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

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

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,

//

0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

//

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,

0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0xFF,

//

0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,

0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,

0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,

0xFF,0x00,0x00,0xFF,0xFF

};

以上就是关于单片机控制流水灯程序注释全部的内容,包括:单片机控制流水灯程序注释、c语言流水灯程序 求具体代码、单片机C程序 LED流水灯的 看不懂 求解释。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存