AVR单片机很简单:C语言快速入门及开发实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 I/O口控制LED发光二极管应用实例

2.5.1 LED基本结构

(1)LED芯片结构 发光二极管(Light-Emitting Diode,LED)是一种能发光的半导体电子元件。图2-6所示为彩色LED芯片的结构。芯片两端是金属电极(阳极和阴极),底部是衬底材料,在基片上通过外延工艺生长一定厚度的N型层、发光层和P型层。当芯片工作时,P型半导体和N型半导体中的空穴和电子分别注入发光层并发生复合而产生光。图示中的彩色LED芯片结构是一种经简化的抽象的示意图,实际的LED芯片因制造工艺不同,结构也存在一些差别。

图2-6 彩色LED芯片结构示意图

蓝光和紫外光LED芯片需加配YAG荧光粉或三基色荧光粉才能获得白光,也可将红(R)、绿(G)、蓝(B)三色或更多颜色的LED芯片封装在一起,将它们各自发出的光混合来产生白光。

(2)传统LED封装结构 传统发光二极管(LED)一般是用透明环氧树脂将LED芯片与导线架(Lead Frame)包覆封装,封装后的镜片状外形可将芯片产生的光线集中辐射至预期的方向。由于圆柱形状类似于炮弹,因此称之为“炮弹形LED”。这种LED芯片主要由支架、银胶、晶片、金钱和环氧树脂5种物料所组成,如图2-7所示。

图2-7 传统LED结构

2.5.2 硬件设计

LED灯有两种连线方法:当LED灯的阳极限流电阻与板子上的数字I/O口相连,数字口输出高电平时,LED导通,发光二极管发出亮光;数字口输出低电平时,LED截止,发光二极管熄灭。如图2-8所示。

图2-8 LED灯连线方法1

当LED灯的阴极与板子上的数字I/O口相连时,数字口输出高电平,LED截止,发光二极管熄灭;数字口输出低电平,LED灯导通,发光二极管点亮。如图2-9所示。

图2-9 LED灯连线方法2

由于单片机输出电流有限,阳极接法需要单片机给LED提供电流,可能造成单片机运行不稳定,故通常采用阴极接法。

LED与单片机的连接如图2-10和图2-11所示。通常LED的点亮电流为5~10mA,压降为1.7~1.9V。因此,计算5V电源下使用的限流电阻的大小为500Ω左右。图中使用的限流阻排(RP1)阻值为470Ω。

图2-10 流水灯实例电路原理图1

图2-11 流水灯实例电路原理图2

P9为连接插针,当不使用二极管作流水灯实验时,可断开连接释放引脚资源。

2.5.3 程序设计

观察图2-11可知,对单片机的端口PB0~PB7输出1时,8个LED两端电平相同,没有电流流过,此时LED不亮;当PB0~PB7口输出0时,LED电路构成通路,有足够的电流流过LED,此时LED被点亮发光。图中电阻R的作用是防止太强的电流流入I/O线路。

当有电流通过时(此时LED发光),LED有一个正向电压降,表明阴极的电压低于阳极。不同的LED电压降的幅度有所不同,可以通过查找相应的技术手册来获得用户所使用LED的电压降数值。

本程序将实现延时轮流点亮8个LED。

名称:LED.C。

功能:演示流水灯,从上向下流动,而后从下向上流动,如此循环。

时钟频率:内部1MHz。

编译环境:ICC-AVR6.31。

使用硬件:8个LED、阻排。

结果:8LED流水闪烁。

操作要求:插上P9跳帽。

程序清单如下:

(1)头文件部分

    # include< iom128v.h>     //ATmega128头文件
    # include< delay.h>
    # define LED8  PORTB  //LED发光管与 PB口相连接

程序中包含了特定头文件iom128v.h和delay.h。iom128v.h头文件在ICC程序安装文件夹下的include目录中,iom128v.h和用户选择的芯片相对应,如果选择的是ATmega128,则该文件是iom128v.h,此文件中定义了对应芯片的各个硬件地址:delay.h文件中定义了一些延时子程序。通常每一个程序都要包含这些头文件。

(2)延时程序

    /******************************************
    函数名:Delay_nms
    函数作用:毫秒级的精确延时程序
    *******************************************/
    void delay_nms(unsigned int nms)
    {
    while(nms- - )
    delay_lms();
    }
    void delay_ns(unsigned char ns)
    {
    while(ns- - )
    delay_nms(1000);
    }

(3)主程序

    viod main()
    {
    DDRB= 0xff;                 //设置 PB口为输出
    LED8= 0xff;                   //系统初始化
    while(1)
    {
      LED8= 0x00;
        Delay-nms(500);          //延时 500ms
      LED8= 0xff;
      delay_nms(500);
      }
    }

读者在理解以上程序后,可在原硬件基础上,体会如下几个程序(LED2.C~LED4.C)将要实现的功能与上述例子中实现的功能有何不同。

①名称:LED2.C。

功能:实现8个发光二极管轮流点亮。

时钟频率:7.3728MHz。

编译环境:ICC-AVR6.31。

使用硬件:8个LED。

结果:8LED流水闪烁。

程序清单如下:

    # include < iom128v.h>
    # include“delay.h″
    Unsigned char LED_table[]= {0Xff,0x00,0xFF,0xFE,0xFD, 0xFB, 0xF7, 0xEF, 0xDF,
    0xBF, 0x7F, 0xFF, 0x00, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x00,
    0xFF, 0x7E,0xBD,0xE7,0xFF,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0x00};
    viod main(void)
    {
    unsigned char i= 0;
    PORTB= 0xFF;
    DDRB= 0xFF;
    while(10
    {
    if (i= = 36) i= 0;
    PORTB= LED-table(i+ + );
    delay-nms(80);
    }
  }

②名称:LED3.C。

功能:实现8个发光二极管轮流点亮。

时钟频率:7.3728MHz。

编译环境:ICC-AVR6.31。

使用硬件:8个LED、阻排。

结果:8LED流水闪烁。

程序清单如下:

    # include < iom128v.h>
    # include“delay.h″
    viod main(void)
    {
    unsigned char i;
    PORTB= 0xFF;
    DDRB= 0xFF;
    while(1);
      {
        for (i= 0;i< 0;i+ + )
          {
          PORTB= - (1< < i);
          delay-nms(300);
          }
          PORTB= 0xFE;
        }
    }

③名称:LED4.C。

功能:实现8个发光二极管轮流点亮。

时钟频率:7.3728MHz。

编译环境:ICC-AVR6.31。

使用硬件:8个LED、阻排。

结果:8LED流水闪烁。

程序清单如下:

    # include < iom128v.h>
    # include< stdlib.h>
    # include“delay.h″
    void main(void)
    {
    unsigned char i;
    PORTB= 0xFF;
    DDRB= 0xFF;
    srand(10);       //种下随机数种子
    while(1)
        {
          PORTB= rand();  //随机数产生函数
          Delay= nms(300);
        }
    }

提示:发光二极管是一种电流型器件,虽然在它的两端直接接上3V的电压后能够发光,但容易损坏,在实际使用中一定要串接限流电阻,工作电流根据型号不同一般为1~30mA,另外,由于发光二极管的导通电压一般为1.7V以上,所以,一节1.5V的电池不能点亮发光二极管。同样,一般万用表的R×1挡到R×1kΩ挡均不能测试发光二极管,而R×1kΩ挡由于使用9V的电池,能把有的发光管点亮。