原理图
发光二极管原理: 当电流从发光二极管的阳极 流向阴极,则亮。所以当P20为低电平,灯亮 ,P20为高电平,灯灭
PR9 是一个排阻,用于限流,防止电流过大烧坏灯泡
#include "reg52.h"
sbit LED1 = P2^0;
//点亮第一个灯
void main(void){
while(1){
LED1= 0; //P20设置为低电平
}
}
延迟的计算:
环境配置:
然后在程序中打delay_us()函数打断点,查看执行完这一句耗时
时间相减少,大概就时450ms
以此类推delay 1000ms的推算,但是这种方式不精准
灯闪烁的效果:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1 = P2^0;
//使用循环的方式来计算延迟时间
void delay_us(u16 time)
{
while(time--);
}
//点亮第一个灯
void main(void){
while(1){
LED1= 0; //亮
delay_us(50000); //大约450ms
LED1 =1;
delay_us(50000); //大约450ms
}
}
流水灯实现:
原理: P2 的0到7口逐渐拉高拉低就可以了
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
//sbit LED1 = P2^0;
#define LED_PORT P2
//使用循环的方式来计算延迟时间
void delay_us(u16 time)
{
while(time--);
}
//点亮第一个灯
void main(void){
u8 i = 8;
while(1){
for(i=0;i<8;i++){
LED_PORT =~(0x01<<i); // 0x1111110 表示P2.0亮
delay_us(50000);
}
}
}
使用内置的库函数 cosl cosr 左移 右移来实现流水灯的效果
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
//sbit LED1 = P2^0;
#define LED_PORT P2
//使用循环的方式来计算延迟时间
void delay_us(u16 time)
{
while(time--);
}
//点亮第一个灯
void main(void){
u8 i = 8;
LED_PORT = 0xfe; //首先 先让第1个灯为0亮起来,其他为1,0X1111110
delay_us(50000);
while(1){
for(i=0;i<7;i++){
LED_PORT = _crol_(LED_PORT,1); //左移1位
delay_us(50000);
}
for(i=0;i<7;i++){
LED_PORT = _cror_(LED_PORT,1); //左移1位
delay_us(50000);
}
}
}