MSP430课件3.3通用输入输出端口
- 格式:ppt
- 大小:537.50 KB
- 文档页数:28
实验一P3.3口输入,P1口输出一、实验目的1、掌握P3口、P1口简单使用2、学习Keil,Proteus软件使用二、实验说明本次实验用外中断1的中断方式控制P1口8位LED亮灭状态,即第一次按下S键时,8位LED点亮,再次按下S时,8位LED熄灭,如此循环。
三、实验线路图四、实验步骤1、先建立文件夹“ex1”,然后建立“ex1”工程项目,最后建立源程序文件“ex1.c”,输入如下源程序;/*******************************************实验1:P3.3输入,P1口输出******************************************///用外中断1的中断方式进行数据采集#include<reg51.h>sbit S=P3^3;/*******************************************函数功能:主函数******************************************/void main(void){EA=1;EX1=1;IT1=1;P1=0xff;while(1); //无限循环,防止程序跑飞}/**************************************************************函数功能:外中断T1的中断服务程序**************************************************************/void int1(void) interrupt 2 using 0{P1=~P1;}2、用Proteus软件仿真经过Keil软件编译通过后,可利用Proteus软件仿真。
在Proteus ISIS编辑环境中绘制仿真电路图。
打开配套实验1仿真原理图文件“ex1.DSN”,将编译好的“ex1.hex”文件载入AT89C51。
MSP430F5系列16位超低功耗单片机模块原理第7章IO 输入输出端口版本: 1.0日期: 2008.7.原文: TI slau208.pdf (5xxfamily User's Guide)翻译: 王浩武汉大学编辑: DC 微控技术论坛版主注:以下文章是翻译TI slau208.pdf 文件中的部分内容。
由于我们翻译水平有限,有整理过程中难免有所不足或错误;所以以下内容只供参考.一切以原文为准。
文章更新详情请密切留意微控技术论坛。
Page 1 of 12第七章IO 输入输出端口本章描述了数字IO接口的操作。
在所有的5系列MSP430单片机供了数字IO接口。
主题7.1 数字IO接口介绍7.2 数字IO接口的操作7.3 数字IO接口寄存器7.1 数字IO接口介绍5系列的MSP430最多可以提供12路数字IO接口,P1到P11和PJ。
大部分接口都有8个管脚,但是有些接口会少于8个管脚。
可以参考说明文档中关于接口的章节。
每个I/O管脚都可以独立的设置为输入或者输出方向,并且每个I/O接线都可以被独立的读取或者写入。
所有接口的寄存器都可以被独立的置位或者清零,就像设置驱动能力一样。
P1和P2接口具中断功能。
从P1和P2接口的各个I/O管脚引入的中断可以独立的被使能并且设置为上升沿或者下降沿出发中断。
所有的P1接口的I/O管脚的中断都来源于同一个中断向量P1IV,并且P2接口的中断都来源于另外一个中断向量P2IV。
在一些MSP430x5xx单片机中,附加的接口也具有中断功能。
详细说明请查阅芯片的说明文档。
每个独立的接口可以作为字节长度端口访问或者结合起来作为字长度端口进行访问。
端口配对P1/P2、P3/P4、P5/P6、P7/P8等联合起来分别叫做PA、PB、PC、PD等。
当进行字操作写入PA口时,所有的16为都被写入这个端口。
利用字节操作写入PA口的低字节时,高字节保持不变。
相似地,使用字节指令写入PA口高字节时,低字节保持不变。
输入输出端口输入寄存器:P1IN,P2IN输出寄存器:P1OUT,P2OUT方向寄存器:P1DIR,P2DIR功能选择寄存器:P1SEL,P2SEL1.PxIN、PxOUT、PxDIR、PxSELx为端口号。
IN为端口输入寄存器,OUT为端口输出寄存器,DIR为端口方向控制寄存器,SEL为端口第二功能选择寄存器。
举例:Moon=P1IN;//读端口P1的值,赋给变量MoonP3Out=5;//P3端口输出5P2DIR=0xF0;//P2端口的高4位为输出,低4位为输入P6SEL=0xF;//P6端口的高4位用作I/O端口,低4位用于第二功能P1OUT|=BIT0;//将P1口的最低位输出置1P1OUT&=~BIT7;//将P1口的最高位输出清0,P1口只有8位P1OUT=4;P1.2引脚输出高电平,P1其余引脚输出低电平;P1OUT|=4;P1.2置高电平,P1其余引脚不变;P1OUT&=~8;即P1OUT&=0xf7,P1.3置低电平,P1其余引脚不变;|是或运算符,&是与运算符,具体请参考C语言应用运算符部分!2.BITxx的取值范围为0~F。
代表寄存器的某一位。
其定义为:#define BIT0(0x0001)#define BIT1(0x0002)...#define BITE(0x4000)#define BITF(0x8000)BIT0为最低位,BITF为最高位。
MSP430是不支持位操作的,如果想对位操作,最好的方法就是通过位屏蔽来实现。
举例:P1OUT|=BIT0;//将P1口的最低位输出置1P1OUT&=~BIT7;//将P1口的最高位输出清0,P1口只有8位。
通用IO口3.2.1 IO口IO口是微处理器系统对外界沟通的最基本部件,从基本的键盘、LED到复杂的外设芯片等,都是通过IO口的输入输出操作来进行的。
在MSP430系列中,不同的单片机IO口数量不同。
体积最小的MSP430F20xx系列中只有10个IO口,适合在超小型设备中应用;功能最丰富的MSP430FG46xx系列中多达80多个IO 口,足够应付外部设备繁多的复杂应用。
在MSP430G2553单片机中,共有16个IO口,属于IO口较少的系列。
3.2.2 IO寄存器和大部分单片机类似,MSP430系列单片机也是将8个IO口编为一组。
每个IO口有四个控制寄存器,P1和P2还有额外的3个中断寄存器。
寄存器情况可参见表3.2。
PxDIR寄存器用于设置每一位的IO口方向MSP430单片机的IO口是双向IO口:0=输入 1=输出。
在使用IO口时首先要选择寄存器来设置每个IO口方向。
例如下面的语句:P1DIR |= BIT1+BIT3+BIT4;P1DIR |= ~(BIT5+BIT6+BIT7);以上语句将P1.1,P1.3和P1.4的方向置为输出,P1.5,P1.6和P1.7的方向置为输入。
PxDIR寄存器在复位的过程中会被清零,没有被设置的IO口方向均为输入状态,所以第二句可以省略。
注意,将未用的IO口置为输出可减小漏电流。
对于所有已经设成输出的IO口可通过PxOUT寄存器设置其输出电平;对于所有已经被设成输入的IO口,可通过PxIN寄存器读回其输入电平。
PxSEl寄存器用于设置每一位IO口的功能:0=普通IO口,1=第二功能。
在MSP430系列单片机中,很多内部功能模块也需要和外界进行数据交换,为了不增加芯片的管脚数量,大部分都和IO口管脚复用,这就导致MSP430系列单片机的大多数IO管脚都具有第二功能。
通过PxSEL可以指定某些IO口作为第二功能使用。
如MSP430G2553中P1.1和RXD,P1.2和TXD复用。
MSP430单片机的端口介绍MSP430的端口有P1、P2、P3、P4、P5、P6、S和COM(型号不同,包含的端口也不仅相同,如MSP430X11X系列只有P1,P2端口,而MSP430X4XX系列则包含全部上述端口),它们都可以直接用于输入/输出。
MSP430系统中没有专门的输入/输出指令,输入/输出操作通过传送指令来实现。
端口P1`P6的每一位都可以独立用于输入/输出,即具有位寻址功能。
常见的键盘接口可以直接用端口进行模拟,用查询或者中断方式控制。
由于MSP430的端口只有数据口,没有状态口或控制口,在实际应用中,如在查询式输入/输出传送时,可以用端口的某一位或者几位来传送状态信息,通过查询对应位的状态来确定外设是否处于“准备好”状态。
端口的功能。
(1)P1,P2端口:I/O,中断功能,其他片内外设功能如定时器、比较器;(2)P3,P4P5P6端口:I/O,其他片内外设功能如SPI、UART模式,A/D转换等;(3)S,COM端口:I/O,驱动液晶。
MSP430各端口具有丰富的控制寄存器供用户实现相应的操作。
其中P1,P2具有7个寄存器,P3~P6具有4个寄存器。
通过设置寄存器我们可以实现:(1)每个I/O位独立编程;(2)任意组合输入,输出和中断;(3)P1,P2所有8个位全部可以用作外部中断处理;(4)可以使用所以指令对寄存器操作;(5)可以按字节输入、输出,也可按位进行操作。
端口P1,P2的功能可以通过它们的7个控制寄存器来实现。
这里,Px代表P1或P2。
(1)PxDIR:输入/输出方向寄存器。
8位相互独立,可以分别定义8个引脚的输入/输出方向。
8位再PUC后都被复位。
使用输入/输出功能时,应该先定义端口的方向。
作为输入时只能读,作为输出时,可读可写。
0:输入模式;1:输出模式。
如:P1DIR|=BIT4; //P1.4输出,P2DIR=0XF0; //高4位输出,低4位输入。
(2)PXIN:输入寄存器,为只读寄存器。
目的1P3口、P1口简单使用。
2内容一、实验内容1P33口做输入口,外接一脉冲,每输入一个脉冲,P1口按十六进制加一。
2P1口做输出口,编写程序,使P1口接的8个发光二极管L1—L8按16进制加一方式点亮发光二极管。
二、实验说明1P1口是准双向口,它作为输出口时与一般的双向口使用方法相同,由准双向口结构可知:当P1口作为输入口时,必须先对它置高电平,使内部MOS管截止,因内部上拉电阻是20KΩ—40KΩ,故不会对外部输入产生影响。
若不先对它置高,且原来是低电平,则MOS管导通,读入的数据是不正确的。
2DELAY :MOV R6, #00HDELAY1:MOV R7, #80HDJNZ R7, $DJNZ R6, DELAY1查指令表可知MOV、DJNZ指令均需用两个机器周期,而一个机器周期时间长度为12/ 6.0MHZ,所以该段指令执行时间为:((80+1)×256+1)×2×(12÷6000000)=132.1ms四、实验步骤①P33用插针连至K1,P10—P17用插针连至L1—L8。
②从起始地址0540H开始连续运行程序(输入0540后按EXEC键)。
③开关K1每拨动一次,L1—L8发光二极管按16进制方式加一点亮。
〖LM〗程序ORG 0000HLJMP HA1SORG 1541HHA1S: MOV A,#00HHA1S1: JB P3.3,HA1S1MOV R2,#20HLCALL DELAYJB P3.3,HA1S1HA1S2: JNB P3.3,HA1S2MOV R2,#20HLCALL DELAYJNB P3.3,HA1S2INC APUSH ACC;CPL AMOV P1,APOP ACCAJMP HA1S1 DELAY: PUSH 02H DELAY1: PUSH 02H DELAY2: PUSH 02H DELAY3: DJNZ R2,DELAY3 POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND原理。
MSP430单片机输入与输出
MSP430 单片机的输入输出线绝大多数是服用的,除了个别的端口外,基
本上是8 为为一组,不同的型号的MSP430 的端口有所不同,就msp430F5438 而言,一共有11 个I/O 端口,其中除了第十一P11 的宽度是3 位以外,其他的端口全是8 为宽度,为了方便使用,分别命名为PA,PB,PC,,分别对应
P1,P2P3
值得注意的是MSP430F5438 单片机的P1 和P2 端口还具有申请中断的功能,而其他的端口则无此功能
每个端口都有控制开关,分别可以控制端口的方向,引脚的功能,每个端口
都有自己的输入输出寄存器,MSP430F5438 海域中断管理寄存器,他们分别决定端口的中断使能,中断有效边沿,和中断标志位
示例代码:
驱动实验板上的蜂鸣器
#include#include”for_5438_wjx.c”void delayms(int x){int i,j;for(i=0;iView Code 但是这个程序在板子上没有跑起来,所以还需要今后来改正~~~
今天因为点亮了led,所以蜂鸣器的程序也写出来了,这个程序出现错误的
原因是错以为蜂鸣器的VCC 是开发板自动接上去的,结果就忘记写这条代码put_P5DIR_BIT4(1); // 主电源P5.4 put_P5OUT_BIT4(1); //打开外设电源
加入代码后,蜂鸣器响了
示例代码:
#include#include”for_5438_wjx.c”void delayms(int x){int i,j;for(i=0;iView Codetips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
msp430io口的配置和使用msp430 io口的配置和使用一 I/O的简介1、各种复用和各种设置(可以作为简单IO功能也可以作各种第二功能;可控制为输入、输出、接上拉电阻、接下拉电阻、接受中断等各种情况);2、IO口常用寄存器有:PXDIR、PXIN、PXOUT、PXREN、PXSEL、PXDS;其中,X可以是1~8,也可以是A~D,因为P1、P2可以合称为PA。
例如(PAREN=0x0480)就等价于(P2REN=0x04、P1REN=0x80)。
IO口中断相关寄存器:PXIV、PXIFGX、PXIE、PXIES;由于IO 中断仅存在于P1口和P2口,因此X只能为1或2,而且不可以为A。
3、msp430f5529.h中定义了BIT0~BITF,方便用户进行位操作。
例如要设置P1.7和P2.2为输入,代码可如下:PADIR &= ~(BITA + BIT7)。
二 IO口常用寄存器配置1、PxDIR,Px口方向寄存器0 端口配置为输入(默认)1 端口配置为输入2、PxOUT,Px口输出寄存器(输入、输出两种模式)当IO口配置为输出模式时:0 输出低电平1 输出高电平当IO口配置为输入模式并且置高/ 置低使能时:0置低1置高3、PxIN,Px 口输入寄存器只读4、PxREN,Px口置高/ 置低使能寄存器0关闭置高/ 置低1使能置高/ 置低5、PxSEL,Px功能选择寄存器(IO中断只有在普通IO下才能使用)0普通的I/O(默认)1有连接外围电路的特殊用途6、PxDS,Px 口输出驱动能力寄存器(我都是用的默认)0减弱输出驱动能力(默认)1全力输出驱动能力三普通IO使用举例说明:本例程是流水灯加按键控制,每次S1按下,便在等待S2按下,否则,所有LED一直闪烁。
若无按键按下,则八盏灯以流水灯方式显示。
#include ;#define uint8_t unsigned char#define uint16_t unsigned int//********* 控制LED的IO口宏定义************* #define LED145678_PORT_DIRP1DIR#define LED145678_PORT_OUTP1OUT#define LED23_PORT_DIRP8DIR#define LED23_PORT_OUTP8OUT//************ LED的IO口宏定义 ************* #define LED1 0x01#define LED20x02#define LED30x04#define LED40x08#define LED50x10#define LED60x20#define LED70x40#define LED80x80#define LED_ALL0xFF//************ 按键的IO口宏定义************* #define BUTTON_S1(P1IN & BIT7)#define BUTTON_S2(P2IN & BIT2)//*********************************************** ***********//*函数: void delay(uint16_t x_ms)//*功能:延时程序//*参数: x_ms(单位:ms)//*返回:无//*备注:无//*********************************************** ***********void delay(uint16_t x_ms){uint16_t i=0,j=0;for(i=x_ms;i>;0;i--)for(j=110;j>;0;j--);}//*********************************************** ***********//*函数: void LED_Init()//*功能: LED的IO口方向初始化//*参数:无//*返回:无//*备注:无//*********************************************** ***********void LED_Init(){LED145678_PORT_OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);LED145678_PORT_DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;LED23_PORT_OUT &= ~(BIT1 + BIT2);LED23_PORT_DIR |= BIT1 + BIT2;}//*********************************************** ***********//*函数: void Board_ledOn(uint8_t ledMask)//*功能:打开输入的那盏灯//*参数: ledMask//*返回:无//*备注:无//**********************************************************void Board_ledOn(uint8_t ledMask){if (ledMask & LED1) LED145678_PORT_OUT |= BIT0; if (ledMask & LED2) LED23_PORT_OUT |= BIT1;if (ledMask & LED3) LED23_PORT_OUT |= BIT2;if (ledMask & LED4) LED145678_PORT_OUT |= BIT1; if (ledMask & LED5) LED145678_PORT_OUT |= BIT2; if (ledMask & LED6) LED145678_PORT_OUT |= BIT3; if (ledMask & LED7) LED145678_PORT_OUT |= BIT4; if (ledMask & LED8) LED145678_PORT_OUT |= BIT5; }//*********************************************** ***********//*函数: void Board_ledOff(uint8_t ledMask)//*功能:关闭输入的那盏灯//*参数: ledMask//*返回:无//*备注:无//*********************************************** ***********void Board_ledOff(uint8_t ledMask){if (ledMask & LED1) LED145678_PORT_OUT &= ~BIT0; if (ledMask & LED2) LED23_PORT_OUT &= ~BIT1;if (ledMask & LED3) LED23_PORT_OUT &= ~BIT2;if (ledMask & LED4) LED145678_PORT_OUT &= ~BIT1; if (ledMask & LED5) LED145678_PORT_OUT &= ~BIT2; if (ledMask & LED6) LED145678_PORT_OUT &= ~BIT3; if (ledMask & LED7) LED145678_PORT_OUT &= ~BIT4; if (ledMask & LED8) LED145678_PORT_OUT &= ~BIT5; }//*********************************************** ***********//*函数: void Board_ledToggle(uint8_t ledMask)//*功能:输入的那盏灯的状态取反//*参数: ledMask//*返回:无//*备注:无//*********************************************** ***********void Board_ledToggle(uint8_t ledMask){if (ledMask & LED1) LED145678_PORT_OUT ^= BIT0;if (ledMask & LED2) LED23_PORT_OUT ^= BIT1;if (ledMask & LED3) LED23_PORT_OUT ^= BIT2;if (ledMask & LED4) LED145678_PORT_OUT ^= BIT1; if (ledMask & LED5) LED145678_PORT_OUT ^= BIT2; if (ledMask & LED6) LED145678_PORT_OUT ^= BIT3; if (ledMask & LED7) LED145678_PORT_OUT ^= BIT4; if (ledMask & LED8) LED145678_PORT_OUT ^= BIT5; }//*********************************************** ***********//*函数: void main(void)//*功能:主函数//*参数:无//*返回:无//*备注:无//*********************************************** ***********void main(void){uint8_t LED = LED1; //定义变量LEDWDTCTL = WDTPW | WDTHOLD;//关闭看门狗LED_Init(); //初始化LED的IO口方向PADIR &= ~(BITA + BIT7); //将按键的IO口方向设为输入PAREN |=(BITA + BIT7); //置高/ 置低使能PAOUT |=(BITA + BIT7); //置高(类似于上拉)while(1){Board_ledOn(LED);delay(1000); //延时1s左右Board_ledOff(LED);LED = LED。