AVR单片机很简单:C语言快速入门及开发实例(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-26 01:46:28

点击下载

作者:曹振华 主编

出版社:化学工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

AVR单片机很简单:C语言快速入门及开发实例

AVR单片机很简单:C语言快速入门及开发实例试读:

前言

随着信息技术的飞速发展,单片机的应用越来越广泛,AVR单片机是1997年由AT-MEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU)精简指令集高速8位单片机,AVR单片机具有高可靠性、功能强、高速度、低功耗等优点,可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通信设备、家用电器等各个领域。ATmega128是ATMEL公司8位系列单片机的最高配置的一款单片机,稳定性极高,应用极其广泛。

本书以AVR单片机中的高档系列——ATmega128单片机为蓝本,全面系统地讲解了AVR单片机的基础知识、硬件结构、各典型接口应用以及多个综合系统应用的设计和分析等。

本书内容具有如下特点:

◇ C语言编程基础介绍简明精炼,通俗易懂,程序精炼实用,代码可靠;

◇ 以实例为主,大量典型的应用实例(如AVR单片机在串口通信、传感器、机床电气控制、嵌入式等的应用)可靠实用,帮助读者轻松入门并快速提高开发技能。

本书由曹振华主编,由陈玉金、陈忠副主编,参加本书编写的还有卢战秋、刘炳海、李蕊、宋占坡、朱翠芳、孟丽丽、田丽、安俊芳、孙艳、程海红、顾玉龙、杨明圣、徐凯、郭超、马冠军、郭树增、李江永、崔吉令、李胜龙、魏友、顾玉超、顾振浩、雅鹏、万雪峰、刘彦斌、陈永陶、张伯虎等。在本书编写过程中,作者借鉴了诸多专业资料和书籍,从中得到了不少启发,在此成书之际一并表示感谢。

由于水平有限,书中难免存在不足,恳请广大读者批评指正。编 者第1章 初识AVR单片机

1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术,共同研发出RISC精简指令集的高速8位单片机,简称AVR。1.1 AVR系列单片机

ATMEL公司的AVR单片机有三个系列的产品。为满足不同的需求和应用,ATMEL公司对AVR单片机推出了Tiny、AT90S和ATmega系列,分别对应低、中、高三个不同档次数十种型号的产品。

Tiny系列AVR单片机:主要有Tiny11/12/13/15/26/28等;

AT90S系列AVR单片机:主要有AT90S1200/2313/8515/8535等;

ATmega系列AVR单片机:主要有ATmega8/16/32/64/128(存储容量为8/16/32/64/128KB)以及ATmega8515/8535等。

三个系列的所有型号的AVR单片机,其指令系统兼容、内核相同,只是存储器容量、片内集成的外围接口的数量和功能略有不同。不同型号AVR单片机有不同的引脚数目,价格各异,可以满足不同应用需求,用户可以根据需要选择。1.1.1 Tiny系列AVR单片机

Tiny系列AVR单片机是小封装系列,内部的资源少,可以用于低成本、小体积的场合,一般应用于家用电器控制方面,如空调、冰箱、微波炉、烟雾报警器等,如表1-1所示。表1-1 Tiny系列AVR单片机1.1.2 AT90S系列AVR单片机

AT90S系列AVR单片机虽价格低廉,有其独特的功能,但从2002年以来,ATMEL公司对AVR单片机产品线进行了调整,逐步停止了性能重叠的中档AVR单片机中AT90系列的生产,而被性能更加优越的ATmega系列代替。如停止AT90S4414、AT90S8515等芯片的生产,用ATmega8515取代AT90S8515,ATmega8535取代AT90S8535,用ATmega8代替AT90S4433等。由于ATmega系列单片机的性能更加完美,使用更加方便,功能更加强大,因此,ATMEL公司今后将以ATmega系列作为AVR单片机的主流产品,逐步减少和停止中档AVR单片机(AT90SXXXX)的生产。1.1.3 ATmega系列AVR单片机

ATmega系列单片机属于AVR中的高档产品。它具备AT90S系列所具有的特点,并在AT90S的基础上有了更大的改善,增加了更多的接口功能,在省电特性、稳定性、抗干扰性、灵活性等上都有了进一步的提高。ATmega系列单片机有优越的性能、良好的性价比。

目前该系列单片机在著名的企业如海尔、科龙等公司有广泛应用,其可靠性高、市场占有率高,因此ATmega系列得到了普及和推广。该系列的单片机引脚数量少的是ATmega8,但其功能齐全。而引脚数最多的是ATmega2560,它是至今AVR中功能最强、配置最全的一款。每一款ATmega系列AVR单片机的工作特性如表1-2、表1-3所示。表1-2 ATmega系列AVR单片机(低配置部分)表1-3 ATmega系列AVR单片机(中高配置部分)1.1.4 AVR单片机的型号标识

随着AVR系列单片机产品线的日趋丰富,产品的命名也越来越复杂,在此仅以ATmega32单片机的产品命名为例,说明一下AVR系列产品的命名方法。本例单片机是AVR系列中较有代表性的一款,其完整型号为:“ATMEGA32A-16PU”,以下对产品型号进行说明。

①开头字母“AT”代表ATMEL公司产品,之后的“MEGA”表示该产品是megaAVR系列。

②“MEGA”后面的数字“32”是产品代号,AVR单片机的产品代号大多与片内的Flash存储器容量有关,此处的“32”表示片内Flash存储器的容量是32KB。

③型号后面的字母表示的是工作电压范围。字母“L”表示的是低电压版本,工作电压为2.7~5.5V,但芯片的最高时钟频率会减半。没有字母的表示工作电压为4.5~5.5V,字母“A”则表示该芯片是改进工艺的新产品,工作电压与“L”版相同,均为2.7~5.5V,但最高时钟频率没有限制。

例如:ATmega32最高时钟频率为16MHz,电源电压为4.5~5.5V,而ATmega32L可以低电压运行,电源电压为2.7~5.5V,但最高时钟频率仅为8MHz。ATmega32A就没有时钟频率限制,在2.7~5.5V电压下时钟频率可以运行在16MHz。

④“-”以后的部分是后缀。其中数字表示该芯片支持的最高系统时钟频率。“16”表示可支持最高为16MHz的系统时钟。

⑤后缀第一个字母表示封装。“P”表示芯片为DIP封装,“A”表示芯片为TQFP封装,“M”表示芯片为MLF封装。

⑥后缀第二个字母表示芯片的应用级别。“C”表示芯片为商业级,“I”表示芯片为工业级(有铅)、“U”表示芯片为工业级(无铅)。1.2 AVR单片机的基本结构

如图1-1所示为AVR单片机的结构框图。AVR单片机抛弃了复杂指令计算机指令(CISC),采用精简指令集(RISC),一条指令可以在一个时钟周期内同时访问两个独立的寄存器,并以字作为指令长度单位,具有取值周期短、可预取指令的特点,可达到IMIPS/MHz的高速运行处理能力。图1-1 AVR单片机结构框图

快速存取RISC寄存器是由AVR的内核中的32个通用工作寄存器构成的,在一个时钟周期内可执行一个完整的ALU操作,操作流程为:先从寄存器中取出操作数,执行操作,最后将操作结果放回目的寄存器中。通用寄存器还可以代替累加器,克服了采用单一ACC进行处理造成的瓶颈现象,同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。

在32个通用工作寄存器中,有6个可以用作3个16位的间接地址寄存器指针以寻址数据空间,实现高效的地址运算,它们分别称为X寄存器、Y寄存器、Z寄存器,其中一个指针还可以作为程序存储器查询表的地址指针。

AVR单片机采用CMOS技术,具有高速度、低功耗的特点,同时还具有休眠(SLEEP)功能。为了最大限度的提高并行处理的运行效率,它运用了Harvard结构,即程序存储器和数据存储器使用不同的存储空间和总线,可直接访问全部的灵敏据存储器和程序存储器,寄存器文件被双向映射并能被访问,算术逻辑单元(ALU)在执行某一指令时,下一个指令被预先从程序存储器中提取处理,提高了MCU的运行效率。

算术逻辑单元(ALU)支持寄存器之间以及寄存器和常数之间的算术和逻辑运算,以及单一寄存器操作,每次的运算结果都通过状态寄存器(SREG)反映出来。

程序流程通过有/无条件的跳转指令和调用指令来控制,从而直接寻址整个地址空间,大多数指令长度为16位,也即每个程序存储器地址都包含一条16位和32位的指令。

AVR的程序存储器空间分为引导程序区和应用程序区。它们的读和读/写保护由对应的锁定位来实现。用于写应用程序区的SPM指令必须位于引导程序区。

AVR单片机内嵌高质量的可擦写10000次的Flash程序存储器,擦写方便,支持ISP和LAP,便于产品的调试、开发、生产、更新。内2嵌可擦写10000次的EPROM。可多次更改程序,快速完成商品化。片内大容量的RAM可有效支持使用高级语言开发系统程序,并可扩展外部RAM。

在中断和子程序调用过程中,程序计数器(PC)中返回地址被保存在堆栈之中,而堆栈处于数据存储器(SRAM)中,因此堆栈的大小只受系统总的静态存储器(SRAM)的大小及其使用情况的限制。

AVR存储器空间为线性的平面结构。它具有一个灵活的中断模块,每个中断都对应一个中断入口地址,各个中断的优先级与其在中断入口地址有关,中断入口地址越小,中断优先级就越高。

I/O存储器空间包含64个I/O寄存器空间,它们用来控制MCU的各个外围功能。映射到数据空间即为寄存器文件之后的地址为$20~$5F。

