第6章 通用IO接口的基本结构与输出应用_第1页
第6章 通用IO接口的基本结构与输出应用_第2页
第6章 通用IO接口的基本结构与输出应用_第3页
第6章 通用IO接口的基本结构与输出应用_第4页
第6章 通用IO接口的基本结构与输出应用_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第6章通用I/O接口基本结构与输出应用2ATmega16芯片有PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4组8位,共32路通用I/O接口,分别对应于芯片上32根I/O引脚。所有这些I/O口都是双(有的为3)功能复用的。

其中第一功能均作为数字通用I/O接口使用,复用功能则分别用于中断、时钟/计数器、USRAT、I2C和SPI串行通信、模拟比较、捕捉等应用。引言

3I/O口的基本结构

每组I/O口配备三个8位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。I/O口的工作方式和表现特征由这3个I/O口寄存器控制。4方向控制寄存器DDRx用于控制I/O口的输入输出方向,即控制I/O口的工作方式为输出方式还是输入方式。当DDRx=1时,I/O口处于输出工作方式。

当PORTx=1时,I/O引脚呈现高电平,同时可提供输出20mA的电流;而当PORTx=0时,I/O引脚呈现低电平,同时可吸纳20mA电流。5当DDRx=0时,I/O处于输入工作方式

此时引脚寄存器PINx中的数据就是外部引脚的实际电平,通过读I/O指令可将物理引脚的真实数据读入MCU。此外,当I/O口定义为输入时(DDRx=0),通过PORTx的控制,可使用或不使用内部的上拉电阻。6表6.1是AVR通用I/O端口的引脚配置情况

表中的PUD为寄存器SFIOR中的一位,它的作用相当AVR全部I/O口内部上拉电阻的总开关。当PUD=1时,AVR所有I/O内部上拉电阻都不起作用(全局内部上拉无效);而PUD=0时,各个I/O口内部上拉电阻取决于DDRXn的设置。7(1).使用AVR的I/O口,首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。

(2)当I/O工作在输入方式,要读取外部引脚上的电平时,应读取PINxn的值,而不是PORTxn的值。

(3)当I/O工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。

(4)一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn的值。8I/O端口寄存器PA口寄存器—PORTA、DDRA、PINA各个位的具体定义9

正确使用AVR的I/O口要注意:(1)先正确设置DDRx方向寄存器,再进行I/O口的读写操作。(2)AVR的I/O口复位后的初始状态全部为输入工作方式,内部上拉电阻无效。所以,外部引脚呈现三态高阻输入状态。(3)用户程序需要首先对要使用的I/O口进行初始化设置,根据实际需要设定使用I/O口的工作方式(输出还是输入),当设定为输入方式时,还要考虑是否使用内部的上拉电阻。(4)在硬件电路设计时,如能利用AVR内部I/O口的上拉电阻,可以节省外部的上拉电阻。AVR通用I/O端口的主要特点双向可独立位控的I/O口ATmega16的PA、PB、PC、PD四个端口都是8位双向I/O口,每一位引脚都可以单独的进行定义,相互不受影响。如用户可以在定义PA口第0、2、3、4、5、6位用于输入的同时定义第1、7位用于输出,互不影响10AVR通用I/O端口的主要特点Push-Pull大电流驱动每个I/O口输出方式均采用推挽式缓冲器输出,提供大电流的驱动,可以输出(吸入)20mA的电流,因而能直接驱动LED显示器。可控制的引脚内部上拉电阻每一位引脚内部都有独立的,可通过编程设置的,设定为上拉有效或无效的内部上拉电阻。当I/O口被用于输入状态,且内部上拉电阻被激活(有效)时,如果外部引脚被拉低,则构成电流源输出电流(uA量级)。11AVR通用I/O端口的主要特点DDRx可控的方向寄存器。AVR的I/O端口结构同其它类型单片机的明显区别是,AVR采用3个寄存器来控制I/O端口。一般单片机的I/O仅有数据寄存器和控制寄存器,而AVR还多了一个方向控制器,用于控制I/O的输入输出方向。由于输入寄存器PINx实际不是一个寄存器,而是一个可选通的三态缓冲器,外部引脚通过该三态缓冲器与MCU的内部总线连接,因此,读PINx时是读取外部引脚上的真实和实际逻辑值,实现了外部信号的同步输入。这种结构的I/O端口,具备了真正的读-修改-写(Read-Modify-Write)特性。1213C语言中的位操作

a|b–-按位或

这个表达式指示中a被表达式中的b按位进行或运算这惯用于打开某些位尤其常用|=的形式例如

PORTA|=0x80;//打开位7(最高位)

a&b–-按位与

这个运算在检查某些位是否置1时有用例如

If((PORTA&0x81)==0)//检查位7和位0注意圆括号需要括在&运算符的周围因为它和==相比运算优先级较低这是C程序中很多错误的原因之一

a^b–-按位异或

这个运算对一个位取反有用例如在下面的例子中位7是被翻转的

PORTA^=0x80;//翻转位7

~a–-按位取反

在表达式中这个运算执行一个取反当用按位与运算关闭某些位时与这个运算组合使用尤其有用如

PORTA&=~0x80;//关闭位7

14PORTC

|=(1<<BIT0)|(1<<BIT3);

1<<(BIT0)表示逻辑1左移到PORTC

的D0位,结果为0b00000001;1<<(BIT3)表示逻辑1左移PORTC

的D3位,结果为0b00001000。0b00000001在同0b00001000相或,结果为0b00001001。

PORTD^=BIT(PD7)PORTD口的第7位取反/,取反PD0引脚,TCCR0|=(1<<CS01)|(1<<CS00);TCCR0功能寄存器的CS01、CS00位置1。15通用数字I/O口的设置与编程1.通用I/O输出设计要点

应用I/O口输出时,在系统的软硬件设计上应注意的问题有:

输出电平的转换和匹配。

输出电流的驱动能力。

I/O口输出为“1”时,可以提供20mA左右的驱动电流。输出为“0”时,可以吸收20mA左右的灌电流(最大为40mA)。输出电平转换的延时。应用举例:LED发光二极管的控制设计一个带有一排8个发光二极管的简易彩灯控制系统16硬件电路设计

当电压U1大于U2约1V以上时,二极管导通发光。当导通电流大于5mA时,人的眼睛就可以明显地观察到二极管的发光,导通电流越大,亮度越高。

AVR的I/O口输出“0”时,可以吸收最大40mA的电流,因此采用控制发光二极管负极的设计比较好。17#include<mega16.h>#include<delay.h>voidmain(void){unsignedcharposition=0; //position为控制位的位置PORTA=0xFF; //PA口输出全1,LED全灭DDRA=0xFF; //PA口工作为输出方式while(1){ PORTA=~(1<<position); if(++position>=8)position=0; delay_ms(1000);}}18应用举例:继电器控制控制恒温箱的加热的硬件电路设计

恒温箱的加热源采用500W电炉,电炉的工作电压220v,电流2.3A。选用HG4200继电器,开关负载能力为5A/AC220V,继电器吸合线圈的工作电压5v,功耗0.36W,计算得吸合电流为0.36/5=72mA。因此,要能使继电器稳定的吸合,驱动电流应该大于80mA。该电流已经超出AVR本身I/O口的驱动能力,因此外部需要使用功率驱动元件。I/O引脚输出“1”时,三极管导通,继电器吸合,电炉开始加热。I/O引脚输出“0”时,三极管截止,继电器释放,加热停止。19PORTC

|=(1<<

PORTC0)//PORTC位置1。继电器吸合,电炉开始加热。PORTC&

=~(1<<

PORTC0)PORTC&

=

~0x80//PORTC位置0。继电器释放,加热停止。

20应用举例:步进电机控制21硬件电路22程序#include<mega16.h>#include<delay.h>Flashunsignedcharstep[6]={0x04,0x06,0x02,0x03,0x01,0x05};voidmain(void){chari=0; intdelay=500;PORTA=0x00;DDRA=0x07; //PA口工作为输出方式

