新闻  |   论坛  |   博客  |   在线研讨会
Proteus单片机:广告灯的左移右移
A670521546 | 2011-11-04 16:28:17    阅读:3558   发布文章

做单一灯的左移右移,硬件电路如图所示,八个发光二极管L1L8分别接在单片机的P1.0P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。



每次送出的数据是不同,具体的数据如下表1所示

P1.7

P1.6

P1.5

P1.4

P1.3

P1.2

P1.1

P1.0

说明

D8

D7

D6

D5

D4

D3

D2

D1

 

1

1

1

1

1

1

1

0

L1

1

1

1

1

1

1

0

1

L2

1

1

1

1

1

0

1

1

L3

1

1

1

1

0

1

1

1

L4

1

1

1

0

1

1

1

1

L5

1

1

0

1

1

1

1

1

L6

1

0

1

1

1

1

1

1

L7

0

1

1

1

1

1

1

1

L8



程序编写

第一种用最直接最为笨拙的方法,把每次的值赋给端口P1,如下:
#include<reg51.h>

void delay()
{
 int i, j;
 for(i=1000;i>0;i--)
 for(j=100;j>0;j--);
}

void main()
{
while(1){
P1=0xfe;
delay();

P1=0xfd;
delay();

P1=0xfb;
delay();

P1=0xf7;
delay();

P1=0xef;
delay();

P1=0xdf;
delay();

P1=0xbf;
delay();

P1=0x7f;
delay();

P1=0xbf;
delay();

P1=0xdf;
delay();

P1=0xef;
delay();

P1=0xf7;
delay();

P1=0xfb;
delay();

P1=0xfd;
delay();

//P1=0xfe;
//delay();

}
}

这种方法比较的繁琐,但是在于直接。

第二种方法,利用左移右移,灯每次左移或右移一次,根据C语言的左移右移的方法来编写程序。如下:
#include<reg51.h>
unsigned char i;
unsigned char temp;
unsigned char a,b;

void delay()
{
 int i, j;
 for(i=1000;i>0;i--)
 for(j=100;j>0;j--);
}

void main()
{
temp=0xfe;
P1=temp ;
delay();

while(1){

for(i=1;i<8;i++) {
 a=temp<<(i);
 b=temp>>(8-i);
 P1=a | b;
 delay();
 }

 for(i=1;i<=8;i++) {
 a=temp>>(i);
 b=temp<<(8-i);
 P1=a | b;
 delay();
 }

}
}

这种方法对C语言的基础要求掌握比较好,要弄清楚C语言中左移右移的关系,不然就不容易理解为什么a左移,b右移,然后相或,就能让对应的端口值为0 ,让对应的灯亮,同理右移时。

这是广告灯的左移右移,我们还可以变化其他的样式,编写对应的程序即可实现。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客