AVR单片机的I/O线带有可设置的上拉电阻,可单独设定为输入/输出,作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10~20mA(吸入输出);作输出时可输出40m(单一输出)大电流,可直接驱动固态继电器(SSR),内置看门狗定时装置(WDT),使得I/O口资源灵活,产品抗干扰能力强。

AVR单片机内具备多种独立的时钟分频器,可以提供给串行异步通信(URAT)、SPI传输功能使用。8/16位定时/计数器可作比较器、计数器外部中断和PWM用于控制输出。AVR单片机的定时/计数器进行(单)双向计数形成三角波,并与输出比较匹配寄存器配合,可生成占空比、频率、相位都可变的方波信号。

AVR单片机有自上电复位电路(POR)、独立的看门狗电路(WDT)、低电压检测电路BOD,多个复位源,只要在复位端接一个上拉电阻就可以了,不需要外接外部复位器件。2

AVR单片机具有Flash程序存储器、看门狗、EPROM、同/异步串行口、TWI、SPI、A/D模数转换器、定时/计数器等多种器件和增强可靠性的复位系统、降低功耗抗干扰的休眠模式,品种多门类全的中断系统、具输入捕获和比较匹配输出等多样化功能的定时/计数器、具替换功能的I/O端口多种功能,性能十分强大,内部结构比较复杂。1.3 ATmega128系列单片机

ATmega128位微控制器是ATMEL推出的AVR单片机中的高档产品,具有高速低功耗、超强功能、精简指令的特点,能够同时读、写。在执行指令的同时,通过SPI、UART或两线接口对快闪存储器进行编程或重新编程。ATmega128在实际应用中有着非常强大的功能,本书将以AVR单片机中的高档产品——ATmega128单片机为主线进行介绍,使读者通过本书的学习,能够熟练掌握ATmega128单片机的应用。1.3.1 ATmega128单片机的特点

ATmega128单片机具有133条指令,大多数指令可以在一个时钟周期内完成,而且有32个8位通用工作寄存器及外设控制寄存器,克服了一般单片机单一累加器数据处理带来的瓶颈现象,从而使得指令代码更加灵活,编码更容易。ATmega128单片机除具有先进的RISC结构外,还具有以下优点。

①非易失性的程序和数据存储器。ATmega128单片机具有128KB的系统内可编程Flash,寿命为10000次写/擦除周期。具有独立锁定位和可选择的启动代码区。可通过片内的启动程序实现系统内编程真正的读-修改-写操作,而且包括寿命为100000次写/擦除周期的4KB 2EPROM及4KB的内部SRAM,有多达64KB的优化的外部存储器空间。ATmega128单片机可以对锁定位进行编程以实现软件加密,并可以通过SPI实现系统内编程。

②JTAG接口(与IEEE1149.1标准兼容)。ATmega128单片机遵循JTAG标准的边界扫描功能,支持扩展的片内调试,可以通过JTAG2接口实现对Flash、EPROM、熔丝位和锁定位的编程。

③外设特点。ATmega128单片机具有两个包含独立的预分频器和比较器功能的8位定时/计数器,两个具有预分频器、比较功能和捕捉功能的16位定时/计数器,并且具有独立预分频器的实时时钟计数器,同时含有两路8位PWM,6路分辨率可编程(2~16位)的PWM,8路10位转换器,面向字节的两线接口,两个可编程的串行USART,可工作于主机/从机模式的SPI串行接口,具有独立片内振荡器的可编程看门狗定时器,输出比较调制器,片内模拟比较器等外设。

④特殊的处理器特点。ATmega128单片机具有上电复位以及可编程的掉电检测,片内经过标定的RC振荡器,片内/片外中断源可以通过软件进行选择的时钟频率,通过熔丝位可以选择ATmega103兼容模式和全局上拉禁止功能及6种睡眠模式。6种睡眠模式分别为空闲模式、ADC噪声抑制模式,省电模式、掉电模式、Standby模式以及扩展的Standby模式。

⑤ATmega128L工作电压范围为2.7~5.5V,系统时钟为0~8MHz,ATmega128工作电压范围为4.5~5.5V,系统时钟为0~16MHz,而且ATmega128具有整套的开发工具,包括C编译器、宏汇编、程序调试器/仿真器和评估板。1.3.2 ATmega128与ATmega103的兼容性

ATmega128是一个高度复杂的微处理器,它的I/O数目为AVR指令集所保留的64个I/O的超集。为了保持其与ATmega103的兼容性,所有ATmega103的I/O位置与ATmega128的相同。多数添加的I/O位于$60~$FF扩展的I/O空间(也就是位于AT-mega103的内容RAM空间)。这些地址可以通过指令LD/LDS/LDD和ST/STS/STD来访问,而不是IN/OUT指令。内部RAM空间的变换对ATmega103用户来说仍然是个问题。此外,当程序代码使用了绝对地址时,逐渐增多的中断向量也可能是个问题。为了解决这些问题,ATmega128设置了一个熔丝位M103C。通过对熔丝位进行编程就可以使ATmega128工作于ATmega103兼容模式。此时扩展I/O空间将无法使用,而内部RAM正好与ATmega103的一致。同时扩展的中断向量也被取消了。

