首页 > 代码库 > 【003】AVR单片机控制发光二极管

【003】AVR单片机控制发光二极管

点亮ARV单片机开发板上的一个LED灯

原理图:


 

分析:上面的截图就是单片机和LED灯的连接原理图,其中J6是一个排阻,起到限流的作用,防止LED电流过大而烧坏。

排阻的内部就是一组并联的电阻:

提示:
算一下这个排阻的电阻的大小,二极管的工作电流是3mA,工作电压时1.7V,VCC的电压时5V。所以电阻上的电流是3mA,电压是3.3V,所以电阻的阻值是1.1KΩ。

因为所有的二极管都是通过一个限流电阻共阳极的,所以只需要在Q端给一个低电平就能点亮这个发光二极管。Q端的电平通过一个573锁存器受控于D端的电平高低,也就是单片机的PB端口。这样我们就能通过写程序控制PB端口的高低电平来实现二极管的亮灭。

这里还用到573锁存器的原理:

锁存器的作用是,当单片机要用这个端口去控制其他的电路时,要修改端口的电平值,这样便会影响原来的电平值。所以要用锁存器来维持这个原来的电平,不会受到端口的新的电平值的影响。

点亮一个发光二极管程序代码:

 1 /******************************************************************************** 2 *功能: 3 *     点亮第一个发光二极管 4 * 5 *头文件: 6 *     原本单片机的I/O口都是一个十六进制的地址,非常不方便记忆,所以用头文件 7 *     封装起来便于记忆。在程序编译的时候,头文件原样粘贴过来,还原回原来的十六 8 *     进制的地址给硬件看。 9 *     <AVRdef.h>是<macros.h>的新版本。10 *11 ********************************************************************************/12 #include <iom16v.h>13 #include <macros.h>14 15 void main(void)16 {17     //设置PA2口为输出高电平,控制锁存器573的锁存端接通18     DDRA  |= BIT(2);19     PORTA |= BIT(2);20     //锁存器的D端口受控于PB口,所以设置PB口的第0位为输出低电平,其他7位输出高电平21     //点亮第一个二极管22     DDRB  = 0xFF;23     PORTB = 0xFE; 24 }

第一个发光二极管闪烁:

 1 /******************************************************************************** 2 *功能: 3 *     第一个发光二极管闪烁 4 * 5 * 6 ********************************************************************************/ 7 #include <iom16v.h> 8 #include <macros.h> 9 10 #define uint unsigned int11 #define uchar unsigned char12  13 void main(void)14 {15     uint c = 0;16     17     //设置PA2口为输出高电平,控制锁存器573的锁存端接通18     DDRA   |= BIT(2);19     PORTA |= BIT(2);20 21     //设置PB端口工作方式为输出22     DDRB    = 0xFF;23 24     while(1)25     {26         //点亮第一个LED27         PORTB   = 0xFE;28 29         //这里就是Delay函数的实现30         c = 5000;31         while(c--);32         c = 5000;33         while(c--);34         35         //熄灭第一个LED36         PORTB   = 0xFF;37 38         //这里就是Delay函数的实现39         c = 5000;40         while(c--);41         c = 5000;42         while(c--);43     }44 }

 其中的c--可以用一个delay()函数实现:

1 void delay(void)2 {3     uint x,y;4     for (x = 0; x < 500; x++ )5     {6         for(y = 0; y < 1000; y++);7     }8 }

 

补充

补录51单片机对二极管的控制电路原理图: 

【003】AVR单片机控制发光二极管