合肥工业大学DSP及MSP430实验室MSP430单片机原理与应用第六章MSP430单片机的输入输出模块单片机中的输入/输出模块是供信号输入、输出所用的模块化单元。MSP430单片机的片内输入/输出模块非常丰富,典型的输入/输出模块有:通用I/O端口、模数转换模块、比较器、定时器与段式液晶驱动模块。本章重点讲述各典型输入/输出模块的结构、原理及功能,并针对各个模块给出简单的应用例程。通用IO端口(GPIO)6.1模数转换模块(ADC12)6.2比较器B(Comp_B)6.3定时器6.4LCD_C段式液晶驱动模块6.56.1通用IO端口6.1.1MSP430端口概述通用I/O端口是MSP430单片机最重要也是最常用的外设模块。通用I/O端口不仅可以直接用于输入/输出,而且可以为MSP430单片机应用系统提供必要的逻辑控制信号。MSP430F5xx/6xx系列单片机最多可以提供12个通用I/O端口(P1~P11和PJ),大部分端口有8个引脚,少数端口引脚数少于8个。每个I/O引脚都可以被独立地设置为输入或者输出引脚,并且每个I/O引脚都可以被独立地读取或者写入,所有的端口寄存器都可以被独立地置位或者清零。P1和P2引脚具有中断能力。从P1和P2端口的各个I/O引脚引入的中断可以独立地被使能,并且被设置为上升沿或者下降沿触发中断。所有P1端口的I/O引脚的中断都来源于同一个中断向量P1IV。同理,P2端口的中断源都来源于另一个中断向量P2IV。可以对每个独立的端口进行字节访问,或者将两个结合起来进行字访问。端口组合P1和P2、P3和P4、P5和P6、P7和P8可结合起来称为PA、PB、PC和PD端口。当进行字操作写入PA口时,所有的16位数据都被写入这个端口;利用字节操作写入PA端口低字节时,高字节保持不变;利用字节指令写入PA端口的高字节时,低字节保持不变。其他端口也是一样。当写入的数据长度小于端口的最大长度时,那些没有用到的位保持不变。应用这个规则来访问所有端口,除了中断向量寄存器P1IV和P2IV,它们只能进行字节操作。6.1通用IO端口6.1.2通用IO端口输出特性MSP430单片机在默认输出驱动(PxDS.y=0,即欠驱动强度)且单片机供电电压VCC为3V条件下,端口低电平和高电平的输出特性分别如图6.1.1和图6.1.2所示,其中,电流输入为正,输出为负。图6.1.1低电平输出特性(PxDS.y=0)图6.1.2高电平输出特性(PxDS.y=0)6.1通用IO端口6.1.2通用IO端口输出特性当PxDS.y控制位被配置为1时,即单片机端口被配置为强驱动模式。在强驱动模式下,端口的低电平和高电平输出特性分别如图6.1.5和图6.1.6所示。图6.1.5低电平输出特性(PxDS.y=1)图6.1.6高电平输出特性(PxDS.y=1)6.1通用IO端口6.1.3端口P1和P2端口P1和P2具有输入/输出、中断和外部模块功能,可以通过设置它们各自的9个控制寄存器来实现这些功能。下面所述Px代表P1和P2。1.输入寄存器PxIN输入寄存器是CPU扫描I/O引脚信号的只读寄存器,用户不能对其写入,只能通过读取该寄存器的内容获取I/O端口的输入信号,此时引脚的方向必须选定为输入。输入寄存器中某一位为0,表明该位输入为低;某一位为1,表明该位输入为高。2.输出寄存器PxOUT该寄存器为I/O端口的输出缓冲寄存器。其内容可以像操作内存数据一样写入,以达到改变I/O口输出状态的目的。在读取时,输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。0:输出为低;1:输出为高。6.1通用IO端口6.1.3端口P1和P23.方向寄存器PxDIR相互独立的8位分别定义了8个引脚的输入/输出方向。8位在PUC之后都被复位。使用输入或输出功能时,应先定义端口的方向,输入/输出才能满足设计者的要求。作为输入时,只能读;作为输出时,可读可写。0:输入模式;1:输出模式。4.上拉/下拉电阻使能寄存器PxREN该寄存器的每一位可以使能相应I/O引脚的上拉/下拉电阻。该寄存器需和输出寄存器配合使用,才能完成上拉/下拉电阻的配置。0:上拉/下拉电阻禁止;1:上拉/下拉电阻使能。5.输出驱动能力调节寄存器PxDSPxDS寄存器的每一位可使相关引脚选择全驱动模式和次驱动模式(减弱驱动能力)。默认的是次驱动模式。0:次驱动模式;1:全驱动模式。6.功能选择寄存器PxSELP1和P2端口还有其他片内外设功能,为了减少引脚,将这些功能与芯片外的联系通过复用P1和P2引脚的方式来实现。PxSEL用来选择引脚的I/O端口功能与外围模块功能。0:选择引脚为普通I/O功能;1:选择引脚为外围模块功能。6.1通用IO端口6.1.3端口P1和P27.中断使能寄存器PxIE该寄存器的8位与该端口的8个引脚一一对应,其中每一位用以控制相应引脚的中断允许。8.中断触发边沿选择寄存器PxIES如果允许Px口的某个引脚中断,还需定义该引脚的中断触发沿。该寄存器的8位分别定义了Px口的8个引脚的中断触发沿。9.中断标志寄存器PxIFG该寄存器有8个标志位,它们含有相应引脚是否有待处理中断的信息,即相应引脚是否有中断请求。如果Px的某个引脚允许中断,同时选择上升沿,则当该引脚发生由低电平向高电平跳变时,PxIFG的相应位就会置位,表明该引脚上有中断事件发生。6.1通用IO端口6.1.4端口P3~P11这些端口没有中断能力,其余功能与P1、P2端口一样,能实现输入/输出功能和外围模块功能。每个端口有6个寄存器供用户使用,用户可通过这6个寄存器对它们进行访问和控制。每个端口的6个寄存器分别为:输入寄存器(PxIN)、输出寄存器(PxOUT)、方向选择寄存器(PxDIR)、输出驱动能力调节寄存器(PxDS)、上拉/下拉电阻使能寄存器(PxREN)和功能选择寄存器(PxSEL)。具体用法同P1和P2端口。6.1通用IO端口6.1.5端口的应用端口是单片机中最经常使用的外设资源。一般在程序的初始化阶段对端口进行配置。配置时,先配置功能选择寄存器PxSEL,若为I/O端口功能,则继续配置方向寄存器PxDIR;若为输入,则继续配置中断使能寄存器PxIE;若允许中断,则继续配置中断触发沿选择寄存器PxIES。需要注意的是,P1和P2端口的中断为多源中断,即P1端口的8位共用一个中断向量P1IV,P2端口的8位也共用一个中断向量P2IV。当Px端口上的8个引脚中的任何一个引脚有中断触发时,都会进入同一个中断服务程序。在中断服务程序中,首先应该通过PxIFG判断是哪一个引脚触发的中断,再执行相应的程序,最后还要用软件清除相应的PxIFG标志位。6.1通用IO端口【例6.1.1】在MSP430单片机系统中,P1.5、P1.6、P1.7发生中断后执行不同的代码。#pragmavector=PORT1_VECTOR//P1口中断源__interruptvoidPort_1(void)//声明一个中断服务程序,名为Port_1(){if(P1IFG&BIT5)//判断P1中断标志第5位{……//在这里写P1.5中断服务程序}if(P1IFG&BIT5)//判断P1中断标志第6位{……//在这里写P1.6中断服务程序}if(P1IFG&BIT5)//判断P1中断标志第7位{……//在这里写P1.7中断服务程序}P1IFG=0;//清除P1所有中断标志位}6.1通用IO端口【例6.1.2】利用软件循环查询P1.4引脚的输入状态,若P1.4输入为高电平,则使P1.0输出高电平;若P1.4输入为低电平,则使P1.0输出低电平。该程序采用查询的方式检测按键是否被按下。为调试方便,P1.0引脚可接LED。#includemsp430f5529.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P1DIR|=BIT0;//设P1.0为输出方向while(1)//循环查询P1.4引脚输入状态{if(P1IN&BIT4)P1OUT|=BIT0;//如果P1.4输入为高,则使P1.0输出高elseP1OUT&=~BIT0;//否则,使P1.0输出低电平}}6.1通用IO端口【例6.1.3】利用按键外部中断方式,实现反转P1.0引脚输出状态。P1.4选择GPIO功能,内部上拉电阻使能,且使能中断。当P1.4引脚上产生下降沿时,触发P1端口外部中断,在中断服务程序中,反转P1.0端口输出状态。按键外部中断实时性较高,用途非常广泛,可以处理对响应时间要求比较苛刻的事件,在【例6.1.2】程序中,若主循环一次的时间比较长,P1.4引脚置位时间比较短,则有可能在一个主循环周期内漏掉一次或多次P1.4引脚置位事件。因此在这种情况下,若采用【例6.1.2】端口查询的方式,可能就无法满足设计的要求,应该采用按键外部中断的方式实现。#includemsp430f5529.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P1DIR|=BIT0;//设置P1.0引脚为输出P1REN|=BIT4;P1OUT|=BIT4;//以上两句组合功能为使能P1.4引脚上拉电阻P1IES|=BIT4;//P1.4中断下降沿触发P1IFG&=~BIT4;//清除P1.4中断标志位P1IE|=BIT4;//P1.4中断使能__bis_SR_register(LPM4_bits+GIE);//进入LPM4,并使能全局中断}#pragmavector=PORT1_VECTOR__interruptvoidPort_1(void){P1OUT^=BIT0;//反转P1.0端口输出状态P1IFG&=~BIT4;//清除P1.4中断标志位}6.2模数转换模块(ADC12)6.2.1模数转换概述在MSP430单片机的实时控制和智能仪表等实际应用系统中,常常会遇到连续变化的物理量,如温度、流量、压力和速度等。利用传感器把这些物理量检测出来,转换为模拟电信号,再经过模数转换模块(ADC)转换成数字量,模拟量才能够被MSP430单片机处理和控制。1.模数转换基本过程首先连续时间输入信号x(t)输入ADC的采样保持器中,ADC每隔Ts(采样周期)读出一次x(t)的采样值,对此采样值进行量化。量化的过程是将此信号转换成离散时间、离散幅度的多电平信号。从数学角度理解,量化是把一个连续幅度值的无限数集合映射到一个离散幅度值的有限数集合。在进行ADC转换时,必须把采样电压表示为某个规定的最小数量单位的整数倍,所取的最小数量单位叫做量化单位,用Δ表示。显然,数字信号最低有效位(LSB)的1所代表的数量大小就等于Δ。把量化的结果用代码表示出来,这个过程称为编码。这些代码就是ADC转换的输出结果。6.2模数转换模块(ADC12)2.ADC的位数ADC的位数为ADC模块采样转换后输出代码的位数。例如,一个12位的ADC模块,采样转换后的代码即为12位,表示数值的取值范围为0~4095。3.分辨率分辨率表示输出数字量变化的一个相邻数码所需输入模拟电压的变化量。它定义为转换器的满刻度电压与2n的比值,其中n为ADC的位数。因此,分辨率与ADC的位数有关。例如,一个8位ADC模块的分辨率为满刻度电压的1/256。如果满刻度输入电压为5V,该ADC模块的分辨率即为5V/256=20mV。分辨率代表了ADC模块对输入信号的分辨能力,一般来说,ADC模块位数越高,数据采集的精度就越高。4.量化误差量化误差是由于用有限数字对模拟数值进行离散取值(量化)而引起的误差。因此,量化误差理论上为一个单位分辨率,即1/2LSB。量化误差是无法消除的,但是,通过提高分辨率可以减少量化误差。6.2模数转换模块(ADC12)5.采样周期采样周期是每两次采样之间的时间间隔。采样周期包括采样保持时间和转换时间。采样保持时间是指ADC模块完成一次采样和保持的时间,转换时间是