对单片机的端口PB0~PB7口输出1时,8个LED两端电平相同,没有电流流过,此时LED不亮;当PB0~PB7口输出0时,LED电路构成通路,有足够的电流流过LED,此时LED被点亮发光。图中电阻R的作用是防止太强的电流流入I/O线路。
当有电流通过时(此时LED发光),LED有一个正向电压降,表明阴极的电压要低于阳极的。不同的LED电压降的幅度有所不同,可以通过查找相应的技术手册来获得用户所使用的LED电压降的数值。
假定处理器的工作电压为5V(为了本例计算方便)的电源VCC,LED的正向电压降为1.7~1.8V。现在,要将LED阴极输入电压置为0V,我们可以这样计算:如果LED的电压降为1.7V,那么电阻上的电压降应该是3.3V(由5V-1.7V=3.3V可得)。
从技术手册可知,如果处理器的工作电压为5V,则AVR的数字引脚上的吸入电流可达40mA。显然,我们必须限制电流的流量,引入电阻就是出于这个目的。如果电阻的电压降为3.3V(上面已计算过),流入的电流为10mA,那么由欧姆定律可知,我们所需的电阻的大小为:
R=V/I=3.3V/10mA=330Ω
我们就选择与这个值最接近的可用电阻,即330Ω。因此在设计硬件电路时,要在LED二极管电路中串接一个限流电阻,阻值在330~1000Ω之间,调节阻值的大小可以控制发光二极管的发光亮度。
另一个问题是:电阻会消耗掉多少电能?换句话说,当电压降为3.3V时,电阻会消耗掉多少能量?这个问题很关键:如果通过电阻的电流过大,那么电阻就有可能被烧坏。所以,在选择电阻时要选择一个额定功率大于所需值的电阻。功率可由电压和电流的乘积计算出:
P=V×I=3.3V×10mA=0.033W=33mW
这个值是微不足道的,所以我们可以选择电阻值为330Ω、功率为1/20W的电阻(因为1/20W是目前常用电阻中额定功率的最小值)。
下面我们要看到的是如何使用AVR的数字输出端去控制LED。这种方法对于那些工作电流低于20mA的设备同样有效。事实上,小功率的元件(如传感器),都可以使用AVR的输出端来对电源进行直接控制,就像我们直接控制LED的电源那样。在那些使用电池组供电的应用中,这也是一个很有用的技术,因为它可以降低系统的总功耗。
本程序中采用延时轮流点亮8个LED。
●名称:LED1.C。
●功能:演示流水灯从上向下流动,而后从下向上流动,如此循环。
●时钟频率:内部1MHz。
●编译环境:ICC-AVR6.31。
●使用硬件:8个LED、阻排。
●结果:8个LED流水闪烁。
●操作要求:插上P9跳帽。
程序说明如下(详细程序请参考光盘内容):(www.xing528.com)
1.头文件部分
程序中包含了特定头文件iom16v.h和macros.h,这两个头文件都在ICC程序安装文件夹下的一个include目录中,iom16v.h和用户选择的芯片相对应,如果选择的是ATmega16,那么这个文件就是iom16v.h,等等,在这样的文件中定义了对应芯片的各个硬件地址。macros.h文件中定义了一些宏命令和一些老版的语言写法。通常每一个程序都要包含这个头文件。关于iom16v.h和macros.h读者可以在安装目录下的include文件夹里找到。
2.延时程序
3.LED点亮程序
4.主程序
读者在理解以上程序后,可在原硬件基础上,体会下面这个程序将要实现的功能与上边的例子中实现的功能有何不同。
●名称:LED2.C。
●功能:实现8个发光二极管轮流点亮。
●时钟频率:内部1MHz。
●编译环境:ICC-AVR6.31。
●实验环境:AVR-51开发板。
●使用硬件:8个LED、阻排。
●结果:8个LED流水闪烁。
●操作要求:插上P9跳帽。
程序说明如下(详细程序请参考光盘内容):
注意发光二极管是一种电流型器件,虽然在它的两端直接接上3V的电压后能够发光,但容易损坏,在实际使用中一定要串接限流电阻,工作电流根据型号不同一般为1~30mA。另外,由于发光二极管的导通电压一般为1.7V以上,所以一节1.5V的电池不能点亮发光二极管。同样,一般万用表的R×1档到R×1K档均不能测试发光二极管,而R×10K档由于使用9V的电池,能把有的发光管点亮。
使用发光二极管的时候,应该正确区分发光二极管的阳极和阴极。对于双脚直插型发光二极管,其针脚相对较长的一端为阳极,另一端为阴极。对于贴片性发光的二极管,有条纹标记的一端通常为阴极。
另外,语句BIT(0)等价于00000001,也就是将1左移0位,BIT(x)等价于将1左移x位。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。