一、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系列单片机技术参考手册 文章来源地址https://www.toymoban.com/news/detail-851111.html
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上并联一个二极管,大家清楚这两个二极管的作用是什么吗?
文章来源:https://www.toymoban.com/news/detail-851111.html
摘自STC8H系列单片机技术参考手册
到了这里,关于STC8H系列单片机入门教程之GPIO基本知识(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!