资讯详情

单片机学习 1-LED灯的点亮(全操作)

LED灯

P0、P1、P2、P3结构图

除了P0端口需要外部上拉电阻(否则只能输入输出低电平),其他上拉电阻可以实现高低电平的输入输出


在这里插入图片描述




LED灯介绍

LED灯的本质是发光二极管。单片机输入电流控制在3mA—20mA可串联电阻控制亮度,电阻越大,亮度越弱。I=U/(R r0),即单片机接入电压固定时,电阻R越大,电流I越小,亮度越弱。

LED(Light Emitting Diode),发光二极管是一种能将电能转化为可见光的固态半导体器件,能直接将电转化为光。LED心脏是半导体晶片,一端附着在支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂包装。

半导体晶片由两部分组成,一部分是P型半导体,空穴占主导地位,另一端是N型半导体,主要是电子。但当这两个半导体连接起来时,它们之间形成了一个P-N结。当电流通过导线作用于晶片时,电子将被推向P区,电子将与P区的空穴复合,然后以光子的形式发出能量,即LED照明原理。光的波长,即光的颜色,是由形成的P-N结的材料决定。

照亮第一盏灯

A2-A只能使用开发板P2管脚,A5-A5开发板可以随意连接(P0,P1,P2,P3管脚都可以)

点亮LED灯,如点亮D指示灯D1指示灯连接管脚输出低电平。完成后,可以再次控制D1.指示灯闪烁,即间隔一段时间点亮和熄灭D1指示灯。


方法一 #include "reg52.h" sbit LED1=P2^0;  void main() { 
           LED1=0;   while(1)  { 
           //LED1=0;  } } 
方法二 #include<reg52.h> //头文件 sbit LED0=P2^0;  //命名P2^0为LED0 void main() { 
             P2=0xff;  ///所有灯都熄灭了     while(1)     { 
                 LED0=0;  //LED0点亮     } } 

间隔灯

#include<reg52.h> void main() { 
             while(1)     { 
                 P2=0xaa; //16进制数aa代表1010101010     } } 

m

点亮任意灯

pre>#include<reg52.h> void main() { P2=0x8b; while(1); }

延时灯

#include<reg52.h>
#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<reg52.h>
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<reg52.h>
#include<intrins.h> //包含_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)并行操作:P1=0X## -在LED灯编程中,数字1代表灯关,0代表灯亮,P1代表所有LED灯。 -可以通过2进制数转16进制数来控制灯的开关,前面一般都加上0x,例如:有8个LED灯,都为关闭状态时,可写为2进制数1111 1111,将其转换为16进制数为FF,可写为P1=0XFF

#include <reg52.h>
void main()
{ 
           
    P1=0xF0; #代表前4个灯亮
}

(2)位操作:sbit LED1=P1^0 #其中0的意思是LED灯的第一个灯,以此类推1代表第二个灯。 现在我们让第一个和第二个灯亮

#include <reg52.h> #reg52代表单片机类型型号
 LED1=P1^0;            #定义变量
 LED2=P1^1;
void main()
{ 
           LED1=0;
    LED2=0;
  }                    #0代表让灯亮

#include <reg52.h>
unsigned int i;
while(1) #死循环,一直循环
{ 
         P1=0;
 i=65535;
 while(i--); #延迟
 P1=0XFF;
 i=65535;
 while(i--);
 }

#include <reg52.h>
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 <intrins.h>
#include <reg52.h>
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);
     }
}

标签: 交流电能通过二极管的正极吗82r晶片电阻3aa0电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台