首页 > 代码库 > AVR第3课:点亮发光二极管

AVR第3课:点亮发光二极管

 和51单片机不同,51单片机的驱动能力比较弱,而AVR单片机的驱动能力比较强,可以直接驱动继电器和发光二极管,所以不需要外接上拉电阻。51单片机的引脚电流只有几十微安,而AVR单片机有40mA左右。电路图如下所示。



代码1:先让所有灯灭,延时一会儿,再让所有灯亮,再延时,这样一直循环。

<span style="font-size:18px;">#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int
//定义延时函数
void delay(uint ms)
{
    uint i,j;
	for(i=0;i<ms;i++)
	   	for(j=0;j<10;j++);
}

void main()
{
  
   while(1)
   {
        DDRA = 0xff;<span style="white-space:pre">	</span>//设置PA口为输出模式
   <span style="white-space:pre">	</span>PORTA = 0x00;<span style="white-space:pre">	</span>//设置PA口输出低电平
	delay(2000);
   	PORTA = 0xff;<span style="white-space:pre">	</span>//设置PA口输出为高电平
        delay(2000);
   }
}</span>
值得注意的是AVR单片机的IO口作为通用数字IO口的时候,每个引脚都具有3个寄存器,DDRxn、PORTxn和PINxn。DDRxn用来设置IO口的输入输出模式,1表示输出,0表示输入,默认状态为高阻态,这里和51单片机是不一样的,因为51单片机就只有两种电平,高电平和低电平,而AVR单片机有3种电平,除了高低电平之外还有高阻态;PORTxn表示是否设置带上拉电阻,也可以理解为输出高电平还是低电平;PINxn只能读不能写,用来读取IO口的高低电平。

代码2:让PA口的最低位的灯闪烁,其他的灯保持不变,是什么状态就是什么状态,不管他,代码如下。

<span style="font-size:18px;">#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int

void delay(uint ms)
{
    uint i,j;
	for(i=0;i<ms;i++)
	   	for(j=0;j<10;j++);
}

void main()
{
  
   while(1)
   {
        DDRA = DDRA | BIT(0);//设置PA口的最低位为输出模式
   	PORTA = PORTA & (~BIT(0));//让PA口的最低位输出低电平
	delay(2000);
   	PORTA = ~(PORTA & (~BIT(0)));//让PA口的最低位输出为高电平
        delay(2000);
   }
}</span>
这里又有一个新的知识点要注意,就是AVR单片机的常用位操作。BIT(x)表示将二进制1(0000  0001)左移x位,例如BIT(0) = 0000 0001、BIT(2) = 0000 0100、BIT(7) = 1000 0000,所以x为几,那么1后面就有x个0,这样便于记忆。同时~表示按位取反,例如:~BIT(2) = 1111 1011。DDRA = DDRA | BIT(0)表示高7位保持不变,保持之前的状态,有可能是低电平,也有可能是高电平,还有可能是高阻态,最低位设为高电平,表示输出。请读者好好剩下的几句话。

另外还有的朋友可能遇到这种情况,那就是你将程序烧写之后,没有反应,如果你用的是51转AVR板的话,有可能是复位的问题,这个时候你只要长按开发板上的复位键不动,就会发现正常了,为什么会这样呢?由于初学者很难发现这个问题,在这里我就多说几句,全是luluc我自己的想法,如果有不对的地方,请指出交流。因为51单片机复位需要保持24个时钟周期的高电平才能复位,而AVR单片机需要一段时间低电平才能复位,估计是转接板没有做好的缘故。

好吧,今天就到这里吧,希望初学者好好消化上面的知识,也希望上面的两个例子对你有用。由于不可能将知识点写的足够详细,所以功夫全部在课下。一起交流一起进步。由于之前51单片机的课程写的不太好,我尽量在AVR课程里面能够有所提高,有个好的开始,也希望有个好的结尾。明天我们将讲解“流水灯”课程,这一节课程的知识点有点多,也需要不断练习并且熟悉,请大家好好复习这一课,明天我们继续!

AVR第3课:点亮发光二极管