熔丝位M103C的配置将设定ATmega128是否以与ATmega103兼容的方式工作,兼容性主要表现在RAM、I/O引脚和中断向量上。ATmega128在出厂时M103C默认状态为“0”,即默认与ATmega103兼容方式工作。但是,在这种兼容模式下,ATmega128的以下一些新特点将起作用。

ATmega128新特点如下:

①只剩下一个USART,支持异步模式。只有低8位的波特率寄存器可用。

②一个16位的定时/计数器有两个比较器寄存器,而不是两个16位定时/计数器有三个比较寄存器。

③不支持两线串行接口。

④端口C只能用作输出。

⑤端口G只能用作第二功能,而不能作通用I/O端口。

⑥端口F只能作为输入引脚,而不能作ADC的模拟输入引脚。

⑦不支持引导程序功能。

⑧不能够校准片内RC振荡器的频率。

⑨在外部存储器接口不能释放任何地址引脚作为通用I/O,也不能够为不同的外部存储器地址区配置不同的等待周期。

此外,下面的特性使ATmega128更兼容ATmega103。

①只有EXTRF和PORF存在于状态寄存器MCUCSR里。

②改变看门狗溢出时间没有时序要求。

③外部中断引脚3~0只能作为电平中断。

④USART没有FIFO缓冲器。

在写操作中,ATmega103没有使用I/O应该写。1.3.3 ATmega128单片机的引脚配置

ATmega128单片机有64个引脚,其中包含53个可编程I/O端口线,且多数端口都含有第二功能。共封装有TQFP与MLF两种,这两种封装的64引脚布局均相同,如图1-2所示,但是引脚的位置及引脚的同间距有所差别,在绘制电路板时要加以注意。图1-2 ATmega128单片机的引脚

ATmega128单片机各引脚说明如下。(1)VCC 数字电路的电源。(2)GND 地。(3)端口A(PA7~PA0) 端口A为8位双向I/O,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口A为三态。(4)端口B(PB7~PB0) 端口B为8位双向I/O,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口B为三态。(5)端口C(PC7~PC0) 端口C为8位双向I/O,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口C为三态。(6)端口D(PD7~PD0) 端口D为8位双向I/O,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口D为三态。(7)端口E(PE7~PE0) 端口E为8位双向I/O,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口E为三态。(8)端口F(PF7~PF0) 端口F为8位双向I/O,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口F为三态。(9)端口G(PG7~PG0) 端口G为8位双向I/O,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口G为三态。(10)RESET 复位输入引脚。超过最小门限时间的低电平将引起系统复位。低于此时间的脉冲不能保证可靠复位。(11)XTAL1 反向振荡器放大器及片内时钟操作电路的输入。(12)XTAL2 反向振荡器放大器的输出。(13)AVCC 端口F以及ADC转换器的电源。需要与VCC相连接,即使没有使用ADC也应如此。使用ADC时应该通过一个低通滤波器与VCC连接。(14)AREF ADC的模拟基准输入引脚。(15)PEN SPI串行下载的使能引脚。在上电复位时保持PEN为低电平将使器件进入SPI串行下载模式。在正常工作过程中PEN引脚没有其他功能。1.3.4 ATmega128单片机的结构

ATmega128单片机为基于AVR RISC结构的8位低功耗CMOS微处理器。由于其先进的指令集以及单周期指令执行时间。ATmega128的数据吞吐率高达1MIPS/MHz,从而缓减了系统在功耗和处理速度之间的矛盾。

ATmega128单片机的内核具有丰富的指令集和32个通用工作寄存器,所有的寄存器直接与算术逻辑单元(ALU)相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的复杂指令集微处理器高10倍的数据吞吐率。ATmega128单片机的总体结构框图如图1-3所示。图1-3 ATmega128单片机的总体结构框图2

ATmega128单片机具有Flash程序存储器、看门狗、EPROM、同/异步串行口、TWI、SPI、A/D模数转换器、定时/计数器等多种器件和增强可靠性的复位系统。同时有降低功耗抗干扰的休眠模式、中断系统、输入捕获/输出比较、多样化功能的定时/计数器以及具有替换功能的I/O端口。

