led点亮原理
led的工作是有方向性的,只有正极接到阳极上,负极接到阴极上,led灯中才会有电流通过,否则,led是不会亮的。
电源接到vcc上,要使led发光,就要给p2管脚赋低电平,即 p2 = 0(0表示低电平,1表示高电平);
点亮led灯
代码:
#inlcude "reg51.h" // 头文件
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P2^0;
void main()
{
while(1)
{
led = 0;
}
}
sbit 相当于是 int ,double。
sbit的赋值方法有三种:
1.sbit 位变量名=地址值;
2.sbit 位变量名=SFR名称^变量位地址值;
3.sbit 位变量名=SFR地址值^变量位地址值;
led闪烁
led闪烁就是要使led一亮一息,因为单片机执行程序命令很快,这里就要用到一个延迟函数,两个字节长的无符号整形一个单位大概延时10us;
代码:
#inlcude"reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
void delay(u16 i)
{
while(i--);
}
#define led1 P2;
void main()
{
while(1)
{
led = 0;
delay(50000);
led = 1;// 赋值为高电平时,led熄灭
delay(50000);
}
}
led 流水灯
原理:利用左移和右移函数使led灯轮流点亮。
移位函数:
代码:
#include"reg51.h"
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define led P2
void delay(u16 i)
{
while(i--);
}
void main()
{
u8 i;
led = 0xfe;// 1111 1110
delay(50000);// 450 ms
while(1)
{
for(i = 0;i < 7;i ++){
led = _crol_(led,1); // 1111 1101
delay(50000);// 450 ms
}
for(i = 0;i < 7;i ++){
led = _cror_(led,1);
delay(50000);
}
}
}
led = 0xfe:0xfe是十六进制表示方法,0x表示十六进制,f和
e分别表示15和14。电脑是识别二进制的,所以0xfe转换成二进制就是 1111 1110
即赋给p2 管脚的只有第一个是低电平。当进行左移函数时 1111 1110变成 1111 1101,这时第二个led发光,循环往复可达到流水灯的效果。
注意:
_crol _(a,b)这个函数前后都有下划线!!!