点亮LED
条件
51单片机中led的端口位P2口,通过控制led的端口实现led点亮,对应的位电平为1是为熄灭状态,电平为0时,led点亮
闪烁
利用for循环,控制位电平状态,利用延时函数,实现闪烁效果
#include"reg52.h"
sbit LED_1=P2^0;
typedef unsigned int u16 ;
typedef unsigned char u8;
void delay_10us(u16 ten_us)\\利用晶振实现大概10us的定时
{
while(ten_us--);
}
void main()
{
LED_1=0;
while(1)
{
LED_1=1;
delay_10us(50000);
LED_1=0;
}
流水灯
因为流水灯实现靠led递进点亮,所以直接定义整个端口,对端口进行操作
for循环位操作
因为位操作会使往前移的位补0,所以不能直接设置位0xfe,例如:11111110,移动一位就成了11111100,会点亮两个灯,设置为0x01左移再取反就不会有这个问题,因为移动后只有一个1,取反后就只有一个0,只有一个灯亮
#include"reg52.h"
#define LED_PORT P2
typedef unsigned int u16 ;
typedef unsigned char u8;
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
u8 i=0;
while(1)
{
for(i=0;i,8;i++)
{
LED_PORT=~(0X01<<i);
delay_10us(50000);
}
}
}
库函数操作
库函数操作需要用到intrins.h头文件,用到 cror (unsigned char, unsigned char);和_crol_ (unsigned char, unsigned char);两个函数,r代表right是右移,l则是left左移,因为这里定义了初始值,所以只用移动七次,循环设置七次,左移到最后一位还可以将其右移,换个方向进行流水灯。
#include"reg52.h"
#include"intrins.h"
#define LED_PORT P2
typedef unsigned int u16 ;
typedef unsigned char u8;
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
while(1)
{
u8 i=0;
LED_PORT=0xfe;
for(i=0;i<7;i++)
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++)
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}