AVRATmega16实验教程.docx
- 文档编号:7577328
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:20
- 大小:204.62KB
AVRATmega16实验教程.docx
《AVRATmega16实验教程.docx》由会员分享,可在线阅读,更多相关《AVRATmega16实验教程.docx(20页珍藏版)》请在冰豆网上搜索。
AVRATmega16实验教程
AVR学习笔记(基于LT_Mini_M16)
一、点亮发光二极管
一、实验内容和目的
本实验通过硬件电路和软件程序,利用ATMega16单片机来控制发光二极管的点亮和熄灭。
通过此实验初步掌握单片机的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)AVR单片机是低电平复位(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)AVR单片机内部集成有RC振荡器,可以为系统提供用以精度要求不高的时钟信号,这是可以不接外部晶体,利用熔丝配置,设置单片机工作与内部RC振荡器模式。
这个时候可以不用连接警惕和C11、C12两个电容。
c)电容C11、C12的作用是让晶体工作的更稳定。
5)发光二极管驱动电路:
单片机的PB0-PB7口分别连接到排阻的八个电阻脚,排阻的公共脚接地。
分析:
a)单片机的PB0-PB7口中的任一个输出高电平(5V),则5V电压通过这个口输出到发光二极管的正极,然后通过电阻连接到地,从而构成一个放电电路。
发光二极管正极加上超过1.5V的电压后,就能够点亮发光。
b)排阻的作用同样是为八个发光二极管分压限流。
2、AVR单片机的I/O端口
1)学习单片机的主要任务就是了解、掌握单片机I/O端口的功能,以及如何正确设计这些端口与外围电路的连接,从而能够组成一个嵌入式系统,并编程、管理和运用他们完成各种各样的任务。
2)ATmega16有4个8位的双向I/O端口PA、PB、PC、PD,他们对外对应32个I/O引脚,每一位都可以独立地用于逻辑信号的输入和输出。
在5V工作电压下,输出高点平时,每个引脚可输出达20mA的驱动电流;而输出低电平时,每个引脚可吸收最大为40mA的电流,可以直接驱动发光二极管(一般的发光二极管的驱动电流为10mA)和小型继电器等小功率器件。
AVR大部分的I/O端口都具备双重功能(有的还有第三功能)。
其中第一功能是作为数字通用I/O接口使用,而复用的功能可分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的I/O口,如定时器、计数器、串行接口、模拟比较器、捕捉器、USART、SPI等。
3)AVR单片机的每组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)AVR通用I/O端口的主要特点为:
a)双向可独立位控的I/O口
ATmega16的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可控的方向寄存器。
AVR的I/O端口结构同其它类型单片机的明显区别是,AVR采用3个寄存器来控制I/O端口。
一般单片机的I/O仅有数据寄存器和控制寄存器,而AVR还多了一个方向控制器,用于控制I/O的输入输出方向。
由于输入寄存器PINx实际不是一个寄存器,而是一个可选通的三态缓冲器,外部引脚通过该三态缓冲器与MCU的内部总线连接,因此,读PINx时是读取外部引脚上的真实和实际逻辑值,实现了外部信号的同步输入。
3、电路工作过程:
本实验的整个电路工作过程是:
1)将外接稳压电源连接到电路板的电源插孔P1处,按下电源开关按钮S1,将电源加到单片机上。
2)将下载器的ISP插口插到电路板的ISP插座处。
下载软件到单片机内。
3)软件下载成功后,电路板上所要点亮的那个发光二极管就会点亮。
4)按下复位按钮,电路板上点亮的那个发光二极管就会熄灭,当复位按钮松开后,发光二极管再次点亮。
三、软件编写
1、使用WinAVR(GCC)开发环境。
2、文件包含:
用C语言编写AVR单片机程序时,一般都要在程序的开头加上文件包含预编译指令。
文件包含是将一些已经定义好的寄存器、变量、函数等添加到所要编写的程序中,那么所要编写的程序中就可以直接使用这些定义好的寄存器、变量、函数等就可以在程序中直接使用,省去了重复定义大量经常使用的寄存器、变量、函数等的麻烦。
3、makefile文件:
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
AVR单片机中的makefile文件可以使用WINAVR中的mfile工具生成。
makefile文件中需要注意并修改的几点是:
[单片机类型]、[目标文件名]、[C源文件名]、[系统时钟频率]。
4、AVR单片机中的端口配置寄存器:
AVR单片机的I/O口是标准的三态口(高电平、低电平、高阻态这三种状态)。
1)使用AVR的I/O口,首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。
2)当I/O工作在输入方式,要读取外部引脚上的电平时,应读取PINxn的值,而不是PORTxn的值。
3)当I/O工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。
4)一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn的值。
5、程序的编写:
ProgrammersNotepad[WinAVR],新建一个空白文档,开始编写程序。
1)首先要在程序中加入ATmega16的I/O寄存器配置头文件:
#include
2)然后编写主函数程序,GCC中规定main函数必须是有整形返回值的函数,定义为
intmain(void)
{
此处加入具体代码
return0;(这句话可以不要)
}
在这个例子中是用PORTA口控制发光二极管的亮灭,所以在主函数里,首先设置PORTA口相应位为输出方式,然后使端口输出低电平,先使发光二极管不亮。
我们可以直接使用C的语句对I/O口寄存器进行操作,如:
//定义PortA口的工作方式
PORTA=0x00;//PA口的第0位输出“1”,LED不亮
DDRA=0x01;//定义PA口的第0位为输出方式
PORTA|=~(1< 其中PA0是GCC中对C的扩展语句,它实现了对寄存器的位操作。 这种语句在标准C中是没有的,该扩展更加适合编写单片机的系统程序,因为在单片机的系统程序中,是经常需要直接对位进行操作的。 更加标准的C程序可以采用以下的写法: PORTA=1<<(PA0)|1<<(PA3);//PA口的第0位和第3位输出“1”,其它为“0” 这里,1<<(PA0)表示逻辑1左移0位,结果为0b00000001;而1<<(PA3)表示逻辑1左移3位,结果为0b00001000。 0b00000001在同0b00001000相或,结果为0b00001001。 以上的逻辑运算不产生具体的操作指令,是由GCC在编译时运算完成,得到结果,最后只是产生将结果赋值到PORTA寄存器的操作指令。 这种表示方式,比直接赋值0b00001001更容易理解程序的作用,在以后对外围模块功能的设置中,这种优势更加明显。 3)接着编写主循环while (1){}中的内容;while (1){}的主要作用是使程序一直在这里循环执行。 因为单片机执行程序是一条一条的逐行向下执行的,执行到程序的结尾就停止了,如果想要程序能够循环执行(让程序不停的走下去),就需要在程序中加入while (1){},while (1){}是一个死循环程序,在循环体内的程序将一直执行,直到系统断电为止。 在while (1){}中把PORTA端口的相应位输出高电平,则对应的发光二极管就会点亮。 6、配置makefile文件将makefile文件和编写的程序文件放置在同一个文件夹下,在winavr中打开makefile文件。 修改makefile文件中的[单片机类型]、[目标文件名]、[C源文件名]、[系统时钟频率]为实际系统的值。 在本程序中 [单片机类型]为ATmega16(MCU=atmega16) [目标文件名]为main(TARGET=main) [C源文件名]SRC=$(TARGET).c [系统时钟频率]为内部1MHz(F_CPU=1000000) Makefile中的其他内容不用修改。 然后保存。 7、编译文件(点击tools菜单下的makeall进行编译)。 8、下载程序到单片机(使用下载工具和下载软件)。 9、具体程序和makefile文件见附件。 附录1、关于复位电路的典型电路 这个学习板上的复位电路非常简单,很不错。 但是存在一些缺点: 平时复位端口处于悬空状态,这样容易受到外界的干扰。 经典的复位电路设计如下: R0和C0构成RC复位电路,D3(1N4148)的作用有两个: 作用一是将复位输入的最高电压钳在Vcc+0.5V左右,另一作用是系统断电时,将R0(10K)电阻短路,让C0快速放电,让下一次来电时,能产生有效的复位。 AVR处在工作状态时,按下S0按钮,复位脚拉为低电平,触发AVR单片机复位 当然,Mega16已经内置了上电复位设计。 并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单: 直接拉一只10K的电阻到VCC即可(R0)。 为了可靠,再加上一只0.1uF的电容(C0)以消除干扰、杂波。 附录2、关于上拉电阻 一、定义: 上拉电阻就是通过端口一个电阻连到电源正极,从而将不确定的信号通过一个电阻嵌位在高电平! 电阻同时起限流作用! 同理有上拉电阻也就有下拉电阻,下拉电阻的作用刚好和上拉电阻相反。 上拉是对器件注入(输入)电流,下拉是拉出(输出)电流。 二、为什么要使用上拉(下拉)电阻 数字电路一般有三种状态: 高电平、低电平、高阻态。 有些场何不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使端口的状态处于一个稳定的方式。 上拉电阻、下拉电阻起着稳定电路工作状态的作用: 通过上拉(下拉)电阻接电源,使端口稳定的处于高(低)电平状态,直到有低(高)电平输入使,才改变端口的电平状态; 三、上拉(下拉电阻阻值的选择) 电源电压在5V时,上拉电阻一般取值4.7K-10KΩ,下拉电阻一般取值100-470Ω。 上拉电阻阻值的选择原则包括: 1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。 2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。 3、对于高速电路,过大的上拉电阻可能边沿变平缓。 综合考虑 以上三点,通常在4.7k到10k之间选取。 对下拉电阻也有类似道理 附录3 推挽电路适用于低电压大电流的场合,广泛应用于功放电路和开关电源中。 优点是: 结构简单,开关变压器磁芯利用率高,推挽电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小。 缺点是: 变压器带有中心抽头,而且开关管的承受电压较高;由于变压器原边漏感的存在,功率开关管关断的瞬间,漏源极会产生较大的电压尖峰,另外输入电流的纹波较大,因而输入滤波器的体积较大。 OTL推挽输出 这是一个输出电路 按功放输出级放大元件的数量,可以分为单端放大器和推挽放大器。 单端放大器的输出级由一只放大元件(或多只元件但并联成一组)完成对信号正负两个半周的放大。 单端放大机器只能采取甲类工作状态。 推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。 对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。 尽管甲类放大器可以采用推挽式放大,但更常见的是用推挽放大构成乙类或甲乙类放大器。 当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。 这样一来,输出高低电平时,VT3一路和VT5一路将交替工作,从而减低了功耗,提高了每个管的承受能力。 又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。 因此,推拉式输出级既提高电路的负载能力,又提高开关速度。 供你参考。 如果输出级的有两个三极管,始终处于一个导通、一个截止的状态,也就是两个三级管推挽相连,这样的电路结构称为推拉式电路或图腾柱(Totem-pole)输出电路。 当输出低电平时,也就是下级负载门输入低电平时,输出端的电流将是下级门灌入VT5。 二、让发光二极管动起来 一、实验内容和目的 本实验通过硬件电路和软件程序,利用ATMega16单片机来控制8个发光二极管轮流点亮,实现跑马灯的功能的点亮和熄灭。 通过此实验进一步掌握单片机的I/O口功能。 二、硬件电路 硬件电路和上一个实验完全相同,在此不再赘述。 排阻的作用同样是对发光二极管分压限流。 三、软件编写 1)软件编写仍然用WINAVR(GCC),makefile文件参照上一个实验,不用进行任何修改。 2)这个程序中需要用到延时程序,调用了GCC库函数中的延时函数头文件(#include 具体程序在附件里面。 三、让蜂鸣器发出声音 一、实验内容和目的 本实验通过硬件电路和软件程序,利用ATMega16单片机来控制蜂鸣器鸣叫。 通过此实验体会AVR单片机的I/O口驱动小功率器件的功能。 二、硬件电路 硬件电路如图,I/O口连接到蜂鸣器的正极,蜂鸣器负极接地,当蜂鸣器正极加上高电平后,蜂鸣器就会鸣叫。 三、软件编写 1)软件编写仍然用WINAVR(GCC),makefile文件参照上一个实验,不用进行任何修改。 2)这个程序中需要用到延时程序,调用了GCC库函数中的延时函数头文件(#include 具体程序在附件里面 四、让数码管显示数字 一、实验内容和目的 本实验通过硬件电路和软件程序,利用ATMega16单片机来控制数码管显示不同的数字。 通过此实验掌握单片机I/O口较为复杂的控制。 二、硬件电路 数码管的结构如下图: 一个“8”字型的显示模块用“a、b、c、d、e、f、g、p”8个发光二极管组合而成。 每个发光二极管称为一字段。 LED数码显示器有共阳极和共阴极两种结构形式,其内部电原理图如下图,在硬件电路设计和软件编写时不要混淆。 以共阴极数码管为例,由图中可以看出: 如果要点亮数码管的某一段,只需将该段加上高电平,然后使数码管的COM端为低电平,那么该段就会点亮。 LED数码管显示的基本控制原理同发光二极管的控制相同,但在具体使用时则要复杂得多。 与发光二极管的控制电路相比,数码管有不同的设计和应用电路,软件的设计也各不相同,有许多技巧和变化。 本例中数码管管脚连接如下图,选用的是共阴极数码管。 单片机控制数码管位驱动电路如下图,在这个电路中三极管9013的作用有两个: 1)数码管位选通开关,当三极管的基极加上高电平的时候,三极管导通,从而使数码管的位选通端口连接到地,使该位数码管选通。 2)电流放大,因为一个数码管相当于由8个发光二极管构成,在第一个例子中已经讲到,一个发光二极管的导通电流为10mA,则8个数码管全部导通就需要约80mA的电流,而单片机的输出电流只有20mA左右,不足以让数码管的所有段都正常点亮,所以就需要将单片机输出端口的电流放大,三极管9013的作用就在于此。 三、单个数码管(共阴极)的显示 单个数码管的控制相对简单,将数码管的公共端接地,用单片机的一个I/O口的8位分别连接到数码管的8个段端口,分别将某一位或某几位置位或清零,就可以显示不同的字符和符号。 为了获得“0”-“F”16个不同的字型符号,数码管各段所加的电平不同,因此I/O 输出的编码也不同。 因此首先要建立一个字型与字段7段码的编码表,见下表。 有了字型码对照表,就可以用软件的方式进行8段码的译码,例如要显示字符1,数码管的段b,c要加上高电平,其余a,d,e,f,g,dp要加上低电平,同时数码管的位选通端要接低电平。 对照编码表可以知道,此时只需向PA端口输出0Xa0.然后将PC口的第6位置为高电平,使三极管导通,从而将数码管0的位选通端口拉为低电平,那么数码管上就显示出字符“1”了。 端口 段 字型 PB7 b PB6 g PB5 c PB4 dp PB3 f PB2 d PB1 a PB0 e 段码 (共阴极) 0 1 0 1 0 1 1 1 1 0xaf 1 1 0 1 0 0 0 0 0 0xa0 2 1 1 0 0 0 1 1 1 0xc7 3 1 1 1 0 0 1 1 0 0xe6 4 1 1 1 0 1 0 0 0 0xe8 5 0 1 1 0 1 1 1 0 0x6e 6 0 1 1 0 1 1 1 1 0x6f 7 1 0 1 0 0 0 1 0 0xa2 8 1 1 1 0 1 1 1 1 0xef 9 1 1 1 0 1 1 1 0 0xee A 1 1 1 0 1 0 1 1 0xeb B 0 1 1 0 1 1 0 1 0x6d C 0 0 0 0 1 1 1 1 0x0f D 1 1 1 0 0 1 0 1 0xe5 E 0 1 0 0 1 1 1 1 0x4f F 0 1 0 0 1 0 1 1 0x4b 三: 软件编写 1)软件编写仍然用WINAVR(GCC),makefile文件参照上一个实验,不用进行任何修改。 2)这个程序中需要用到延时程序,调用了GCC库函数中的延时函数头文件(#include 本例中仍然是对AVR单片机的I/O口进行输出操作,比前几个例子操作稍微复杂一些。 程序的基本框架是一样的。 具体程序见附件。 附录: 关于数制 在单片机嵌入式系统软件设计中,经常要考虑二进制、十六进制、十进制、BCD码、压缩BCD码、八段码、ASCII码之间的相互转换问题。 人们计数习惯采用十进制,而单片机的计算、存储则为二进制形式最方便。 此外传送字符用ASCII码,LED数码显示要转化成相应的7段码等等。 因此对与各种不同数制的使用和相互转换在软件设计中尤其重要,设计使用得当,可以简化程序设计和优化程序代码。 五、多位数码管的显示 一、实验内容和目的 本实验通过硬件电路和软件程序,利用ATMega16单片机来控制四位数码管显示多位数字,通过本实验掌握多位数码管的动态显示控制。 二、硬件电路 硬件电路与上个实验的电路一致,在此不再说明。 一个LED数码管只能显示一位数字,一般在系统经常要使用多个LED
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVRATmega16 实验 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)