您的位置:首页 > 其它

51单片机流水灯入门(理解IO口的组操作)

2012-11-18 17:26 274 查看
P1口接8个LED的负极,然后LED的正极经过电阻直接接Vcc

1:手工实现

1 流水灯单个闪过代码

#include <reg52.h>

void delayms(int X)
{
int i, j;
for(i = X;  i ; --i)
for(j = 110;j ; --j);
return;
}

int main()
{
int i;
for(i = 0; i < 8; ++i)
{
P1 = 0xff - (1 << i);
delayms(500);
}
return 0;
}


PS:给新同学解释下,单个引脚赋值0的时候点亮

(P1只能采用十六进制数来赋值)

0xff的二进制 : 1 1 1 1 1 1 1 1

如果要点亮第一个: 1 1 1 1 1 1 1 0

同理要点亮第二个: 1 1 1 1 1 1 0 1

即要点亮第二个,需要把 二进制的 11111101转换成十六进制数,然后赋值给P1口。

11111101的由来:

1 1 1 1 1 1 1 1 => 0xff

- 0 0 0 0 0 0 1 0 => 1 << 1

= 1 1 1 1 1 1 0 1 =>OK~

所以代码中赋值语句为 : P1 = 0xff - (1 << i); 记住要给<<加括号哦~ (运算符优先级问题);

最后的delayms为延时函数。

2:8个灯逐个点亮,最后全亮

#include <reg52.h>

void delayms(int X)
{
int i, j;
for(i = X;  i ; --i)
for(j = 110;j ; --j);
return;
}

int main()
{
int i, j = 0xff;
for(i = 0; i < 8; ++i)
{
P1 = j <<= i;
delayms(500);
}
return 0;
}


2:库函数实现

#include <reg52.h>
#include <intrins.h>

/* _crol_ (value, ctr) */
/* _cror_ (value, ctr) */

void delayms(int x)
{
int i, j;
for(i = x; i; --i)
for(j= 110; j; --j);
return ;
}

int main()
{
int dps = 0xfe;
while(1)
{
P1 = dps;
delayms(500);
dps = _crol_(dps, 1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: