1、第六章 通用I/O接口基本结构与输出应用 ATmega16芯片具备 PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4组8位,共32路通用I/O接口,分别对应于芯片上32根I/O引脚。 所有这些I/O口都是双(有的为3)功能复用的。其中第一功能均作为数字通用I/O接口使用。通用I/O口的基本结构与特性 I/O口的基本结构,每组I/O口配备三个8位寄存器: 1、方向控制寄存器DDRx; 2、数据寄存器PORTx; 3、输入引脚寄存器PINx(x=ABCD)。 方向控制寄存器DDRx用于控制I/O口的输入输出方向,即控制I/O口的工作方式为输出方式还是输入方式。 当DD
2、Rx=1时,I/O口处于输出工作方式。AVR的输出采用推挽电路提高了I/O口的输出能力。 当PORTx=1时,I/O引脚呈现高电平。 当PORTx=0时,I/O引脚呈现低电平。 AVR的I/O在输出方式下提供了比较大的驱动能力(20mA驱动电流),可以直接驱动LED等小功率外围器件。 当DDRx=0时,I/O处于输入工作方式。此时引脚寄存器PINx中的数据就是外部引脚的实际电平,通过读I/O指令可将物理引脚的真实数据读入MCU。 当I/O口定义为输入时(DDRx=0),通过PORTx的控制,可使用或不使用内部的上拉电阻。 PUD为寄存器为寄存器SFIOR中的一位,它的作用相当中的一位,它的作用
3、相当AVR全全部部I/O口内部上拉电阻的总开关。口内部上拉电阻的总开关。 当当PUD=1时,时,AVR所有所有I/O内部上拉电阻都不起作用内部上拉电阻都不起作用(全局内部上拉无效);(全局内部上拉无效); 而而PUD=0时,各个时,各个I/O口内部上拉电阻取决于口内部上拉电阻取决于DDRXn的的设置。设置。 AVR通用I/O端口的主要特点为:1、双向可独立位控的I/O口2、Push-Pull大电流驱动 3、可控制的引脚内部上拉电阻4、DDRx可控的方向寄存器 AVR的IO注意事项:1、首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。2、在输入方式时,要读取外部引脚上的电平时,应读取
4、PINxn的值,而不是PORTxn的值。3、在输入方式时,要根据实际情况使用或不使用内部的上拉电阻。4、一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn的值。I/O端口寄存器 ATmega16的4个8位的端口都有各自对应的3个I/O端口寄存器,它们占用了I/O空间的12个地址。通用数字I/O口的设置与编程 AVR汇编指令系统中,直接用于对I/O寄存器的操作指令有以下3类,全部为单周期指令:1)IN/OUT IN/OUT指令实现了32个通用寄存器与I/O寄存器之间的数据交换,格式为: IN Rd,A ;从I/O寄存器A读数剧到通用寄存器Rd
5、OUT A,Rr ;通用寄存器Rr数据送I/O寄存器A 2)SBI/CBI SBI/CBI指令实现了对I/O寄存器(地址空间为I/O空间的0 x00-0 x31)中指定位的置1或清0,格式为: SBI A,b ;将I/O寄存器A的第b位置1 CBI A,b ;将I/O寄存器A的第b位清0 3)SBIC/SBIS SBIC/SBIS指令为转移类指令,它根据I/O寄存器(地址空间为I/O空间的0 x00-0 x31)的指定位的数值实现跳行转移(跳过后面紧接的一条指令,执行后序的第二条指令),格式为: SBIC A,b ;I/O寄存器A的第b位为0时,跳行执行 SBIS A,b ;I/O寄存器A的第
6、b位为1时,跳行执行通用I/O口的输出应用 通用I/O输出设计要点1、AVR系统的工作电源为5伏(手持系统往往采用1.5v3v电源),所以I/O的输出电平为5v。当连接的外围器件和电路采用3v、9v、12v、15v等与5v不同的电源时,应考虑输出电平转换电路。 输出电流的驱动能力。2、AVR的I/O口输出为“1”时,可以提供20mA左右的驱动电流。输出为“0”时,可以吸收20mA左右的灌电流(最大为40mA)。 当连接的外围器件和电路需要大电流驱动或有大电流灌入时,应考虑使用功率驱动电路。3、输出电平转换的延时。AVR是一款高速单片机,当系统时钟为4M时,执行一条指令的时间为0.25us,这意
7、味着将一个I/O引脚置“1”,再置“0”仅需要0.25us,既输出一个脉宽为0.25us高电平脉冲。LED发光二极管的控制 LED发光二极管是一种经常使用的外围器件,用于显示系统的工作状态,报警提示等,用大量的发光二极管组成方阵,就是构成一个LED电子显示屏,可以显示汉字和各种图形,如体育场馆中的大型显示屏。下面设计一个带有一排8个发光二极管的简易彩灯控制系统。硬件电路设计: 发光二极管一般为砷化镓半导体。当电压U1大于U2约1V以上时,二极管导通发光。 当导通电流大于5mA时,人的眼睛就可以明显地观察到二极管的发光。一般导通电流不要超过10mA,否则将导致二极管的烧毁或I/O引脚的烧毁。导通
8、电流与限流电阻之间的关系由下面的计算公式确定: 下面给出一个简单的控制程序,其完成的功能是8个LED逐一循环发光1秒,构成“走马灯”。#include #include void main(void) char position = 0; / position为控制位的位置 PORTA=0 xFF; / PA口输出全1,LED全灭 DDRA=0 xFF; / PA口工作为输出方式 while (1) PORTA = (1= 8) position = 0; delayms(1000); 继电器控制 在工业控制以及许多场合中,嵌入式系统要驱动一些继电器和电磁开关,用于控制马达的开启和关闭,阀门的
9、开启和关闭等。 继电器和电磁开关需要功率驱动,驱动电流往往需要几百毫安,超出了AVR本身I/O口的驱动能力,因此在外围硬件电路中要考虑使用功率驱动电路。控制恒温箱的加热的硬件电路 恒温箱的加热源采用500W电炉,电炉的工作电压220v,电流2.3A。选用HG4200继电器,开关负载能力为5A/AC220V,继电器吸合线圈的工作电压5v,功耗0.36W,计算得吸合电流为0.36/5 = 72mA。因此,要能使继电器稳定的吸合,驱动电流应该大于80mA。该电流已经超出AVR本身 I/O口的驱动能力,因此外部需要使用功率驱动元件。LED数码显示器的应用 LED 数码显示器是单片机嵌入式系统中经常使用的显示器件。一个“8”字型的显示模块用“a、b、c、d、e、f、g、p” 8个发光二极管组合而成。 硬件电路设计: