




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录第一章 概述第二章 单片机最小系统及编译、下载软件的使用 2.1.1 单片机最小系统 2.1.2 编译软件 2.2.1 下载软件 Progisp的使用第三章 熟悉ATmega16的片上资源3.1.1 会看芯片数据手册的重要性3.1.2 中断3.1.3定时器/计数器的基本结构及工作原理3.1.4 PWM3.2外部中断3.3 USART3.4.1 A/D转换模块3.5 EEPROM第四章 ATmega16实际应用 4.1 外接按键4.2 驱动数码管4.3 液晶显示屏12864的使用4.4 基于DS18B20的温度测量4.5 基于PWM的直流电机调速4.6 步进电机的使用4.7 舵机的使用4.8 超声波测距及其应用倒车雷达4.9 基于JZ863的无线串口通信4.10 单片机与计算机间的通信 第二章 单片机最小系统及编译、下载软件的使用2.1.1 单片机最小系统能让单片机工作的有最基本元器件构成的系统称为单片机最小系统。单片机最小系统通常包括:电源(+5V)复位电路:启动后让单片机从初始状态执行程序振荡电路:单片机是一种时序电路,必须施加脉冲信号才能工作。Mega16内部有RC震荡电路但相比外部的晶体震荡电路还是不够准确,另外它也可以使用外部晶振工作,两者之间的切换通过熔丝位(以后会讲)来选择在其内部有一个时钟产生电路只要接上两个电容和一个晶振即可正常工作。 ATmega16 单片机最小系统的硬件电路图如下:如图所示为ATmega16最小系统电路图,图中标有相同代号的引脚表示连接在一起。图中ISP和JTAG为ATmega16的两种下载方式各自的引脚接口,ISP用于在线下载程序比较方便快捷,所用下载软件为progisp ;JTAG是在线仿真接口通过仿真器连接单片机进行程序的下载和仿真,所用软件为AVR Studio ;通常我门使用ISP下载就已经足够了,并且方便快捷很稳定好用,下载器也便宜;JTAG在需要仿真的时候用,它可以看见单片机各个引脚的输出值和输入值等,但JTAG实际定使用中不稳定有时候很容易出错电脑不识别下不进去程序等问题,个人偏好使用ISP. 说明:此最小系统电路图中只画出了最简单的应用电路流水灯,和最基本的能让单片机正常工作的外围电路及下载程序所必须的ISP和JTAG接口,如果你想焊一个电路板出来自己使用,其他的外围电路可以在日后使用当中自己再往上焊。2.1.2 编译软件 AVR单片机的编译软件有GCC AVR和ICC AVR等,通常使用较多的是ICC AVR,也比较好用,本书以ICC AVR6.31版本为例介绍编译软件的使用。 编译步骤如下:1. 新建一个工程启动ICC AVR,界面如图2-1-1所示。然后新建一个项目,选择Project项再选则New菜单项,则打开界面如图2-1-2所示。 图2-1-1 ICCAVR主界面 图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所示,程序如下/ AVR ATmega16 流水灯C程序 / 环境:ICC AVR 6.31 / 日期:2011/09/14 /#include /包含单片机型号头文件#include /包含位操作头文件void delay(void) /自定义延时函数 unsigned char i,j; for(i=0;i255;i+) for(j=0;j10;j+) ;void cpu_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口输出允许关void main(void) cpu_init(); /初始化单片机while(1)PORTA=0X00; /*点亮led灯,由最小系统的外部电路决定单片机输出 低电平时流水灯点亮*/DDRA=0XFF; /*允许输出,此时PORTA的赋值才有效,这事AVR比51高级的地方*/ /由于其他端口没有接外围设备先不用定义 delay(); DDRA=0X00; /关闭led灯 delay();/*/* 另外最好先定义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-63.添加C程序到工程接下来要把文件添加进你刚才创建的工程里去,右键点击如图2-1-6中所示右面Project下ATmega16工程下的File文件夹选择Add File(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.1 ISP下载软件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-53. 下载程序到单片机点击“调入FLASH”,界面如图2-2-6所示(并不一定和书上所示的完全一样)找到你开始ICC AVR里面建立的保存C程序的文件夹,点击和你所建立的文件名一样的以HEX结尾的16进制文件,如图2-2-7所示,再单击打开后界面如图2-2-8所示,接下来点击“自动”程序就会被下载到单片机里面去了。如果你的程序是与前面书中给的单片机最小系统相配套的流水灯程序,并且你的板子的硬件电路接法和书中所给的最小系统的硬件电路一样,那么PA口所接的8个流水灯会亮灭、亮灭的闪烁。 图2-2-6 图2-2-7 图2-2-8第三章 熟悉ATmega16的片上资源3.1.1 学会看芯片数据手册的重要性 3.1.2 中断 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-23.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,用十六进制表示就是0x000xff 。定时器每次计数都是从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/8 MHZ,所以执行一条语句要1/f=8us,假设TCNT0=0X01;则T=(255-1) X 8us=2032us 。 如果采取8分频后,则时钟频率变为1MHZ,即时钟周期为1us,理论上溢出中断的最短时间是1us,最长时间是0.26us。实际执行程序时,由于处理中断也需要时间,所以可实现的定时要略长一点。AVR单片机中断响应时间最少为4个时钟周期,中断返回需要4个时钟周期,这样可实现的定时至少要比理论上的溢出中断延时长8个时钟周期。再加上中断服务程序的语句处理时间,最后导致实际定时要略长于计算结果,这是在精确的短时间定时下必须认真考虑的问题。改进的办法是提高主时钟频率和缩短中断服务程序中的语句执行时间。三、用定时器控制LED闪烁1、 目标要求采用本书第二章中给出的ATmega16的最小系统硬件电路。用定时器控制发光二极管进行明暗交替变化闪烁,定时时间要准确。2、 程序设计思路:对单片机及定时器进行初始化,在初始化的时候先给PA口赋初值为0,先关闭LED,再启动定时器,定时器/计数器计数满的时候,中断会被触发,继而中断函数被执行,我门可以在中断函数里面设置控制PA口LED的程序。程序如下:首先,在这里应该注意一个问题是LED闪烁的间隔时间不能太小,因为LED不是断电后立即熄灭的,而7段式LED数码管正是利用其这一特点进行的扫描显示给人一种数码管都在亮的感觉,其实一排的多个数码管当中每个时刻只有一个在亮。 #include #include unsigned char i=0;void port_init(void) /单片机初始化函数 PORTA = 0x00; DDRA = 0xff; /允许PA口输出 PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x00;/ 定时器0初始化函数 /void timer0_init(void) TCCR0 = 0x00; /关闭定时器0 TCNT0 = 0x00; /设定初始值 TCCR0 = 0x05; /为了得到较大的定时时间采取使用外部8MHZ晶振并对其进行1024分频,因为时间太短LED还没来得及熄灭就被点亮人眼不能够分辨出交替闪烁/ 定时器0中断服务函数 /*声明和使用中断服务函数,当Timer0请求中断时,执行timer0_ovf_isr()子函数*/#pragma interrupt_handler timer0_ovf_isr:10 /*定时器0的中断向量号为10,由表3-1-2可查*/void timer0_ovf_isr(void) TCNT0 = 0x00; /从新装入初始值 PORTA=i; i=i;/ 初始化函数 /void init_devices(void) CLI(); /关闭全局中断 port_init(); /初始化单片机 timer0_init(); /定时器0初始化 TIMSK = 0x01; /定时器0溢出中断使能开 SEI(); /使能全局中断 void main(void) init_devices(); /单片机端口和定时器0进行初始化 while(1); /空循环防止程序跑飞本书所付光盘里面还有定时器1和定时器2的参考程序。3.1.4 PWM脉冲宽度调制(Pulse Width Modulation,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等控制,对其工作模式的控制设置选择如下所示: Bit 7 FOC0: 强制输出比较FOC0仅在WGM00指明非PWM模式时才有效。但是,为了保证与未来器件的兼容性,在使用PWM 时,写TCCR0 要对其清零。对其写1 后,波形发生器将立即进行比较操作。比较匹配输出引脚 OC0 将按照COM01:0 的设置输出相应的电平。要注意FOC0 类似一个锁存信号,真正对强制输出比较起作用的是COM01:0 的设置。FOC0不会引发任何中断,也不会在利用OCR0作为TOP的CTC模式下对定时器进行清零的操作。读FOC0 的返回值永远为0。 Bit 6, 3 WGM01:0: 波形产生模式这几位控制计数器的计数序列,计数器的最大值TOP,以及产生何种波形。T/C 支持的模式有:普通模式,比较匹配发生时清除计数器模式(CTC),以及两种PWM 模式,见下表: Bit 5:4 COM01:0:1)比较输出模式,快速PWM 模式 2)比较输出模式,相位修正PWM 模式 注意:一个特殊情况是OCR0 等于TOP,且COM01 置位。此时比较匹配将被忽略,而计数到TOP 时OC0 的动作继续有效。 Bit 2:0 CS02:0: 时钟选择 用于选择T/C 的时钟源。 注:如果T/C0 使用外部时钟,即使T0 被配置为输出,其上的电平变化仍然会驱动记数器。利用这一特性可通过软件控制记数。输出比较寄存器 OCR0 输出比较寄存器包含一个8 位的数据,不间断地与计数器数值TCNT0 进行比较。匹配事件可以用来产生输出比较中断,或者用来在OC0 引脚上产生波形。T/C 寄存器 TCNT0通过T/C 寄存器可以直接对计数器的8 位数据进行读写访问。对TCNT0 寄存器的写访问将在下一个时钟阻止比较匹配。在计数器运行的过程中修改TCNT0 的数值有可能丢失一次TCNT0 和OCR0 的比较匹配。 释例程序:#include /包含单片机型号头文件#include /包含位操作头文件#include /包含延时头文件#include /包含通用函数及宏定义头文件/*/* 函数名称: PWM0_init() */* 功 能: PWM0初始化函数 */*/void PWM0_init(void) TCCR0 = 0x00; /关闭定时器0 TCNT0 = 0x00; OCR0 = 0X80;/占空比128/256TCCR0 = 0x6b;/开启定时器,时钟进行64分频/*/* 函数名称: PWM1_init() */* 功 能: PWM1初始化函数 */*/void PWM1_init(void) TCCR1B = 0x00; TCNT1H = 0x00; TCNT1L = 0x00; OCR1AH = 0x03; /脉冲宽度1.5ms,舵机归位中间 OCR1AL = 0x16; ICR1H = 0x28; /TOP值设为10350,周期20ms ICR1L = 0x6e; TCCR1A = 0xa0; /*升序记数时比较匹配将清零OC1A/OC1B,降序记数时比较匹配置位OC1A/OC1B*/ TCCR1B = 0x12; /8分频/*/* 函数名称: init_devices() */* 功 能: 初始化函数 */*/void init_devices(void) CLI(); PWM0_init();/PWM0初始化 PWM1_init();/PWM1初始化SEI(); void main(void) init_devices(); while(1);3.2外部中断 概述: AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量,所有的中断向量都有自己的使能位。当使能位置位,且寄存器的全局总段使能位I也置位时,中断就可以发生了。 ATmega16的外部中断有3个,分别是INT0、INT1、INT2,外部中断控制寄存器有:1)。MCUCR控制外部中断1和0的触发方式,其具体位设置如下表所示 寄存器MCUCR的各位 表3-2-1外部中断0的触发方式配置 表3-2-2外部中断1的触发方式配置具体设置如下:假如我们设置外部中断INT0的下降沿触发,则由表3-2-1可知MCUCR寄存器的ISC01和ISC00位应分别置位为1、0,其他位不用变保持其默认值0,则寄存器MCUCR的设置为:MCUCR=0X02;假如在开启外部中断0的同时也要开启外部中断1并设置外部中断1为上升沿触发则设置为:MCUCR=0X0E;根据此配置方式如果你想设置为其他触发方式可参考表3-2-1和3-2-2进行设置。2)。MCUCSR控制外部中断2的触发方式其具体位设置如下: 寄存器MCUCSR的各位外部中断INT2的触发方式配置方式为:寄存器MCUCSR的BIT6位ISC2为外部中断2的触发方式控制位,异步外不中断由外部引脚INT2激活,如果SREG 寄存器的I 标志和GICR 寄存器相应的中断屏蔽位置位的话。若ISC2 写0,INT2 的下降沿激活中断。若ISC2 写1,INT2 的上升沿激活中断。INT2 的边沿触发方式是异步的。最后,不要忘记在重新使能中断之前通过对GIFR 寄存器的相应中断标志位INTF2 写1使其清零。 3)。通用中断控制寄存器GICR 通用中断寄存器GICR G ICR的BIT7、BIT6、BIT5分别是外部中断1、外部中断0、外部中断2的中断请求使能位,当相应的位置为1,且状态寄存器SREG 的I 标志位置位,相应的外部引脚中断就使能了。MCU通用控制寄存器 MCUCR的中断敏感电平控制1位、0位 1/0 (ISC11与ISC10、ISC01与ISC00)决定中断是由上升沿、下降沿,还是INT1、INT0电平触发的。只要使能,即使INT1 、INT0引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。当INT2 为1,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。MCU通用控制寄存器 MCUCR的中断敏感电平控制2位 1/0 (ISC2与ISC2)决定中断是由上升沿、下降沿,还是INT2 电平触发的。只要使能,即使INT2 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。4)。通用中断的标志寄存器GIFR 通用中断标志寄存器 Bit 7 INTF1: 外部中断标志1INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如果SREG的位I以及GICR寄存器相应的中断使能位INT1为1,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入1 来清零。 Bit 6 INTF0: 外部中断标志 0INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。如果SREG的位I以及GICR寄存器相应的中断使能位INT0为1,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入1 来清零。 Bit 5 INTF2: 外部中断标志2INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF2。如果SREG的位I以及GICR寄存器相应的中断使能位INT2为1,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入1 来清零。注意,当INT2中断禁用进入某些休眠模式时,该引脚的输入缓冲将禁用。这会导致INTF2标志设置信号的逻辑变化。中断服务程序的编写:声明和使用中断服务函数的例子:/当外部中断INT0请求中断时,执行int0_isr()子函数#pragma interrupt_handler int0_isr:2 /外部中断0的中断向量号为2/外部中断0的中断服务子函数void int0_isr(void) /中断服务程序(你想让单片机接下来怎么工作的程序)中断程序如下:说明:具体每条语句的作用请看光盘里面的电子档程序的介绍#include #include #include /包括延时函数头文件#defineKEY0(PIND&0x04)/INT0#defineKEY1(PIND&0x08)/INT1#define KEY2 (PINB&0X04) /INT2void port_init(void) PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x00;#pragma interrupt_handler int0_isr:2void int0_isr(void) GIFR|=(1INT0); DDRD|=0X04; delay_nms(20); /自编的延时函数通过让机器运行空周期来达到延时目的。 if(KEY0=0)/再次确认按键是否被按下 PORTA=0X0F; DDRA=0XFF; delay_nms(20); PORTA=0XF0; delay_nms(20); PORTA=0XFF; #pragma interrupt_handler int1_isr:3void int1_isr(void) GIFR|=(1INT1); DDRD|=0X08; delay_nms(20); if(KEY1=0) PORTA=0XF8; DDRA=0XFF; delay_nms(20); PORTA=0XFF; #pragma interrupt_handler int2_isr:19void int2_isr(void) GIFR|=(1INT2); DDRB|=0X04; delay_nms(20); if(KEY2=0) PORTA=0XEF; DDRA=0XFF; delay_nms(20); PORTA=0XFF; void init_devices(void) CLI(); port_init(); MCUCR = 0x0f; MCUCSR= 0x40; GICR = 0xE0; SEI(); void main(void) init_devices(); while(1); 本实验所用硬件电路原理图如下图3-1-1所示 图3-1-1外部中断硬件电路图3.3 USART3.4.1 A/D模块 由于单片机的端口数量有限,为了提高单片机的应用灵活性,除了通用I/O功能之外,大多顺端口引脚都具有第二功能。其中外部中断INT0、INT1、INT2用的就是端口第二功能。如下图3-4-1所示ATmega16最小系统引脚图中标出了各个引脚的第二功能: 其中可以看出PA从PA0口到PA7口的第二功能依次为ADC0到ADC7,分别为我们本节课所要学习的A/D转换模块的输入端口。A/D转换: A/D转换是将模拟量转换为数字量。常见的温度、压力、流量等参数都是模拟量,不便于存储和处理,通常通过A/D转换把它们变为数字量,然后进行存储、处理或传输。实现A/D转换的设备称为A/D转换器或ADC。 A/D转换器在结构上可以分为逐次逼近式、双积分式和并行式等多种类型。其中各有有点: 逐次逼近式;速度快、精度较高,完成一次转换大约需要几十微秒; 双积分式:转换精度高,抗干扰性好,但转换速度较慢,完成一次需要几百毫秒; A/D转换器的主要参数包括:转换时间、转换频率、分辨率和转换精度等。其中转换时间指A/D转换器完成一次模拟量到数字量转换所需的时间。转换频率是转换时间的倒数,转换时间和转换频率都表示转换速度的高低,反映实时性能。分辨率指A/D转换器对输入电压微小变化响应能力的度量,一般用二进制位数或仪表显示器的位数表示。转换精度是用A/D转换器实际输出的数字量和理论上输出的数字量之间的差别来表示的误差,常用最低有效位(LSB)的倍数表示。 A/D转换可以使用专门的A/D转换芯片进行,也可以采用具有A/D转换功能的单片机进行转换。我们要学习的ATmega16就具有A/D转换功能, 转换结果可以方便的把数据存储在EEPROM(3.5节介绍)中,也可以通过数码管等显示设备显示出来。 图3-4-1 3.4.2单片机内的A/D转换器结构和性能1、A/D转换器结构ATmega16有一个10位的逐次逼近型ADC。ADC与一个8通道的模拟多路复用器连接,能对来自端口A 的8 路单端输入电压进行采样。单端电压输入以0V (GND) 为基准。ADC 包括一个采样保持电路,以确保在转换过程中输入到ADC 的电压保持恒定。ADC有AVCC引脚单独提供电源。AVCC与Vcc之间的偏差不能超过0.3V。A/D转换的参考电压源(Vref)可以选择2.56V的内部基准电压、AVCC或外接于AREF的电压。2、ADC基准电压源标称值为2.56V的基准电压以及AVCC都位于器件之内,基准电压可以通过加在AREF引脚上加一个电容进行解耦,以更好地抑制噪声。ADC的参考电压源(Vref)反映了ADC的转换范围。若单端通道电平超过了Vref,则其结果将近0x3FF。3、A/D转换器性能ATmega16的A/D转换器性能指标为: 10 位 精度 0.5 LSB 的非线性度 2 LSB 的绝对精度 65 - 260 s 的转换时间 最高分辨率时采样率高达15 kSPS 8 路复用的单端输入通道 7 路差分输入通道 2 路可选增益为10x 与200x 的差分输入通道 可选的左对齐ADC 读数 0 - VCC 的 ADC 输入电压范围 可选的2.56V ADC 参考电压 连续转换或单次转换模式 通过自动触发中断源启动ADC 转换 ADC 转换结束中断 基于睡眠模式的噪声抑制器3.4.3 A/D转换器寄存器与设置1、A/D转换寄存器1)ADC 多工选择寄存器 ADMUX 其位定义如下: Bit 7:6 REFS1:0: 参考电压选择如Table 83 所示,通过这几位可以选择参考电压。如果在转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机械自动化开发合同范本
- 矿山承包合同解除协议书
- 项目部装修包工合同协议
- 绿化庭院合同协议书模板
- 私人建房买卖合同协议书
- 益生菌酸奶采购合同范本
- 电动铲墙机购买合同协议
- 演员临时经纪合同协议书
- 汽车机器人出售合同协议
- 美牙顾客协议合同书范本
- 船舶租赁知识培训班课件
- 护理员交接班
- 电机维修协议合同
- 艾梅乙防治知识培训课件
- 机动链锯操作规程
- 2025年中小学班主任基本功大赛笔试试题题库(附答案)
- 兼职中医师聘用合同范本
- 渣土运输方案
- 2025-2030中国包装印刷行业现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 高职大学生心里健康教育(第2版)-课程思政案例(结合知识点)
- 2025年大学食堂食材采购协议
评论
0/150
提交评论