STC8H系列单片机GPIO基础知识入门教程(一)

一、I/O口工作模式

IO口即输入输出口,STC8H系列单片机支持四种工作模式, 即准双向口、推挽输出、高阻输入、开漏输出,每个IO通过两个寄存器进行配置,如下图所示,注:n = 0,1,2,3,4,5,6,7。

PnM1

PnM0

I/O口工作模式

0

0

准双向口(弱上拉),灌电流可达20mA,拉电流150-270uA

0

1

推挽输出,强上拉输出,可达20mA,需加限流电阻

1

0

高阻输入,电流既不能流入也不能流出

1

1

开漏输出,内部上拉电阻断开

 PnM1和PnM0各一个字节八个bit,对应Pn.0 – Pn.7。

例:P0M0的第0位和P0M1的第0位组合起来配置P0.0口的模式。

1.1、准双向口

准双向口即可作为输入也可作为输出,一般用于按键检测、IO口时序控制等等。

摘自STC8H系列单片机技术参考手册

1.2、推挽输出 

推挽输出驱动电流可达20mA,一般用于驱动LED灯、蜂鸣器等。

摘自STC8H系列单片机技术参考手册 

1.3、高阻输入 

当I/O口配置为高阻输入工作模式时,没有片内上拉MOSFET、上拉电阻和下拉MOSFET,I/O端口引脚处于完全悬空状态。该工作模式最大好处是:把I/O口配置为高阻输入模式时,其消耗的输入电流主要由外置的上拉电阻确定,可以做的仅可能的低功耗,单片机自身I/O口处于高阻输入工作模式,消耗电流非常小。

当STC8系列单片机I/O口配置为高阻输入工作模式时,一定在对应I/O端口引脚上外置上拉电阻,保证I/O口输入电平的稳定。

高阻态情况下,IO口输入电阻很大,不容易干扰那些输出电阻较大、驱动能力弱的装置输出到IO口上的电平。

摘自STC8H系列单片机技术参考手册 

1.4、开漏输出 

该工作模式与准双向口和推挽输出工作模式最大的不同是:其无上拉MOSFET,即MOS管漏极处于断开状态; 开漏输出的好处就是可以方便调节输出电平,需要外接上拉电阻,调节上拉电阻的大小进而调节驱动电流大小;

开漏输出的这一特性另一个好处在于可以实现“线与”功能,所谓的“线与”指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现电流倒灌,损坏器件;

一般IIC总线上挂接多个从机,需要线与进行仲裁,所以IIC常常采用开漏输出,需要外接上拉电阻;IIC不同通信速率上升沿有不同的要求,调节上拉电阻大小进而改变上升沿的时间。

摘自STC8H系列单片机技术参考手册 

二、发光二极管 

发光二极管通常称为LED,不同颜色的LED正向导通电压不一样,如下为常规参考数据,实际以不同型号LED技术手册为准。

LED限流电阻计算方法:限流电阻 =(供电电压-正向电压)/正向电流,即R=(VCC-VF)/IF。

例:红色直插LED的正向电压为2.0V,正向电流为20mA,电源电压为5V,则 R=(5-2.0)/0.02=150Ω ,P=I*I*R=0.02*0.02*150=0.06 W< 0.25W (0805封装电阻功率)    所以采用150Ω/0805 电阻即可。

三、发光二极管控制电路

1、LED1、LED2、LED3、LED4均接3.3V单片机IO口;

2、采用推挽输出控制,高电平点亮LED,低电平熄灭LED;

3、为了降低LED的亮度,因此这里采用1K限流电阻,降低亮度。

 四、3.3V/5V不同电压IO互连处理

1、单片机工作在3.3V,需要直连5V外部器件,如果对应的I/O口作为输入,可在I/O口上串接一个隔离二极管,隔离高压部分,状态逻辑如下: a、当外部信号电压高于单片机工作电压二极管处于截止状态,I/O因内部上拉到高电平,所以单片机读取到I/O口状态为高电平; b、当外部信号电压为低时二极管导通,因为硅二极管导通压降一般为0.5-0.7V,I/O被钳位在0.5V-0.7V,小于0.8V时,单片机读取到I/O口状态为高电平;

参考电路如下:

摘自STC8H系列单片机技术参考手册 

2、单片机工作在3.3V,需要直连5V外部器件,如果对应的I/O口作为输出,可用一个NPN三极管隔离,参考电路如下:

摘自STC8H系列单片机技术参考手册 

 五、示例代码

#include "STC8H.h" //头文件,包含单片机寄存器和特殊寄存器地址的声明

#define	LED1	P41 //宏定义,预处理命令,相当于给指定的字符串起一个别名
#define	LED2	P73 //宏定义
#define	LED3	P72 //宏定义
#define	LED4	P71 //宏定义

/*主函数*/
void main(void)
{
	/*
	1字节=8位(1 byte = 8bit),c语言中这样表示进制:
	二进制前缀 0b或者0B
	十六进制前缀 0X或者0X
	如0x11 = 0b00010001
	*/
	P4M1 = 0X00; P4M0 = 0X02; //将P41设置为推挽输出模式
	P7M1 = 0X00; P7M0 = 0X0E; //将P71、P72、P73设置为推挽输出模式
	LED1 = 1; //P41设置为高电平,点亮LED1
	LED2 = 1; //P73设置为高电平,点亮LED2
	LED3 = 1; //P72设置为高电平,点亮LED3
	LED4 = 1; //P71设置为高电平,点亮LED4	
	while(1);
	/*
	while(1);的作用:
	大部分还是为了防止程序跑飞,因为很多时候执行完某段程序后单片机的
	程序指针PC(就是程序指针)并不会停止,仍然会继续从ROM中读取指令
	并执行,这样一来可能会出现程序跑飞的情况,进而出现不确定的结果,
	我们加个while(1)就能让程序在执行完后在原地循环,相当于停在原地,
	防止跑飞。
	*/
}

六、思考问题 

每个IO口电路结构上都会在GND和VCC上并联一个二极管,大家清楚这两个二极管的作用是什么吗?

摘自STC8H系列单片机技术参考手册 

作者:芯航路IOT

物联沃分享整理
物联沃-IOTWORD物联网 » STC8H系列单片机GPIO基础知识入门教程(一)

发表评论