ATmega128单片机性能十分强大,内部结构相对比较复杂,其总体结构包括以下几个部分,分别介绍如下。(1)快速存取RISC寄存器 快速存取RISC寄存器是由AVR的内核中的32个通用工作寄存器构成的,在一个时钟周期内可执行一个完整的ALU操作。(2)32个通用工作寄存器 在32个通用工作寄存器中,有6个可以用作3个16位的间接地址寄存器指针,以寻址数据空间,实现高效的地址运算,它们分别为X寄存器、Y寄存器、Z寄存器。(3)Harvard结构 AVR单片机采用CMOS技术,具有高速度、低功耗的特点,同时还具有休眠(SLEEP)功能。为了最大限度地提高并行处理的运行效率,它采用了Harvard结构,即程序存储器和数据存储器使用不同的存储空间和总线,可直接访问全部的数据存储器和程序存储器,寄存器文件被双向映射并能被访问。算术逻辑单元(ALU)在执行某一指令时,下一个指令被预先从程序存储器中被提取处理,提高了MCU的运行效率。(4)算术逻辑单元(ALU) 算术逻辑单元(ALU)支持寄存器之间以及寄存器和常数之间的算术和逻辑运算,以及单一寄存器操作,每一次的运算结果都通过状态寄存器(SREG)反映出来。

程序流程通过有/无条件的跳转指令和调用指令来控制,从而直接寻址整个地址空间。大多数指令长度为16位,即每个程度存储器地址都包含一条16位或32位指令。(5)程序存储器 AVR的程序存储器空间由引导程序区和应用程序区组成。它们的读和读/写保护由对应的锁定位来实现。(6)I/O存储器 I/O存储器空间包含64个I/O寄存器空间,它们用来控制MCU的各个外围功能。(7)多种独立的时钟分频器 多种独立的时钟分频器为串行步通信(URAT)、SPI提供传输。8/16位定时/计数器可用作比较器、计数器外部中断和PWM的控制输出。AVR单片机定时/计数器(单)双向计数形成三角波与输出比较匹配寄存器配合,可以生成占空比、频率、相位可变的方波信号。(8)其他电路 AVR单片机有自动上电复位电路(POR)、独立的看门狗电路(WDT)、低电压检测电路BOD,多个复位源,只需在复位端接一个上拉电阻即可实现复位,不需要另加外部复位器件。第2章 ATmega128单片机I/O端口的应用

输入/输出端口(通常称为I/O端口)指实现CPU与外部设备之间数据交换的接口设备,I/O端口将CPU与外部设备联系在一起,实现数据的传输。2.1 ATmega128单片机的I/O端口

在ATmega128单片机中,提供了53个可编程的I/O端口,分别为PA~PG口。当用SBI或CBI指令改变某个I/O引脚的输出/输入方向,改变引脚的输出电平或在禁止/允许引脚的内部上拉电阻时,其他引脚的状态不会被改变。同时它可以输出或吸收大电流,直接驱动LED显示器。2.1.1 ATmega128单片机I/O端口的基本结构

AVR的所有I/O端口都具有与电压无关的上拉电阻,当上拉电阻被激活且引脚被拉低时该引脚会输出电流,如图2-1所示。图2-1 I/O引脚等效原理图

PA~PG口都对应三个I/O寄存器位,它们分别为POPTxn、DDxn以及PINxn。其中POPTxn位于数据寄存器PORTx中,DDxn位于数据方向控制寄存器DDRx中,PINxn位于端口输入引脚寄存器PINx中,x为n端口的序号。数据寄存器和数据方向控制寄存器为读/写寄存器,而端口输入引脚寄存器为只读寄存器。如图2-2所示为I/O端口引脚的说明。图2-2 I/O端口引脚图

寄存器SFIOR的上位禁止位PUD相当于I/O端口上拉电阻的总开关。当上拉禁止位PUD置位时,所有上拉电阻均失效,当其为0时,各个上拉电阻的阻值取决于DDxn的设置。(1)数据方向控制寄存器DDRx 数据方向控制寄存器用来控制I/O端口的输入输出方向,当DDxn为“1”时,I/O端口处于输出工作状态,此时数据寄存器中的数据可输出到外部引脚,当DDxn为“0”时,I/O端口处于输入工作状态,此时端口输入引脚寄存器中的数据就是外部引脚的实际电平。(2)数据寄存器PORTx 当I/O端口工作于输入方式时,如果PORTxn为“1”,上拉电阻将使能。通过将PORTxn清零或将该引脚配置为输出两种方式可不使用内部的上拉电阻。

当I/O端口工作于输出方式时,如果设置POTxn为“1”,端口引脚被驱动为高电平,此时可输出20mA的电流。如果将POTxn清零,端口引脚被拉低,此时可吸收20mA的电流(输出低电平)。(3)端口输入引脚寄存器PINx 当DDxn为“1”时,对应的Pxn为输出引脚,当DDxn为“0”时,对应的Pxn为输入引脚。如表2-1所示为AVR通用I/O口的引脚配置情况。表2-1 端口引脚配置表

不论将方向寄存器DDxn配置为何种状态,都可以通过读PINxn寄存器来获得外部引脚的当前电平。如图2-2所示,PINxn寄存器的各个位与锁存器组成了一个同步锁存电路。这样做的优点是可以避免当外部引脚电平的改变出现在系统时钟边缘产生一个不稳定的值。而其缺点就是形成了一个锁存延迟。

