原创 MCS-51回顾之一 GPIO口

2013-5-14 12:53 1499 9 9 分类: MCU/ 嵌入式 文集: 单片机

 

单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。
⒈ 电源: 
         ⑴ VCC - 芯片电源,接+5V;
         ⑵ VSS - 接地端;

⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。

⒊ 控制线:控制线共有4根,
  ⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲
      ① ALE功能:用来锁存P0口送出的低8位地址
      ② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
  ⑵ PSEN:外ROM读选通信号。
  ⑶ RST/VPD:复位/备用电源。
       ① RST(Reset)功能:复位信号输入端。
       ② VPD功能:在Vcc掉电情况下,接备用电源。
  ⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。
       ① EA功能:内外ROM选择端。
       ② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。

我看完MCS-51的GPIO口之后,有如下结论:

P0 P1 P2 P3四组,每组八位的IO口,其中P0 P2 P3都有复用功能。

其中PO口的复用功能是可以做外部ROM或者外部RAM的数据总线/ 地址低位并行总线。

P2口的复用功能和P0很类似,但是没有数据总线的功能。他们在GPIO功能上也不是相同,P0口做输出的时候,是OD输出(无法输出高电平),所以需要外接上拉电路,虽然麻烦,但是带来一个新的好处就是可以自己设定上拉的电平高度,不一定和VDD一样了,可高一些;至于接的上拉电阻大小,这就根据你需要的sink和source current确认一下,一般工程上接个10K电阻就好了。对于P1口就是最纯粹的GPIO口(准双向口),在这个地方,值得注意的是,在所有IO口作输入时,总要先通过内部总线向锁存器写入“1”,使得输入引脚不至于被钳制在低电平(这个看看IO口内部结构分析一下就可以知道)。有的知识点提到我们读取引脚数据的方式有两种,一种是直接读引脚,还有一种是读锁存器的数据,两种方式有一些差别,对于某一个Pin长期输入来说,无需每次都对锁存器赋值,直接读引脚就好了;而对于某个引脚先读数据再在cpu处理完了再输出给这个引脚,这个方式的话就采用读锁存器的方式。最后讲一下P3口,P3口是MCS-51外设的复用口,包含串口、外部中断、定时器和外部RAM控制。

下面举几个例子来小试牛刀一下:

P3=0xfd;

delay

 

**************************************************

联系我们熟悉32位单片机STM32。

STM32的每个GPIO口都可以编程,和51一样,都不能位寻址;STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR

目前我们使用模式寄存器和数据寄存器就可以实现简单的GPIO口控制功能。

首先,开系统时钟和对应的外设时钟,然后复位所需的IO口的模式配置,复位结束之后进行置位,这里要提到一点的是,对数据寄存器的操作可以直接赋值寄存器,还可以使用一种叫做位带操作的方式,类似于位寻址;这个比较方便。

/*初始化GPIO设置,为所需要的模式*/

GPIOC->CRL&=0XFFFFFFF0;//Clear PORTC.0 Seting

GPIOC->CRL|=0X0000003;//设置为推挽输出

GPIOC->ODR=1<0; //PC.0初始化为逻辑1

 

/*位带操作宏定义*/

#define LED0 PCout(0)// PC0

#define LED1 PDout(2)// PD2

 

PS:那有几个问题想提出来:

1.Q:单片机复位后,IO口是什么状态?

  A:据我的理解,51单片机复位后IO默认为输出模式,各个引脚的状态因为芯片内部结构已经固化死了,所以都是确定的,可以看内部结构分析得到。

2.Q:51单片机GPIO使用前不需要进行配置或者设置吗?

  A:输入前必须先写入逻辑1,再进行读取,至于AFIO,接下来会仔细分析...

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条