ATmega16最小系统Word下载.docx
- 文档编号:17460940
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:39
- 大小:1.49MB
ATmega16最小系统Word下载.docx
《ATmega16最小系统Word下载.docx》由会员分享,可在线阅读,更多相关《ATmega16最小系统Word下载.docx(39页珍藏版)》请在冰豆网上搜索。
电源(+5V)
复位电路:
启动后让单片机从初始状态执行程序
振荡电路:
单片机是一种时序电路,必须施加脉冲信号才能工作。
Mega16内部有RC震荡电路但相比外部的晶体震荡电路还是不够准确,另外它也可以使用外部晶振工作,两者之间的切换通过熔丝位(以后会讲)来选择在其内部有一个时钟产生电路只要接上两个电容和一个晶振即可正常工作。
。
ATmega16单片机最小系统的硬件电路图如下:
如图所示为ATmega16最小系统电路图,图中标有相同代号的引脚表示连接在一起。
图中ISP和JTAG为ATmega16的两种下载方式各自的引脚接口,ISP用于在线下载程序比较方便快捷,所用下载软件为progisp;
JTAG是在线仿真接口通过仿真器连接单片机进行程序的下载和仿真,所用软件为AVRStudio;
通常我门使用ISP下载就已经足够了,并且方便快捷很稳定好用,下载器也便宜;
JTAG在需要仿真的时候用,它可以看见单片机各个引脚的输出值和输入值等,但JTAG实际定使用中不稳定有时候很容易出错电脑不识别下不进去程序等问题,个人偏好使用ISP.
说明:
此最小系统电路图中只画出了最简单的应用电路——流水灯,和最基本的能让单片机正常工作的外围电路及下载程序所必须的ISP和JTAG接口,如果你想焊一个电路板出来自己使用,其他的外围电路可以在日后使用当中自己再往上焊。
2.1.2编译软件
AVR单片机的编译软件有GCCAVR和ICCAVR等,通常使用较多的是ICCAVR,也比较好用,本书以ICCAVR6.31版本为例介绍编译软件的使用。
编译步骤如下:
1.新建一个工程
启动ICCAVR,界面如图2-1-1所示。
然后新建一个项目,选择Project项再选则New菜单项,则打开界面如图2-1-2所示。
图2-1-1ICCAVR主界面
图2-1-2
注:
新安装的软件由于为建立过工程和文件界面与图2-1-1中所示不完全相同
为了自己使用方便在保存工程时最好单独新建一个文件夹。
接下来”文件名(N):
”文本框中输入项目名称,保存为.prj格式。
本书中此处保存为ATmega16.然后点击如图2-1-1中的File选项再选择New,界面此时会变为如图2-1-3所示
2.新建一个C程序图2-1-3
此时编写一个最简单的和前面最小系统版配套的C程序,如图2-1-4所示,程序如下
/////////////////////////////////////////////////////////////////
//AVRATmega16流水灯C程序//
//环境:
ICCAVR6.31//
//日期:
2011/09/14//
////////////////////////////////////////////////////////////////
#include<
iom16v.h>
//包含单片机型号头文件
macros.h>
//包含"
位"
操作头文件
voiddelay(void)//自定义延时函数
{
unsignedchari,j;
for(i=0;
i<
255;
i++)
for(j=0;
j<
10;
j++)
;
}
voidcpu_init(void)//单片机初始化函数
PORTA=0x00;
//PA口输出值都定义为0
DDRA=0x00;
//PA口输出允许关
PORTB=0x00;
//PB口输出值都定义为0
DDRB=0x00;
//PB口输出允许关
PORTC=0x00;
//PC口输出值都定义为0
DDRC=0x00;
//PC口输出允许关
PORTD=0x00;
//PD口输出值都定义为0
DDRD=0x00;
//PD口输出允许关
voidmain(void)
{
cpu_init();
//初始化单片机
while
(1)
{
PORTA=0X00;
/*点亮led灯,由最小系统的外部电路决定单片机输出
低电平时流水灯点亮*/
DDRA=0XFF;
/*允许输出,此时PORTA的赋值才有效,这事AVR比51高级的地方*/
//由于其他端口没有接外围设备先不用定义
delay();
DDRA=0X00;
//关闭led灯
}
/*****************************************************************************/
/*另外最好先定义PORTX的值再给DDRX赋值,因为如果先打开DDRX允许,则PORTX*/
/*中原来的的值会输出,再给PORTX赋值的话其实在这段时间内*/
/*该端口已经有输出值但不是你后来设定的PORTX的数值,如DDRA=0XFF;
PORTA=0XFF;
*/
/*和PORTA=0XFF;
DDRA=0XFF;
两条看似一样的语句在有*/
/*写地方作用结果就会不一样,在有些控制要求严格的地方容易出现错误,即使我们平*/
/*时使用没出现错误我们平时做事也要有一个严谨的态度*/
图2-1-4
接下来单击图中磁盘符号保存,界面如图2-1-5所示
图2-1-5
输入你要保存的文件名,注意文件名结尾必须是.c格式,本书中命名为2-1-2.c,接下来点击保存即可。
界面变为如图2-1-6所示
图2-1-6
3.添加C程序到工程
接下来要把文件添加进你刚才创建的工程里去,右键点击如图2-1-6中所示右面Project下ATmega16工程下的File文件夹选择AddFile(s)选项,会弹出一个对话框界面变为如图2_1_7所示
图2-1-7
此时打开你开始创建的C程序保存的文件夹,选择你刚才创建的程序点击打开即可,这事程序成功的添加到工程里的File文件夹里。
如下图2-1-8所示
图2-1-8
接下来右键点击File文件夹下的2-1-2.c文件选择options…选项,弹出界面如图2-1-9所示
图2-1-9
选项按图2-1-9中选择即可,另外Compiler选项按图2-2-0选择即可
接下来全点击ok,这时新建工程,为工程添加文件等工作都已完成。
4.编译
如果c程序没有错误点击编译按钮就会生成16进制的HEX文件。
界面如图2-2-1所示
图2-2-1
如果有错误则通过提示修改你的程序修改完再次编译直至通过为止。
2.2.1ISP下载软件Progisp的使用
1.芯片选择
打开下载器页面如下图2-2-2所示在选择芯片的地方选择ATmega16即可。
2.熔丝位的配置
如果你想选择片外的晶振和使能ISP或关闭JTAG等功能则要在下载软件里配置好熔丝位然后写入到单片机里面去,由于我们使用ISP下载程序,所以我们要在熔丝位里面关闭JTAG,否则JTAG所对应的PC口的几个I/O引脚口会失去I/O的作用,即使你给它定义了数值并且也允许它输出了它也不会有任何输出值。
接下来我门讲解怎么进行熔丝位的设置:
首先,点开图2-2-2中下载软件主界面左半面的向导方式选项,这时界面会如图2-2-3所示,我们可以看见软件默认的是使用内部RC振荡器,我们要使用外部8MHZ的晶体振荡器所以我们把页面向下拉动我们会看见如图2-2-4图中所示的选项“外部晶振(3.0---MHZ)启动时间…”鼠标点其前面的小方框里即可,这时我们选择了使用片外的3MHZ以上的晶振,下面还有“使能JTAG接口(JTAGEN=0)和使能ISP编程(SPIEN=0)”两个选项,我们把前一个使能JTAG接口的那个给它去掉,如图2-2-5所示,但注意ISP那个千万不能去掉因为我们要用ISP下载程序进单片机,至于其他的选项可以不管。
接下来,我们要把刚才设置的熔丝位写进单片机,在图2-2-5配置熔丝位的向导方式下面有“读出默认写入”三个选项,并且主界面右下方有一个“编程熔丝位选项”,在“编程熔丝位选项”前面的方框内打勾,再点击左面三个选项中的“写入”,这时你刚才设置的熔丝位就都生效了。
如果没有其他需要,以后就不用再设置熔丝位了,所以“编程熔丝位选项”前面的勾可以去掉了,因为我们没必要每次下载都烧写熔丝位,那样会很费单片机的。
图2-2-2下载软件主界面
图2-2-3
图2-2-4
图2-2-5
3.下载程序到单片机
点击“调入FLASH”,界面如图2-2-6所示(并不一定和书上所示的完全一样)
找到你开始ICCAVR里面建立的保存C程序的文件夹,点击和你所建立的文件名一样的以HEX结尾的16进制文件,如图2-2-7所示,再单击打开后界面如图2-2-8所示,接下来点击“自动”程序就会被下载到单片机里面去了。
如果你的程序是与前面书中给的单片机最小系统相配套的流水灯程序,并且你的板子的硬件电路接法和书中所给的最小系统的硬件电路一样,那么PA口所接的8个流水灯会亮灭、亮灭的闪烁。
图2-2-6
图2-2-7
图2-2-8
3.1.1学会看芯片数据手册的重要性
ATmega16常用片上资源有定时器、PWM、外部中断、SPI总线、两线串行接口TWI、EEPROM、USART、模拟比较器、ADC转换、IEEE(JTAG)边界扫描等。
我们先来学习定时器。
中断是单片机实时地处理内部或外部事件的一种内部机制。
当某种内部或外部事件发生时,单片机将暂停正在执行的事件去执行中断函数里所对应的程序,执行完中断后再继续执行原来的事件。
ATmega16内部有多个中断源每个中断源都能引起中断。
其中断向量如下表3-1-2所示,表中每个中断向量都有一个向量号,这些向量号代表对应的中断源,在C语言程序里这些向量号代表相应的中断源,在编写中断函数时要使用到。
同时它们还代表着优先顺序,向量号小的中断源更优先些,即两个或多个中断同时触发时中断号小的先被执行。
AVR不能设置中断优先级,但可以通过软件实现低优先级中断打断高优先级的中断;
另外AVR的中断机制是不管是高优先级的中断还是低优先级的中断,在响应中断后,AVR都会自动清零全局中断标志位I位,这样,其它中断就不能响应,在执行完中断子程序后,AVR会自动置位全局中断位I,这样,AVR才可以响应其它的中断;
另外AVR也不能像51等单片机直接进行中断嵌套,要想使用AVR的中断嵌套则要通过软件人为实现,根据使用经验有使用ACR的中断嵌套:
在中断服务程序中,人为置位全局中断标志位I位,AVR就可以执行其他中断了;
在进入中断程序时,置位全局中断标志位,适当关闭一些不必要的中断(退出时要重新开启),就可以实现低优先级中断打断高优先级的中断了;
表3-1-2
3.1.3定时/计数器的基本结构及工作原理
在上一章测试最小系统的程序中我们采用的延时方法是循环延时即让单片机空运行几个周期从而达到延时的效果,延时不准确只是粗略的应用,要进行准确的延时则要运用定时器——单片机最重要的组成部分之一。
定时器是一个独立的计数器,计数过程不会被中断程序打断,除非系统复位,定时器也不受其他程序的影响。
定时器其实就是我门在数字电路里面学过的计数器,也叫分频器,它对时钟脉冲进行计数,从而对时间进行计时。
以下为定时器Timer0工作的原理框图:
一、定时器/计数器的寄存器:
我们在使用单片机内部资源的时候都要进行初始化,通常我们会在程序中编写一个专门用来初始化的函数来完成初始化工作。
比如我们在使用定时器的时候就要对定时器的时钟源进行设置,还要对计数器的初始值进行设置,当然还要打开全局中断,否则单片机不会响应定时器所产生的中断信号,有些设置要安排在初始化函数里,有些要安排在主函数里。
我们以定时器Timer0为例来学习ATmega16的定时器。
Timer1和Timer2的用法和Timer0类似。
我们用定时器Timer0需要设置的寄存器有TCCR0、TCNT0、TIMSK,有时也人为设置TIFR(中断标志寄存器),但通常不用人为设置,单片机硬件会自定对其清零。
TCCR0是T/C控制寄存器,主要对时钟源、分频器和定时器是否开启进行设置,其各位的名称如下:
我们使用定时器Timer0要设置的位为CS02、CS01、CS00,用于选择T/C的时钟源,其具体选择方式如下表3-1-3所示,其他的位我们暂时不用不要对他们进行设置依然保持其初始值0不变。
表3-1-3
其中clk为系统主时钟。
为了准确我们采用外部晶振作为主时钟,也可以采用内部RC时钟作为主时钟。
如你要对时钟就行64分频则TCCR0的设置为:
TCCR0=0x02;
(以十六进制形式进行表示)。
TCNT0是设置计数器初始值的寄存器,是一个8位的二进制寄存器,如下所示:
TCNT0最小为0,最大为255,用十六进制表示就是0x00~0xff。
定时器每次计数都是从TCNT0中
设定的数开始进行加1计数,每来一个时钟脉宽就加1,直到计到最大数0xff,这时加1就回到0x00,此时会引发定时器中断(在定时器中断允许打开的前提下)。
要想定时时间长可以给TCNT0设置较小的初始值,反之就设置较大的。
TIMSK是定时器中断屏蔽寄存器,各位名称如下:
其最低位TOIE0是定时器0溢出中断使能位,即引发中断允许位,当把其赋值为1时,定时器0中断使能打开,如我们使用定时器0时要让它中断使能则TIMSK要设置为0x01。
二、定时器/计数器的定时/计数初始值的计算
假设定时器溢出中断需要的时间为T,时钟频率为f,则T=(0xff-TCNT0)X(1/f),其中0xff为十进制的255,TCNT0为寄存器设置的初始值,假设TCCR0=0x02;
即采用外部时钟并进行64分频,由于我们使用的是8MHZ晶振,所以64分频后f=1/8MHZ,所以执行一条语句要1/f=8us,假设TCNT0=0X01;
则T=(255-1)X8us=2032us。
如果采取8分频后,则时钟频率变为1MHZ,即时钟周期为1us,理论上溢出中断的最短时间是1us,最长时间是0.26us。
实际执行程序时,由于处理中断也需要时间,所以可实现的定时要略长一点。
AVR单片机中断响应时间最少为4个时钟周期,中断返回需要4个时钟周期,这样可实现的定时至少要比理论上的溢出中断延时长8个时钟周期。
再加上中断服务程序的语句处理时间,最后导致实际定时要略长于计算结果,这是在精确的短时间定时下必须认真考虑的问题。
改进的办法是提高主时钟频率和缩短中断服务程序中的语句执行时间。
三、用定时器控制LED闪烁
1、目标要求
采用本书第二章中给出的ATmega16的最小系统硬件电路。
用定时器控制发光二极管进行明暗交替变化闪烁,定时时间要准确。
2、程序设计
思路:
对单片机及定时器进行初始化,在初始化的时候先给PA口赋初值为0,先关闭LED,再启动定时器,定时器/计数器计数满的时候,中断会被触发,继而中断函数被执行,我门可以在中断函数里面设置控制PA口LED的程序。
程序如下:
首先,在这里应该注意一个问题是LED闪烁的间隔时间不能太小,因为LED不是断电后立即熄灭的,而7段式LED数码管正是利用其这一特点进行的扫描显示给人一种数码管都在亮的感觉,其实一排的多个数码管当中每个时刻只有一个在亮。
unsignedchari=0;
voidport_init(void)//单片机初始化函数
DDRA=0xff;
//允许PA口输出
///////////////////////////////////////////////////////
//定时器0初始化函数//
voidtimer0_init(void)
TCCR0=0x00;
//关闭定时器0
TCNT0=0x00;
//设定初始值
TCCR0=0x05;
//为了得到较大的定时时间采取使用外部8MHZ晶振并对其进行1024分频,因为时间太短LED还没来得及熄灭就被点亮人眼不能够分辨出交替闪烁
//////////////////////////////////////////////////////
//定时器0中断服务函数//
/*声明和使用中断服务函数,当Timer0请求中断时,执行timer0_ovf_isr()子函数*/
#pragmainterrupt_handlertimer0_ovf_isr:
10/*定时器0的中断向量号为10,由表3-1-2可查*/
voidtimer0_ovf_isr(void)
//从新装入初始值
PORTA=i;
i=~i;
/////////////////////////////////////////////////////
//初始化函数//
voidinit_devices(void)
CLI();
//关闭全局中断
port_init();
timer0_init();
//定时器0初始化
TIMSK=0x01;
//定时器0溢出中断使能开
SEI();
//使能全局中断
init_devices();
//单片机端口和定时器0进行初始化
while
(1);
//空循环防止程序跑飞
本书所付光盘里面还有定时器1和定时器2的参考程序。
脉冲宽度调制(PulseWidthModulation,PWM),简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,具有经济节约空间、抗噪声强等优点,广泛应用在从测量、通信到功率控制与变换的许多领域中。
在电动机控制领域中强调能节能环保的变频技术,比如变频空调、变频洗衣机、和变频冰箱等,其实它们所利用的核心技术就是PWM技术。
PWM技术是利用直流脉冲序列的占空比变化来改变直流电的平均值。
直流电压的高低是指脉冲的平均值大小,脉冲是由高电平和低电平构成的,高电平存在时间在整个周期中所占的时间比例称为占空比。
高电平时间越长,占空比越大,平均值越大,电压越高。
通过控制高电平的时间长短就可改变占空比,调节输出电压的高低,对电动机进行调速等应用。
通常PWM的输出是脉冲序列,在要求严格直流场合必须进行仔细的滤波,滤除其中的交流成分。
在电动机调速等应用中则对滤波要求不是那么严格了,可以进行适当简化,主要原因在于电动机的转动速度远比电脉冲频率低,而且机械阻尼会减少电动机的抖动;
还有一个更重要的原因是电动机的线圈可以看成是一个很大的电感线圈,可以对脉冲序列进行很好的滤波。
ATmega16内的PWM模块:
AVR单片机内部集成了PWM模块,这些模块在运行时不占用CPU资源,不影响其他程序的运行。
ATmega16具有4通道PWM,分别是4脚(OC0)、19脚(OC1A)、18脚(OC1B)和21脚(OC2)的第二功能。
定时器控制这些PWM模块产生PWM波,4脚(OC0)受定时器0控制、19脚(OC1A)和18脚(OC1B)受定时器1控制、21脚(OC2)受定时器2控制。
定时器0和定时器2为8位计数器,定时器1为16位计数器,定时器0和定时器2的工作模式有:
普通模式、CTC(比较匹配时清零定时器)模式、快速PWM模式、相位修正PWM模式;
定时器1的工作模式也有普通模式、CTC(比较匹配时清零定时器)模式、快速PWM模式和相位修正PWM模式,此外还有一个相位与频率修正PWM模式。
要控制单片机的定时器工作产生PWM波形并在相应引脚进行输出就要学会控制它里面相应的寄存器了,所以下面我们先来学习一下它的寄存器。
首先是定时器0由寄存器TCCR0及输出比较寄存器-OCR0等控制,对其工作模式的控制设置选择如下所示:
•Bit7–FOC0:
强制输出比较
FOC0仅在WGM00指明非PWM模式时才有效。
但是,为了保证与未来器件的兼容性,在
使用PWM时,写TCCR0要对其清零。
对其写1后,波形发生器将立即进行比较操作。
比较匹配输出引脚OC0将按照COM01:
0的设置输出相应的电平。
要注意FOC0类似一
个锁存信号,真正对强制输出比较起作用的是COM01:
0的设置。
FOC0不会引发任何中断,也不会在利用OCR0作为TOP的CTC模式下对定时器进行清零的操作。
读FOC0的返回值永远为0。
•Bit6,3–WGM01:
0:
波形产生模式
这几位控制计数器的计数序列,计数器的最大值TOP,以及产生何种波形。
T/C支持的
模式有:
普通模式,比较匹配发生时清除计数器模式(CTC),以及两种PWM模式,见下表:
•Bit5:
4–COM01:
1)比较输出模式,快速PWM模式
2)比较输出模式,相位修正PWM模式
注意:
一个特殊情况是OCR0等于TOP,且COM01置位。
此时比较匹配将被忽略,而计数到
TOP时OC0的动作继续有效。
•Bit2:
0–CS02:
时钟选择
用于选择T/C的时钟源
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ATmega16 最小 系统