除了P0端口需要自己外接上拉电阻(否则只能输入输出低电平),其它自带上拉电阻,因此都可以实现高低电平的输入输出
LED灯本质是发光二极管。单片机输入电流控制在3mA—20mA之间,可串联电阻来控制亮度,电阻越大,亮度越弱。I=U/(R+r0),即单片机接入电压固定情况下,外加电阻R越大,电流I越小,即亮度越弱。
LED(Light Emitting Diode),发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。
半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。但这两种半导体连接起来的时候,它们之间就形成一个P-N结。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED灯发光的原理。而光的波长也就是光的颜色,是由形成P-N结的材料决定的。
A2-A4开发板只能用P2管脚,A5-A5开发板可随意连线使用(P0,P1,P2,P3管脚都可以)
点亮LED灯,如点亮D1指示灯。即让D1指示灯所连接管脚输出一个低电平。完成后可再控制D1指示灯闪烁,即间隔一段时间点亮和熄灭D1指示灯。
方法一
#include "reg52.h"
sbit LED1=P2^0;
void main()
{
LED1=0;
while(1)
{
//LED1=0;
}
}
方法二
#include //头文件
sbit LED0=P2^0; //命名P2^0为LED0
void main()
{
P2=0xff; //所有灯都熄灭
while(1)
{
LED0=0; //LED0点亮
}
}
#include
void main()
{
while(1)
{
P2=0xaa; //16进制数aa代表10101010,代表亮灯方式
}
}
m
#include
void main()
{
P2=0x8b;
while(1);
}
#include
#define unit unsigned int //宏定义
sbit led1= P2^3;
unit i,j;
void main()
{
P2=0x00; //让所有灯熄灭
while(1)
{
led1=0;
for(i=1000;i>0;i--) //双循环获得更长的延长时间
for(j=100;j>0;j--);
led1=1;
for(i=1000;i>0;i--)
for(j=100;j>0;j--);
}
}
加入延时函数,由于仿真时,
1秒(s)=1000毫秒(ms)1秒(s)=1000000 微秒(μs)1(微秒)us==1/1000000=0.000001s(秒)
#include
typedef unsigned int u16;
sbit LED1=P2^0;
void delay_10us(u16 ten_us)//当传入Ten_us=1时,仿真时间大约延时10us
{
while(ten_us--);
}
void main()
{
while(1)
{
LED1=0;//µãÁÁ
delay_10us(50000);
LED1=1;//ϨÃð
delay_10us(50000);
}
}
方法二
#define unit unsigned int //宏定义
sbit led1= P2^3;
unit i,j;
void delayms(xms) //延时函数,双循环延时法
{
unit i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
P2=0x00; //让所有灯熄灭
while(1)
{
led1=0;
delayms(500); //熄灭和点亮时间不同,可以控制延时间隔
led1=1;
delayms(5000);
}
}
方法一
#include"reg52.h"
typedef unsigned int u16;
#define LED_PORT P2
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
u16 i=0;
while(1)
{
for(i=0;i<8;i++)
{
LED_PORT=~(0x01<<i);//i=0,D1亮;i=1,D2亮
delay_10us(50000);
}
}
}
熄灭的灯逐渐左移
//方法二
#include
#include //包含_crol_函数的头文件
#define uchar unsigned char
#define uint unsigned int
uchar A;
void delayms(uint xms);
void main()
{
aa=0x01; //0000 0001 只有一个灯熄灭
// aa=0xfe; 亮着的等左移
while(1)
{
P2=A;
delayms(500); //延时
A=_crol_(A,1); //将aa左移,熄灭的灯逐渐向左
// aa=_crol_(A,-1) 右移一个单位
}
}
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
#include"reg52.h"
#include"intrins.h"
typedef unsigned int u16;
#define LED_PORT P2//使用宏定义将P2端口定义
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
u16 i=0;
LED_PORT=~0x01;
while(1)
{
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);
}
}
}
单片机—LED灯基础知识
1.有两种编程方法:
(1)并行操作:P1=0X##
-在LED灯编程中,数字1代表灯关,0代表灯亮,P1代表所有LED灯。
-可以通过2进制数转16进制数来控制灯的开关,前面一般都加上0x,例如:有8个LED灯,都为关闭状态时,可写为2进制数1111 1111,将其转换为16进制数为FF,可写为P1=0XFF
#include
void main()
{
P1=0xF0; #代表前4个灯亮
}
(2)位操作:sbit LED1=P1^0
#其中0的意思是LED灯的第一个灯,以此类推1代表第二个灯。
现在我们让第一个和第二个灯亮
#include #reg52代表单片机类型型号
LED1=P1^0; #定义变量
LED2=P1^1;
void main()
{ LED1=0;
LED2=0;
} #0代表让灯亮
2.LED灯闪亮(亮一下然后延迟)
#include
unsigned int i;
while(1) #死循环,一直循环
{ P1=0;
i=65535;
while(i--); #延迟
P1=0XFF;
i=65535;
while(i--);
}
延迟函数
#include
void delay(unsigned int z) #延迟函数
{ unsigned int x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void main()
{
while(1)
{ P1=0;
delay(200);
P1=0XFF;
delay(200); #8个灯闪亮
}
}
3.流水灯模式
左移右移函数(挨个亮)
左移:”<<”每执行一次左移,最低位补0,其它位向左移移位。
右移:”>>”每执行一次右移,最高位补0,其它位向右移一位。
循环移位函数:(1)标准库函数:intrins.h
(2)字符型循环左移:crol
(3)字符型循环右移:cror
注意:使用库函数的时候,for循环只执行7次,因为库函数不会移动过程中,高位会自动补到低位,而不是补0
流水灯代码实现:
#include
#include
void delay(unsigned int z)
{ int x,y;
for(x=z;x>0;x--)
for(y=144;y>0;y--);
}
void main()
{ P1=0XFE;
delay(200);
while(1)
{ P1=crol(P1,1) #1代表移动了1位
delay(200);
}
}