STC89C52单片机入门第五课

2026-02-24 07:04:30

1、首先,什么是流水灯

无非就是1号灯亮,其他灭,2号灯亮其他灭......循环到尾返回头。

这里我假设用P2口接的LED灯,你们根据自己LED接的IO口,自己注意修改

STC89C52单片机入门第五课

2、开始写程序,前面不再细说

写入一个1MS延时程序

在#include<reg52.h>下面,再包含1个头文件

#include <intrins.h> 

因为这个程序要用到里面的循环左移指令和循环右移

STC89C52单片机入门第五课

3、在主函数内,写入P2=0xfe;

while(1)内,写入

P2=_cror_(P2,1);//是逗号不是小数点

delay(5);

OK,这样的程序烧录进去,你就会看到循环右移的流水灯效果了

如果你们的P2是共阴极的话,那应该改为P2=0x01;

STC89C52单片机入门第五课

4、这里说明下_cror_(P2,1)这个指令的意思

_cror_(P2,1)是循环右移指令,后面的1表示右移多少位

比如P2是0xfe也就是1111 1110那么循环右移1位后,就是0111 1111

再循环右移就是1011 1111 再来就是1101 1111 一直循环下去

那显示的效果,不就是1个亮过1个吗?

如果你想循环左移呢?

那就把_cror_ 改为_crol_就可以了

_crol_就是循环左移指令

5、那假如你想一次亮2个,移动2个呢

那把P2赋值为0xfc也就是1111 1100

当然,你不一定要16进制,你也可以直接

P2=11111100;

这样也是可以的

然后循环左移

_crol_(P2,2);这样就可以实现循环移动2位了

STC89C52单片机入门第五课

6、那如果你不想用循环左移呢?

那也是可以的,用普通左移指令“<<”

左移指令和循环左移有一些区别,在这里说下

比方P2=0xfe>>1;那么,结果P2是等于0111 1111

再左移,P2=0011 1111 再左移 0001 1111

左移指令,是直接把最高位补0,把最低位扔掉

这样说应该明白吧?右移指令>>也是同个道理

7、那么怎么做成流水灯效果呢?

如下图,我相信聪明的朋友能看明白的

不明白的,也用着急学习这个,慢慢来,先照上面的循环左移测试

STC89C52单片机入门第五课

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