51单片机流水灯左移右移程序(51单片机流水灯左移右移程序汇编)

http://www.itjxue.com  2023-03-19 01:12  来源:未知  点击次数: 

单片机流水灯实现3个LED同时亮 先左移动,向有移动.

#includereg51.h

#define uchar unsigned char

uchar num;

sfr led=P0;

sbit speaker=P1^0;

void delay(uchar a)

{

uchar i;

while(a--)for(i=0;i120;i++);

}

main()

{

uchar i;

while(1)

{

for(i=0;i3;i++)

{

led=0xf0;

delay(200);

clr speaker;

led=0xff;

delay(200)

setb speaker;

for(i=0;i3;i++)

{

led=0x0f;

delay(200);

clr speaker;

led=0xff;

delay(200)

setb speaker;

}

for(i=0;i2;i++)

{

led=0x00;

delay(200);

clr speaker;

led=0xff;

delay(200)

setb speaker;

}

}

51 单片机一个左右同时向中间流动的流水灯,keil编译通过,就是实现不了。这是为什么?

逻辑错误了,把两个while中的相等改为不相等:

a=0xfe; //放到循环之前就可以了 低电平亮??

P1 = a; //加一行,起始亮这个灯

while(1)

{

while(a!=0x7f) //主要错误 while(a==0x7f)

{

//P1=0xfe; //错误

//a=P1; //错误

delayms(500);

a=_crol_(a,1);

P1 = a; //加在这里

}

while(a != 0xfe) //主要错误 while(a==0xfe)

{

delayms(500);

a=_cror_(a,1);

P1=a;

//delayms(500);//放到前面一点点

}

}

//上面这段改完也不是两边同时向中间流水,只是左到右,左到右的来回流水灯

两边向中间流水,直接用查表法,

//11111111B, 01111110B, 10111101B, 11011011B, 11100111B

uchar MB[]={0xFF, 0x7E, 0xBD, 0xDB, 0xE7};

uchar i=0;

while(1)

{

P1 = MB[i++];

if(i=5) i=0;

delayms(500);

}

单片机 移位操作 右移 C语言

先说第一个问题:

比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住c语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02是table[1],以此类推。

再说第二个问题:

比如说从p1.0口发送出去,则可以写为

sbitout=p1^0;//定义out为p1.0口,这样今后好写程序

chari;

for(i=0;i8;i++)

{

out=data0x80;//因为高位在前,将它写成二进制就明白了

data=1;

}

上面的程序就能搞定了;

应该是所有的单片机都有cy位(不知道浮点dsp有没有);

c语言中左移和右移之后低位或高位自动补零,cy位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;

还有什么不明白的补充问题就是

(责任编辑:IT教学网)

更多

推荐CMS技巧文章