打印
[AVR单片机]

动手学AVR单片机七、流水灯实验的电路和程序实现

[复制链接]
4095|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangwo|  楼主 | 2009-12-19 21:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
动手学AVR单片机七、流水灯实验详解-----基于ATmega64
       前一讲的学习中,我们主要了解了如何使用GCC编写、编译AVR单片机的C语言程序,最后通过一个流水灯的实例进行了实战演练。
       但是对于AVR单片机的初学者来说,这个流水灯的程序具体是怎么工作的还不大清楚,今天我们就从流水灯的电路实现开始,讲解一下这个程序的原理,同时也对AVR单片机的C语言编程做一个入门描述。
一、电路实现
      在前面我们已经了解了AVR单片机的最小系统,我们以后所做的所有试验都是基于这个最小系统来实现的,所不同的是每个不同的实验都在最小系统的基础上增加了基于本实例的实现电路,下图是流水灯的电路

       1、发光二极管简称为LED,发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,发光二极管导通,同时发光,加上反向电压后发光二极管截止,熄灭。常用的是发红光、绿光或黄光的二极管。
       2、图中8个LED(D3-D10)分别连接到单片机PB端口的8个位上(AVR单片机的端口都是8位的端口,每一位都对应一个具体的I/O输入输出端口,限于单片机设计的限制,有些端口可能占不满8位)。
      3、RP2是一个排阻,所谓排阻就是若干个参数(最重要的参数就是阻值了)完全相同的电阻,它们的一个引脚都连到一起,作为公共引脚。其余引脚正常引出。所以如果一个排阻是由n个电阻构成的,那么它就有n+1只引脚,一般来说,最左边的那个是公共引脚。它在排阻上一般用一个色点标出来。排阻一般应用在数字电路上,比如:作为某个并行口的上拉或者下拉电阻用。使用排阻比用若干只固定电阻更方便.。在本实验中我们使用的是有8个电阻的排阻,所以它有9个引脚,这个排阻在电路中的作用是限制流过发光二极管的电流。
       4、发光二极管的反向击穿电压约5伏。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流(这也就是图中为什么加了一个排阻的原因)。限流电阻R可用下式计算:

  R=(E-U)/I

  式中E为电源电压,U为LED的正向压降,I为LED的一般工作电流。根据这个公式我们就可以计算出在本电路中的限流电阻的阻值大小:电路板的工作电压是5V,也即电源电压E=5V,发光二极管的压降一般为0.7V左右,电流为10mA左右,即U=1.7,I=10,则R=(5-0.7)/0.001=430欧姆。实际使用时我们一般取大于430欧姆的电阻。发光二极管的两根引线中较长的一根为正极,应按电源正极。有的发光二极管的两根引线一样长,但管壳上有一凸起的小舌,靠近小舌的引线是正极。

  发光二极管的特点是:工作电压很低(有的仅一点几伏);工作电流很小(有的仅零点几毫安即可发光,一般发光二极管的工作电流是10mA左右)。
      5、整个电路的原理:5V电源电压经过470欧姆的9脚排阻(实际是8个电阻)分别连接8个发光二极管的正极,8个发光二极管的负极分别连接单片机PB口的8位。这样当单片机的I/O口输出高电平时,发光二极管两端都是高电平,发光二极管不会导通,当I/O口输出低电平时,发光二极管正向导通,同时也就发出光亮了。

相关帖子

沙发
wangwo|  楼主 | 2009-12-19 21:41 | 只看该作者
二、程序实现
具体程序如下:为便于分析,我们给每行程序都加上编号
#include <avr/io.h>        //io端口寄存器配置文件,必须包含                                          1
#include <util/delay.h>       //GCC中的延时函数头文件                                                    2   

int main(void)            //GCC中main文件必须为返回整形值的函数,没有参数                  3
{
PORTB = 0Xff;         //PORTB输出高电平,使LED熄灭                                                 4
DDRB = 0XFF;           //配置端口PB全部为输出口                                                         5

while(1)                                                                                                                        6
{
  unsigned char Flow_LED,Delay500ms;     //定义流水灯循环次数以及延时时间变量         7      
  for(Flow_LED = 0;Flow_LED <= 7;Flow_LED++)  //流水灯从0-7总共循环8次                 8
  {   
   PORTB = 0xff & (~(1 << Flow_LED));         //每次循环中点亮一个LED                         9
   
   for(Delay500ms = 0;Delay500ms < 20;Delay500ms++)    //延时500ms                             10
   {
    _delay_ms(100);         //delay.h中的延时1ms函数                                                          11
   }
  }
  
}
}
程序讲解:按每行序号进行讲解

