Atmega 128 学习笔记第三站---完成LED灯的闪烁功能

作者: 立行天下1
上传时间为: 2015-04-30 08:46 AM

     不知不觉Atmega 128学习已经到了第三课,今天要实现一个闪烁灯的功能。

     上一个学习笔记我们安装了ICCAVR软件开发环境,并成功设计编译了一个工程文件,但是这个工程文件还是在我们的电脑上,如果不传输给单片机,那单片机就无法运行,我们所做的一切都还是零,所以我们就需要把我们编译好的工程文件传输给单片机ATmega128,具体怎么操作呢?这时我们就需要一个USBASP下载器和下载软件AVR_fighter,通过这两样实现把编译的程序目标文件下载到单片机上面,USBASP下载器支持Atmel MEGA系列和AT89S51/52系列的下载,我们可以在网上买到一个,买到之后就是先安装USB的驱动软件,具体实现的步骤,我这边就再絮叨一下吧:

  1、若我们的电脑上面从来没有安装过USBASP下载器的驱动的话,我们直接把USB插到电脑上面,电脑会自动弹出一个对话框,如下图:

     我们按照上面这个对话框的提示一步步的安装。

     2、我们需要找到这个下载器驱动放置的路径,点击下一步,这时候电脑就会自动挡的搜索到我们所放置的路径内得驱动文件,并安装:

      3、最后安装完成后会弹出“完成”的对话框,这时表示我们的下载器的软件驱动安装好了。

     安装好了驱动,表示我们的电脑可以识别我们的下载器,下面就是使用下载软件AVR_fighter,双击下载软件AVR_fighter:

 接着会弹出AVR_fighter的软件界面:

     在下载程序之前,我们需要谨慎的注意一下:熔丝位的设置。因为熔丝位一旦设置错误,单片机可能就会锁住或者死机,这样我们的单片机就无法使用了,所以熔丝位的设置要谨慎,一般我们在买到的开发板或者ATmega128板子时候,出厂设置已经设置好了熔丝位,所以我们可以不做任何改动就可以。若是我们不小心修改了熔丝位的配置,重新上电后,再下载程序时候会提示“进入编程模式失败”等信息框,这时我们就要反思自己是不是搞错了熔丝位的设置,一般遇到这种情况,个人认为可采取以下方法,来挽救我们的单片机:

     1、寄回给芯片服务商,让他们帮忙将芯片恢复,这种方法最保险,最简单,但是确实很费时间,所以一般我们再自己修复不了的情况下也不失为一个选择。

     2、将工作正常的单片机的XTAL2脚连接熔丝设置错误的单片机的XTAL1引脚,重新上电后,用ISP下载线连接好了,重新修改熔丝位,修改完成后,再断电。

     3、还有一个方法就是使用编程器将芯片恢复到出厂状态,不过这个方法我没有试过,大家若有兴趣可以试试。

      回到我们下载程序的过程中:

      点击软件界面中的“装Flash”,会弹出对话框,我们只要输入我们第二站中编译好的HEX后缀的代码文件就可以了,然后再点击”编程“按钮,我们的程序代码就顺利的下载到了单片机中。


有的学友在下载过程中可能会出现各种各样的问题,像我第一次下载也是如此,都没有下载成功,我们可以多试几次,若多试几次之后还是不行的话,就可以从下面结果方面考虑下:


     1、下载器的驱动是否安装正常?

     2、我们的下载器连接线跟板子是否连接正常?

     3、上面我们提到的熔丝位是否设置的正确?

     4、板子外部时钟接晶振了吗?

     我能想到暂时的就这些了,其实后面会越来越会发现,即使我们认为准确无误的程序,下载到板子上面总会有各种各样的问题出现,我们就需要静下心来去寻找出原因,寻找原因的过程会帮助我们更加迅速的理解单片机的IO口的原理,使我们更快的学好单片机,所以当遇到问题时候,千万不要放弃。。。。


     好了,万事俱备,只欠东风。。。。我们来实现LED灯闪烁的功能吧:

     我们用ATmega128单片机的PA0口来驱动一个LED灯,我们知道发光二极管具有单向导电性,并且导通电压为1.7V~1.9V,只要在发光二极管的正向一段加上的电压超过了他的导通电压,流过他的电流超过2~3mA,发光二极管就可以发光,同时我们要考虑通过发光二极管的电流不能太大,太大就会把发光二极管烧掉,所以一般我们会在电源与发光二极管之间加一个1~10K左右的电阻,用来限制电流。电路大致如下:

     我们先大致来构思下我们的程序的思路:

    首先确定下PA0的方向,是输入还是输出,在这里我们应该设定PA0口为输出。

     确定了方向为输出,我们知道了发光二极管的原理,当我们给PA0口为一个低电平时,发光二级管的回路就会导通,这时发光二级管灯点亮,相反,当PA0口输出高电平时,发光二极管回路不导通,发光二极管不点亮。。。。

     有了以上的思路,我们开始编程:


#include<iom128v.h>

// 主程序

void main()
{

unsigned int i;
DDRA=0xFF;
PORTA=0xFF;

for(;;)
{
for(i=0;i<40000;i++);
for(i=0;i<40000;i++);
PORTA=0x00;
for(i=0;i<40000;i++);
for(i=0;i<40000;i++);
PORTA=0xFF;

}

}

     写到这里我突然想到我应该跟大家说下DDRA 和PORTA 的含义,因为在我学习的时候,也曾经疑惑过,下面给大家叙述下:DDRX寄存器就是AVR单片机的端口方向寄存器,我们可以通过设置DDRX来设置X端口的状态是为输出还是为输入,当DDRX=0xFF时,表示我已经设置X端口为输出状态,当时DDRX=0x00时候,表示我们设置X端口为输入状态。PORTX寄存器是AVR寄存器的输出寄存器,端口的输出状态设定好了之后,通过设置PORTX可以设置端口X的相应位的输入高电平或者低电平来控制外部设备。例如我们设置PORTX=0xFF,表示X端口的所有口位都输出高电平,若我们设置PORTX=0x0F,则表示X端口的高4位输出低电平,高4位输出高电平。

理解了上面的解释,我们上面最初编写的让发光二极管闪烁的程序大家就应该懂了吧?

PS:不论学任何单片机,使用任何单片机,我们都免不了要进行编程,所以如果不会汇编语言,也要会C语言,这个是我们学习任何单片机的基础,各位学友私底下也要在这方面下工夫啊。。。。。

接着就是在ICCAVR软件开发环境中进行编译,直到编译无误后生成HEX后缀的文件,我们再下载到我们的单片机板子上面,这时我们可以看到跟PA0口连接的LED灯会一亮一灭的闪烁。。。。。

截止到目前为止,我们的一个简单的让发光二极管闪烁的功能已经大功告成,当然了,我们可以多放几个发光二极管,分别连接到单片机的PA口或者其他端口上,可以实现流水灯的效果,我们可以发现,在控制发光二级管闪烁的时间上面,我们使用的是for循环,这种方法也可以实现对时间的一个大致估量,若大家想精确的实现闪烁的时间间隔,大家可以对单片机连接一个外部晶振,这样就可以精确的控制闪烁的时间,这个大家可以根据上面的程序思考下,如何实现。

好啦。。。是不是对ATmega128的端口有了一个基本的了解啦,通过这些端口,我们不仅仅可以控制发光二极管,还可以控制任何我们想控制的外部设备,当然了,有时可能需要我们增加一些电平转换的电路或者芯片,这时候,大家再回头去看看数据手册中对ATmega128的端口的一个详细介绍,会有更加清晰的理解。。。。。。

学友们,下期再见。

全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示