如图2-3所示为读取引脚电平时的同步锁存时序图。最大和最小传输延迟分别用t和t来表示。pd.maxpd.min图2-3 读取引脚电平时的同步锁存时序图

第一个系统时钟下降沿开始进行同步锁存,当时钟信号为低时锁存器是关闭的,而时钟信号为高时锁存器导通,如图2-4所示为读取软件赋予的引脚电平的同步锁存时序图。图2-4 读取软件赋予的引脚电平的同步锁存时序图

当时钟信号为低,即锁存器关闭时,外部引脚的值被锁存在锁存器之中,在紧接着的系统时钟上升沿处再锁存到PINx寄存器中。

如图2-3中t和t所示,引脚上的信号转换最后被锁存在pd.maxpd.minPINx中,且延迟介于1/2~3/2个系统时钟。

如果要读取软件赋予的引脚电平,在输出指令out和输入指令in之间需要插入一条NOP指令,如图2-4所示。输出指令out在时钟的上升沿将同步锁存信号SYNC-LATCH置位,可将外部引脚实际电平锁存,在紧接着的系统时钟上升沿处再锁存到PINx中,此时同步器的延迟时间t为一个系统时钟。pd

下面分别通过汇编程序和C程序来说明如何置位端口B的引脚0和1,清零引脚2和3,并且配置4~7号引脚为输入引脚,并且为引脚6和7设置上拉电阻,然后回读设置的引脚电平值。如前面讨论的那样,在输入和输出语句之间插入了一个NOP指令,使得能够正确地回读那些设定好的引脚值。(1)汇编代码例程 …… ;定义上拉电阻和设置高电平输出 ;为端口引脚定义方向 ldi r16,(1< < PB7)|(1< < PB6)|(1< < PB1)|(1< < PB0) ldi r17,(1< < DDB3)|(1< < DDB2)|(1< < DBB1)|(1< < DBB0) out PORTB,r16 out DDRB,r17 ;为了同步插入 nop指令 Nop ;读取端口引脚 In r16,PINB ……(2)C代码例程 Unsigned char i; …… /* 定义上拉电阻和设置高电平输出* / /* 为端口引脚定义方向* / PORTB= (1< < PB7)|(1< < PB6)|(1< < PB1)|(1< < PB0) DDRB= (1< < DDB3)|(1< < DDB2)|(1< < DBB1)|(1< < DBB0) /* 为了同步插入 nop指令* / _Nop(); /* 读取端口引脚* / i= PINB; ……2.1.2 数字输入使能和睡眠模式

当引脚作为数字I/O口时,在施密特触发器的前端,数字输入信号可以钳位到地。当MCU处于各种睡眠模式时,SLEEP信号将被置位,将触发器的前端钳位到地,以防止在输入悬空或模拟输入电平接近V/2时消耗过多的电流。CC

当引脚作为外部中断输入时,SLEEP信号会跳过这些引脚。若外部中断源没有被使能,SLEEP信号对这些引脚仍然起作用。在使能引脚的第二功能时SLEEP也让位于第二功能。

如果异步外部中断引脚被设置为“任意逻辑电平变化均可引发中断”状态,即使外部中断没有使能,当该引脚被置位时,MCU从睡眠唤醒时相应的外部中断标志将置位。这是由于睡眠时在SLEEP信号的作用下,内部信号被钳位到地,而唤醒后外部高电平输入到内部逻辑,产生了低电平到高电平的信号变化。2.1.3 I/O端口的第二功能

除了作为一般的数字I/O之外,大多数端口引脚都具有第二功能。如图2-5所示说明了简化出来的端口引脚控制信号是如何被第二功能所屏蔽的。这些被屏蔽的信号被转换用于第二功能,且不会出现在所有的端口引脚,本图要看作是适用于AVR系列处理器所有端口引脚的一般描述。图2-5 I/O口第二功能控制逻辑电路

如表2-2所示列出了由第二功能模块内部产生的控制屏蔽信号的功能。表2-2 第二功能模块控制屏蔽信号简述2.1.4 I/O端口的特点

AVR的大部分I/O端口都具有双重功能,可分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的I/O口,如定时器、计数器、串行接口、模拟比较器、捕捉器等。AVR通用I/O端口的主要特点如下:(1)可自行定义输入输出工作方式 ATmega128的PA~PF都为8位双向I/O口,PG口为5位的双向I/O口,其每一位引脚都可以单独地进行定义,相互不受影响。例如,用户可以将PA口的第1、2、3、5、6位定义为输入,同时将第0、4、7位定义为输出。(2)输出/吸收大电流 每个I/O口输出方式均采用推挽式缓冲器输出,提供大电流的驱动,可以输出(吸入)20mA的电流,因而能直接驱动LED。如果允许端口电平达到1V以上,电流最大可以达到40mA。(3)内部上拉电阻可控性 每一位引脚内部都有内部上拉电阻,该电阻可通过编程设置其为上拉有效或无效。当I/O口处于输入工作方式时,可以三态输入,也可以带上拉电阻,这样就可以省去外电路的上拉电阻。(4)DDRx可控的方向寄存器 在AVR单片机中,除了数据寄存器和控制寄存器外,还包括一个方向控制寄存器,由这3个寄存器共同来控制其I/O口。其中,方向控制寄存器用于控制I/O口的输入、输出方向。由于输入寄存器PINx实际上不是一个寄存器,而是一个可选的三态缓冲器,外部引脚通过该三态缓冲器与MCU的内部总线相连,因此,读PINx时是读取外部引脚上的实际逻辑值,实现了外部信号的同步输入,这种结构使I/O端口具备了真正的读-修改-写的特性。2.1.5 I/O端口使用时的注意事项

使用I/O端口应注意以下事项:

①当要使用AVR的I/O口时,首先要定义I/O的方向,对方向寄存器的某位置1时工作于输出状态,清零时工作于输入状态。

②当I/O口工作于输入方式时,若需要上拉电阻,可将数据寄存器相应位置上1,这样可省去外部电流的上拉电阻。

③当I/O口工作于输入方式时,若要读取外部引脚上的电平,应该读取PINxn的值,而不是PORTAxn的值。

④当I/O口工作于输出方式时,上拉电阻已断开,对应数据寄存器相应位置1,推挽输出高电平;对应数据寄存器相应位清零,推挽输出低电平。

⑤如果将I/O口由输出状态设置成输入状态后,必须等待一个时钟周期后才能正确地读到外部引脚的值。2.2 I/O寄存器

I/O寄存器占据了通用寄存器后面的最高64个字节的数据存储空间,每一个寄存器都提供了对MCU内部的I/O外设的控制寄存器或数据寄存器的访问。程序员或以使用I/O寄存器来作为MCU内部的I/O外设的接口。2.2.1 I/O寄存器的操作特点

ATmega128单片机的所有I/O和外设值都放置在I/O空间中,通过这些寄存器可以了解CPU及其外设的运行状态和控制CPU及其外设的动作和行为。

对于不同的地址,分别使用不同的指令来访问:

①LD/LDS/LDD和ST/STS/STD指令,可以访问全部的I/O地址;

②SBI和CBI指令,可直接进行位寻址地址为$00~$1F的I/O寄存器;

③SBIS和SBIC指令,则用来检查单个位置位与否;

④IN和OUT指令,访问地址在$00~$1F之间的寄存器。

如果要像SRAM一样通过LD和ST指令访问I/O寄存器,相应的地址要加上$20。

当ATmega128工作于ATmega103兼容模式时,扩展的I/O被SRAM所取代。为了与后续产品兼容,保留未用的位应写“0”,而保留的I/O寄存器则不应进行写操作。一些普遍存在态标志位的清除是通过写“1”来实现的。2.2.2 I/O寄存器的C语言程序

在ICCAVR中访问地址$0020~$005F之间的I/O寄存器,可以使用内汇编和预处理宏。

向端口A的输出位输出数据的方式如下: PORTA= 0x22;//sets the second bit of port A //and clears the orher seven port A

从端口A的输入位读取数据的方式如下: x= PINA; //reads all 8 pins of port A

在这个例子中x会包含所有端口A的位值,不管输入还是输出,因为PINA寄存器反映的是端口中所有位的值。

输入引脚都是悬空的,即不必为每个相关的端口引脚加入上拉电阻。如果需要加入上拉电阻,MCU可以将相应的端口驱动寄存器的相应位置1。程序如下所示: DDRT= 0xF0; //upper 2 bits as output ,lower 6 as input PORTA= 0x30; //enale internal pull-ups on lowest 2 bits2.2.3 特殊功能I/O寄存器(SFIOR)

SFIOR各位的定义如下:

Bit2(PUD):禁止上拉电阻。

置位时,即使将寄存器DDxn和PORTxn配置为使能上拉电阻({DDxn,PORTxn}=0b01),I/O端口的上拉电阻也被禁止。2.3 各端口说明2.3.1 PA端口(1)A口特性 端口A是一个8位通用双向输入/输出(I/O)口,它分配有三个数据存储地址,分别为数据寄存器PORTA($003B),数据方向控制寄存器DDRA($003A)和A口的引脚寄存器PINA($0039)。A口的输入引脚地址为只读方式,而数据方向控制寄存器和数据寄存器为读写方式。(2)寄存器

①端口A数据寄存器(PORTA)的各位定义如下:

②端口A数据方向控制寄存器(DDRA)的各位定义如下:

③端口A输入引脚寄存器(PINA)的各位定义如下:(3)第二功能 端口A的第二功能用于外部存储器接口的低字划地址及数据位。端口A的第二功能如表2-3所示。表2-3 端口A的第二功能2.3.2 PB端口(1)B口特性 端口B是一个8位通用双向输入/输出(I/O)口,它分配有三个数据存储地址,分别为数据寄存器PORTB($0038),数据方向控制寄存器DDRB($0037)和B口的输出引脚寄存器PINB($0036)。其每一个引脚都具有可编程的内部上拉电阻。B口的输入引脚地址为只读方式,而数据方向控制寄存器和数据寄存器为读写方式。(2)寄存器

①端口B数据寄存器(PORTB)的各位定义如下:

②端口B数据方向控制寄存器(DDRB)的各位定义如下:

③端口B输入引脚寄存器(PINB)的各位定义如下:(3)第二功能 端口B的第二功能用于定时/计数器输出及SPI功能接口。端口B的第二功能如表2-4所示。表2-4 端口B的第二功能

①Bit7(OC2/OC1C)。PB7可以作为T/C2输出比较器模块的输出,此时引脚必须配置为输出(DDB7设置为“1”),OC2引脚也是PWM模式的输出引脚。PB7也可以作为T/C1输出比较C模块的输出,此时引脚必须配置为输出(DDB7设置为“1”),OC1C是PWM模式的输出引脚,其中,OC2为输出比较匹配模块的输出,OC1C为输出比较匹配C模块的输出。

②Bit6(OC1B)。PB6可以作为T/C1输出比较B模块的输出,此时引脚必须配置为输出(DDB6设置为“1”),OC1B是PWM模式的输出引脚。其中,OC1B为输出比较匹配B模块的输出。

③Bit5(OC1A)。PB5可以作为T/C1输出比较A模块的输出,此时引脚必须配置为输出(DDB5设置为“1”),OC1A是PWM模式的输出引脚。其中,OC1A为输出比较匹配A模块的输出。

④Bit4(OC0)。PB4可以作为T/C0输出比较模块的输出,此时引脚必须配置为输出(DDB4设置为“1”),OC0是PWM模式的输出引脚。其中,OC0为输出比较匹配B模块的输出。

⑤Bit3(MISO)。MISO为SPI通道的主机数据输入和从机数据输出。当工作于主机模式时,不论DDB3的设置如何,这个引脚都将设置为输入;当工作于从机械模式时,这个引脚的数据方向由DDB3控制。设置为输入时,上拉电阻由PORTB3控制。

⑥Bit2(MOSI)。当工作于从机模式时,不论DDB2设置如何,这个引脚都将设置为输入;当工作于主机模式时,这个引脚的数据方向由DDB2控制。设置为输入后,上拉电阻由PORTB2控制。其中MOSI为SPI通道的主机数据输出和从机数据输入。

⑦Bit1(SCK)。当工作于从机模式时,不论DDB1设置如何,这个引脚都将设置为输入,当工作于主机模式时,这个引脚的数据方向由DDB1控制。设置为输入后,上拉电阻由PORTB1控制,其SCK为SPI通道的主机时钟输出和从机时钟输入。

⑧Bit0()。当工作于从机模式时,不论DDB0设置如何,这个引脚都将设置为输入;当工作于主机模式时,这个引脚的数据方向DDB0控制,设置为输入后,上拉电阻由PORTB0控制,其中为从机选择输入。2.3.3 PC端口(1)C口特性 端口C是一个8位通用双向输入/输出(I/O)口,它分配有三个数据存储地址,分别为数据寄存器PORTC($0035),数据方向控制寄存器DDRC($0034)和C口的输出引脚寄存器PINC($0033)。其每一个引脚都具有可编程的内部上拉电阻,C口的输入引脚地址为只读方式,而数据方向控制寄存器和数据寄存器为读写方式。(2)寄存器

①端口C数据寄存器(PORTC)的各位定义如下:

②端口C数据方向控制寄存器(DDRC)的各位定义如下:

③端口C输入引脚寄存器(PINC)的各位定义如下:

当系统处于ATmega103兼容模式时,DDRC和PINC寄存器被初始化为推挽零输出。即使在时钟没有运行的情况下,端口也保持其初始值。要注意的是,在ATmega103兼容模式下DDRC和PINC是可见的。

在ATmega103兼容模式下,端口C为输出端口,其第二功能为外部存储器接口的地址高字节。端口C的第二功能如表2-5所示。表2-5 端口C的第二功能2.3.4 PD端口(1)D口特性 端口D是一个8位通用双向输入/输出(I/O)口,它分配有三个数据存储地址,分别为数据寄存器PORTD($0032),数据方向控制寄存器DDRD($0031)和D口的输出引脚寄存器PIND($0030)。其每一个引脚都具有可编程的内部上拉电阻,D口的输入引脚地址为只读方式,而数据方向控制寄存器和数据寄存器为读写方式。(2)寄存器

①端口D数据寄存器(PORTD)的各位定义如下:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载