1、调用GCC编译器中的寄存器配置头文件io.h,这个头文件根据我们在makefile文件中设置的单片机型号自动调用相应芯片的I/O配置文件,这个文件主要包含了单片机中端口寄存器以及其他所有模块寄存器的地址配置。这样我们就可以在程序中直接使用PORTB这样的标识符了;
2、调用GCC编译器中的延时函数相关头文件,我们在程序中调用的延时函数就包括在这个头文件中;
3、主函数,每个AVR单片机系统程序都要有一个主函数main。并且GCC中规定主函数必须定义为如下形式:int main(void)   ;
4、端口输入输出控制,AVR单片机的I/O口可以作为普通的I/O口使用,同时他们还有第二甚至第三功能,在今天的实例中,我们只是把他们当做普通的I/O口使用,只是控制它来输出高低电平。事实上单片机的I/O口无论被当做什么功能,它的本质还是输出高低电平,或者接受并判断输入电平的高低。
5、AVR单片机的I/O口是标准的I/O口,I/O接口的功能是负责实现CPU通过系统总线把I/O电路和 外围设备联系在一起,标准的I/O口具有输入、输出、高阻三种状态,AVR单片机通过3个寄存器来控制I/O口的状态:输入输出方向寄存器DDRx(x表示端口号,例如DDRA表示端口A的方向寄存器)、输出寄存器PORTx、输入寄存器PINx。
PORTB = 0Xff;        的含义就是将端口B的输出寄存器设置为0xff,即让端口B的8个I/O口全部输出高电平; DDRB = 0XFF;的含义就是设置端口B为输出口。
6、  while(1)
{
  //程序代码  
}

在单片机程序中,首先在main主函数里讲系统中用到的端口,变量等进行初始化,然后让程序进入一个while(1){}死循环中,这样保证程序一直运行,我们知道,程序都是一步一步向下执行的,执行到程序的结尾就会停止,这时即使外界再有什么动作,单片机也不再响应了,加上死循环,那么程序就会一直在这个循环体中运行,如果我们在这个循环体中进行相应操作,程序就会很快检测到并给出响应。
7、C语言程序的局部变量定义
8、for循环,使程序重复执行一段代码
9、改变端口B的输出状态,达到让8个LED轮流点亮的目的
10、延时循环
11、延时一段时间,
语句7-11涉及到用C语言编写AVR单片机程序的知识,我们将在下一节详细讲解,

三、使用编程器将程序烧录到单片机
AVR单片机的程序烧录需要经过两个步骤:熔丝位的配置、程序文件的烧写,这方面的内容我们前面已经做过描述,并且在“AVR单片机开发工具自制”这些讲座里面已经实际演练过了,在此就不再过多描述。
需要特别提醒的一点是:烧写熔丝位的时候一定要注意,有些烧写错误会锁死单片机,一个小小的建议是在不熟悉AVR单片机熔丝位配置的情况下尽量采用能够单独进行位配置的烧录软件(比如SLISP,PROGISP),这样能够避免一些错误,还有一点就是,在我们日常的单片机开发中,我们一般都用单片机的内部时钟或者外部晶振,很少使用外部时钟,所以配置熔丝位的时候一般不要选择外部时钟,如果不下心配置了外部时钟,则需要给单片机的晶振接口1加上一个外部时钟才能将单片机解锁。

使用特权

评论回复
板凳
linhai1986| | 2009-12-20 00:15 | 只看该作者
LZ收藏很丰富啊

使用特权

评论回复
地板
xiaoxin1986| | 2009-12-20 01:04 | 只看该作者
谢谢LZ 分享

使用特权

评论回复
5
wangwo|  楼主 | 2009-12-20 22:33 | 只看该作者
感觉这个教程很不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

806

帖子

2

粉丝