while(1){ PORTA=step[i]; // if(++i>=6)i=0; delay_ms(delay);};}23AVRI/O端口应用实例-7段LED显示器

在单片机系统中,常用的显示器有:○发光二极管显示器,简称LED(LightEmittingDiode);○液晶显示器,简称LCD(LiquidCrystalDisplay);○荧光管显示器,简称CRT。近年来也开始使用简易的CRT接口,显示一些汉字及图形。24LED显示器

◎前二种显示器都有两种显示结构:段显示(7段,“米”字型等)和点阵显示(5×7,5×8,8×8点阵等)。而发光二极管显示又分为固定段显示和可以拼装的大型字段显示,此外还有共阳极和阴极之分等。◎三种显示器中,以荧光管显示器亮度最高,发光二极管次之,而液晶显示器最弱,为被动显示器,必须有外光源。◎限于篇幅,我们介绍7段LED显示器。25一、LED段显示器结构与原理

LED显示器是单片机应用系统中常用的价廉输出设备。它是由若干个发光二极管组成的,当发光二极管导通时,相应的一个点或一个笔画发亮。控制不同组合的二极管导通,就能显示出各种字符。发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的称为共阴极显示器。26一、LED段显示器结构与原理

○对于共阴极LED,欲点亮的段在字节中所处的位为“1”,○对于共阳极LED,欲点亮的段在字节中所处的位为“0”,○例如:显示字符5,共阴极字型码为01101101B(6DH),共阳极字型码为10010010B(92H)。

27LED共阴/共阳段选编码表

显示字符共阴极字型码共阳极字型码显示字符共阴极字型码共阳极字型码0

3FH

C0H

c

39HC6H

1

06H

F9HD

5EHA1H

2

5BH

A4HE

79H86H

3

4FH

B0H

F

71H8EH

4

66H

99H

P

73H8CH

5

6DH

92HU

3EHC1H

6

7DH

82H

I

31HCEH

7

07H

F8H

Y

6EH91H

87FH

80HH

76H89H9

6FH

90H

L

38HC7H

A

77H

88H

“灭”

00HFFH

b

7CH

83H

28二、

LED显示器显示方式

LED显示器有静态显示和动态显示两种显示方式,分述如下:1.LED静态显示方式所谓静态显示,就是当显示器显示某一个字符时,相应的发光二极管恒定地导通或截止,例如七段显示器的a,b,c,d,e,f导通,g截止,显示0。这种显示方式每一位都需要有一个8位输出口控制。29

多位显示器的接口逻辑。如图所示

◎优点:编程容易,管理简单,亮度较高,◎缺点:占用口线资源较多。

1、LED静态显示方式302.LED动态显示方式

※动态显示—就是一位一位地轮流点亮显示器各个位(扫描),对于显示器的每一位来说,每隔一段时间点亮一次。○显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参数,可实现亮度较高较稳定的显示。

31

※多位7段LED动态显示器电路在多位LED显示时,为了简化硬件电路,通常将所在位段选线相应地并联在一起,由一个(7段LED)8位I/O口控制,形成段线的多路复用。而各位的共阳极或共阴极分别由相应的I/O口线控制,实现各位的分时选通。

2.LED动态显示方式32

2.LED动态显示方式

扫描显示方式,即在某一时刻,只让某一位的位选线处于选通状态,而其它各位的位选线处于关闭状态,同时,段选线上输出相应位要显示字符的字型码,这样同一时刻,6位LED中只有选通的那一位显示出字符,而其它三位则是熄灭的。由于人眼有视觉暂留现象,只要每位显示间隔足够短,则可造成多位同时亮的假象,达到显示的目的。33LED显示器接口技术

※要使LED显示器显示出字符,必须提供段选码和位选码。◎段选码(即字码)可以用硬件译码的方法获得,也可以用软件的方法获得。◎位选码静态显示和动态显示。下面介绍软件译码显示器接口方法。34一、静态显示接口35一、静态显示接口

1.静态显示器硬件电路是一个采用串行传送数据的8位数码管静态显示接口。设计中将8片八位串行输入/并行输出移位寄存器74HC164串接,数码管为共阳极型。

MCU将8个要显示字符的段码字准备好,通过DataOut引脚,在ClkOut引脚产生的cp移位脉冲的作用下,一位一位地移入74HC164的QA-QH端(串行输入)。QA-QH的输出(并行输出)直接作为数码管的段位控制。由于左边74HC164芯片的QH(最低位)和右边74HC164芯片的数据串入端连接,经过ClkOut时钟线64个cp脉冲后,要显示的8个字符将会在8个数码管上显示,最先发送的显示字符段码将显示在最右边。

36二、动态显示接口37二、动态显示接口在任何一个时刻,PC0-PC5中只能有一个I/O口输出低电平,即只有一位数码管亮。MCU必须循环轮流控制PC0-PC5中的一位输出“0”,同时PA口要输出该位相应的段码值。即使显示的内容没有变化,MCU也要进行不停的循环扫描处理。38二、动态显示接口软件的设计应保证从在外表看数码管显示的效果要连续(即在人眼里各个数码管全部亮),亮度均匀,同时没有拖尾现象。为了保证各个数码管的显示的效果不产生闪烁情况,表象上全部点亮的话,则首先必须在1秒中内循环扫描6个数码管的次数应大于25次,这里是利用了人眼的影像滞留效应。本例中我们选择40次,既每隔1000/40=25ms将6个数码管循环扫描一遍。第二要考虑的是,在25ms时间间隔中,要逐一轮流点亮6个数码管,那么每个数码管点亮的持续时间要相同,这样亮度才能均匀。第三个要考虑的要点为每个数码管点亮的持续时间,这个时间长一些的话,数码管的亮度高一些,反之则暗一些。通常,每个数码管点亮的持续时间为1-2ms。我们将每个数码管的点亮持续时间定为2ms,那么6个数码管扫描一遍的时间为12ms,因此MCU还有13ms的时间处理其它事件39二、动态显示接口#include<mega16.h>#include<delay.h>charled_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};charposition[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//任何时刻只有一个管亮,即只有一个I/O口输出为低voiddisplay(void)//扫描显示函数,执行时间12ms{chari;for(i=0;i<=5;i++){PORTA=led_7[dis_buff[i]];PORTC=position[i];delay_ms(2);//(2)PORTC=0xff;//(3)}}40voidtime_to_disbuffer(void)//时间值送显示缓冲区函数{unsignedchari,j=0;for(i=0;i<=2;i++) { dis_buff[j++]=time[i]%10; dis_buff[j++]=time[i]/10; }}voidmain(void){PORTA=0x00; //PORTA初始化

DDRA=0xFF;PORTC=0x3F; //PORTC初始化

DDRC=0x3F;time[2]=23;time[1]=58;time[0]=55; //时间初值23:58:55time_to_disbuffer();41while(1){ display(); //显示扫描,执行时间12ms if(++time_counter>=40) { time_counter=0; //(4)

point_on=~point_on; //(5)

if(++time[0]>=60) { time[0]=0; if(++time[1]>=60) { time[1]=0; if(++time[2]>=24)time[2]=0; } } time_to_disbuffer(); }delay_ms(13); //延时13ms,可进行其它处理(6)

}}42点阵LED显示器点阵LED在许多产品中也是经常使用的一种外围设备,如电梯中的运行指示,公交汽车里的站名广告显示,以及大型的电子广告牌等。这种LED的优点是可以通过点阵的形式显示汉字、图形等。实际上,PC的显示屏、手机显示屏等,在上面显示汉字、图形的原理都是点阵显示的方法。43点阵LED显示器8*8点阵LED一般是一个方型的器件,由8行*8列共64个LED发光二极管组成。44点阵LED显示器8*8点阵LED的显示控制方式与LED数码管的显示方式类似,也是使用动态扫描的工作方式。上箭头“↑”的码表45点阵LED显示器Col+PA口输出值1(PA7)2(PA6)3(PA5)4(PA4)5(PA3)6(PA2)7(PA1)8(PA0)Row(-)1(PC0)●0x102(PC1)●●●0x383(PC2)●●●●●0x7C4(PC3)●●●●●●●0xFE5(PC4)●●●0x386(PC5)●●●0x387(PC6)●●●0x388(PC7)●●●0x3846点阵LED显示器flashcharchar_7[8]={0x10,0x38,0x7C,0xFE,0x38,0x38,0x38,0x38};voiddisplay(charrow){chari;for(i=0;i<=7;i++){if(row<=7)PORTA=char_7[row];elsePORTA=0;PORTC=~(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论