当前位置:文档之家› AVR学习笔记

AVR学习笔记

A VR学习笔记(基于LT_Mini_M16)一、点亮发光二极管一、实验内容和目的本实验通过硬件电路和软件程序,利用A TMega16单片机来控制发光二极管的点亮和熄灭。

通过此实验初步掌握单片机的I/O口功能。

二、硬件电路1、电路分析(对照LT_Mini_M16原理图)1)电源电路:外接稳压直流电源(最好是DC9V)加到电路的U1处,经过电容C16稳压滤波后加到稳压模块AMS1117-5.0上,然后连接到电源开关按钮S1,从开关按钮出来后经过发光二极管D9和电阻R7,再经过电容C1、C2、C3、C4、C5、C7稳压滤波后加到单片机以及各个模块的电源端。

分析:a) 电容的作用是稳压滤波,其中C1、C2、C3、C4、C5这5电容为0.1PF (俗称104电容,一般为瓷片电容)。

主要作用为滤出电源电路中的高频成分;而C16、C7是电解电容,主要作用是稳压,即把电源电路中的尖峰电压拉低到正常电压水平;C16是稳定外接直流电源的电压(9V),C7是稳定AMS1117-5.0输出的5V电压。

b)稳压芯片采用ASM1117-5.0,该稳压芯片输入电压范围为6.5V-15V,输出电压稳定在5.0+0.1V,最大输出电流可达1A,可以满足一般电路需要。

c) 电源开关按钮S1的作用当然是接通和断开电源了。

在此电路中S1采用的是单刀双掷开关,一旦断开电源,则电源的正负极都断开了。

d)发光二极管D9的作用是指示电源是否连接成功,如果外部电源成功的连接上,则发光二极管发光指示电源连接成功;电阻R7的作用是对发光二极管进行限流,一般发光二极管只能通过10mA左右的电流,且发光二极管上面的压降只需要1.5V左右,加到发光二极管上面的电流如果超出额定值,则会烧毁。

而系统工作的电压是5V,如果全部加在发光二极管上,则发光二极管很容易就会被烧毁。

所以要在电源和发光二极管之间串接一个限流电阻。

该限流电阻阻值的计算:(VCC-发光二极管上的电压)/流过发光二极管的电流。

一般发光二极管的压降是1.5V左右,电流为10mA左右,则可计算如下:限流电阻的阻值=(5.0-1.5)/0.01=350欧姆,一般这个阻值可以取得稍微大一些。

2)复位电路:单片机的第9脚(RESET,复位管脚)经过按钮K5连接到地。

分析:a)A VR单片机是低电平复位(51单片机是高电平复位,刚好相反)。

需要单片机复位时,最少要在复位管脚加上1.5微秒的低电平,才能确保单片机正确复位。

b)按下按钮K5,复位管脚被直接拉到电源地,这样复位管脚的电平就被拉低,从而使单片机复位;一般情况下按钮按下的时间超过毫秒级别,这样就能确保单片机正确复位。

3)ISP电路(程序下载电路):ISP下载接口不需要任何的外围零件。

使用双排2*5排针。

分析:a)由于没有外围零件,故PB5(MOSI)、PB6(MISO)、PB7(SCK)、复位脚仍可以正常使用,不受ISP的干扰。

b)ISP下载接口的1、3、5、7、9脚分别接单片机的PB5(MOSI)、PB6(MISO)、PB7(SCK)、复位脚;2接VCC,4、6、8、10都接在GND上。

4)晶振电路:晶体的两脚分别接单片机的12、13脚(晶体的管脚没有正负和顺序,可以随意连接),电容C11、C12分别于晶体的两脚和地连接。

分析:a)单片机的正常工作离不开稳定的时钟信号。

晶体就是提供稳定时钟信号的器件。

b)A VR单片机内部集成有RC振荡器,可以为系统提供用以精度要求不高的时钟信号,这是可以不接外部晶体,利用熔丝配置,设置单片机工作与内部RC振荡器模式。

这个时候可以不用连接警惕和C11、C12两个电容。

c)电容C11、C12的作用是让晶体工作的更稳定。

5)发光二极管驱动电路:单片机的PB0-PB7口分别连接到排阻的八个电阻脚,排阻的公共脚接地。

分析:a)单片机的PB0-PB7口中的任一个输出高电平(5V),则5V电压通过这个口输出到发光二极管的正极,然后通过电阻连接到地,从而构成一个放电电路。

发光二极管正极加上超过1.5V的电压后,就能够点亮发光。

b)排阻的作用同样是为八个发光二极管分压限流。

2、A VR单片机的I/O端口1)学习单片机的主要任务就是了解、掌握单片机I/O端口的功能,以及如何正确设计这些端口与外围电路的连接,从而能够组成一个嵌入式系统,并编程、管理和运用他们完成各种各样的任务。

2)A Tmega16有4个8位的双向I/O端口PA、PB、PC、PD,他们对外对应32个I/O 引脚,每一位都可以独立地用于逻辑信号的输入和输出。

在5V工作电压下,输出高点平时,每个引脚可输出达20mA的驱动电流;而输出低电平时,每个引脚可吸收最大为40mA的电流,可以直接驱动发光二极管(一般的发光二极管的驱动电流为10mA)和小型继电器等小功率器件。

A VR大部分的I/O端口都具备双重功能(有的还有第三功能)。

其中第一功能是作为数字通用I/O接口使用,而复用的功能可分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的I/O口,如定时器、计数器、串行接口、模拟比较器、捕捉器、USART、SPI等。

3)A VR单片机的每组I/O口都配备有三个8为寄存器,分别是:方向控制寄存器DDRx、数据寄存器PORTx、输入引脚寄存器PINx(x=A/B/C/D).I/O口的工作方式和表现特征由这三个I/O寄存器控制。

方向控制寄存器DDRx用于控制I/O口的输入输出方向,及控制I/O口的工作方式为输出方式还是输入方式。

DDRx=1时,I/O口处于输出工作方式;此时数据寄存器PORTx中的数据输出到外部引脚。

DDRx=0时,I/O口处于输入工作方式;此时输入引脚寄存器PINx中的数据就是外部引脚的实际电平,通过读I/O指令可将物理引脚的真实数据读入MCU。

此外,当I/O口定义为输入时(DDRx=0),通过PORTx的控制,可使用或不使用内部的上拉电阻。

(关于上拉电阻的解释请看后面附录2)4)A VR 通用I/O端口的主要特点为:a)双向可独立位控的I/O口A Tmega16的PA、PB、PC、PD 四个端口都是8 位双向I/O 口,每一位引脚都可以单独的进行定义,相互不受影响。

如用户可以在定义PA口第0、2、3、4、5、6 位用于输入的同时定义第1、7位用于输出,互不影响。

b)Push-Pull 大电流驱动(最大40mA)每个I/O 口输出方式均采用推挽(关于推挽电路,请参阅附录3)式缓冲器输出,提供大电流的驱动,可以输出(吸入)20mA的电流,因而能直接驱动LED显示器。

c)可控制的引脚内部上拉电阻每一位引脚内部都有独立的,可通过编程设置的,设定为上拉有效或无效的内部上拉电阻。

当I/O口被用于输入状态,且内部上拉电阻被激活(有效)时,如果外部引脚被拉低,则构成电流源输出电流(uA量级)。

d)DDRx 可控的方向寄存器。

A VR 的I/O 端口结构同其它类型单片机的明显区别是,A VR 采用 3 个寄存器来控制I/O端口。

一般单片机的I/O 仅有数据寄存器和控制寄存器,而A VR 还多了一个方向控制器,用于控制I/O 的输入输出方向。

由于输入寄存器PINx 实际不是一个寄存器,而是一个可选通的三态缓冲器,外部引脚通过该三态缓冲器与MCU 的内部总线连接,因此,读PINx 时是读取外部引脚上的真实和实际逻辑值,实现了外部信号的同步输入。

3、电路工作过程:本实验的整个电路工作过程是:1)将外接稳压电源连接到电路板的电源插孔P1处,按下电源开关按钮S1,将电源加到单片机上。

2)将下载器的ISP插口插到电路板的ISP插座处。

下载软件到单片机内。

3)软件下载成功后,电路板上所要点亮的那个发光二极管就会点亮。

4)按下复位按钮,电路板上点亮的那个发光二极管就会熄灭,当复位按钮松开后,发光二极管再次点亮。

三、软件编写1、使用WinA VR(GCC)开发环境。

2、文件包含:用C语言编写A VR单片机程序时,一般都要在程序的开头加上文件包含预编译指令。

文件包含是将一些已经定义好的寄存器、变量、函数等添加到所要编写的程序中,那么所要编写的程序中就可以直接使用这些定义好的寄存器、变量、函数等就可以在程序中直接使用,省去了重复定义大量经常使用的寄存器、变量、函数等的麻烦。

3、makefile文件:一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell 脚本一样,其中也可以执行操作系统的命令。

A VR单片机中的makefile文件可以使用WINA VR中的mfile工具生成。

makefile文件中需要注意并修改的几点是:[单片机类型]、[目标文件名]、[C源文件名]、[系统时钟频率]。

4、A VR单片机中的端口配置寄存器:A VR单片机的I/O口是标准的三态口(高电平、低电平、高阻态这三种状态)。

1)使用A VR 的I/O 口,首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。

2)当I/O 工作在输入方式,要读取外部引脚上的电平时,应读取PINxn 的值,而不是PORTxn 的值。

3)当I/O 工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。

4)一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn 的值。

5、程序的编写:Programmers Notepad [WinA VR],新建一个空白文档,开始编写程序。

1)首先要在程序中加入A Tmega16的I/O寄存器配置头文件:#include <avr/io.h>,加上这个文件后,程序就可以直接使用各个寄存器的名称进行相应设置。

2)然后编写主函数程序,GCC中规定main函数必须是有整形返回值的函数,定义为int main(void){此处加入具体代码return 0;(这句话可以不要)}在这个例子中是用PORTA口控制发光二极管的亮灭,所以在主函数里,首先设置PORTA口相应位为输出方式,然后使端口输出低电平,先使发光二极管不亮。

我们可以直接使用C的语句对I/O 口寄存器进行操作,如:// 定义PortA口的工作方式PORTA = 0x00; // PA口的第0位输出“1”,LED不亮DDRA = 0x01; // 定义PA口的第0位为输出方式PORTA|= ~(1 << PA0); // PA口第0位输出取反其中PA0 是GCC 中对C的扩展语句,它实现了对寄存器的位操作。

这种语句在标准C 中是没有的,该扩展更加适合编写单片机的系统程序,因为在单片机的系统程序中,是经常需要直接对位进行操作的。

相关主题