单片机_IO口知识点介绍

2019-04-15 17:45发布

单片机_IO口知识点介绍

IO/GPIO
  General Purpose Input Output (通用输入/输出)简称为GPIO,GPIO口作为单片机与外界通信控制最主要的手段,开始GPIO的学习也是最重要的部分,这里内部的电路原理就不详细深究了,只是简单的介绍一下项目开发过程中需要注意的问题和一些不同单片机之间的区别点。部分是单片机学习中经常搞混的的地方,阅读需要一定的C语言和单片机编程基础。 理论篇 单片机I/O中的1和0
  数字电路中只有两种电平:高和低,51位TTL电平:高 +5V,低 -5V,(也有单片机电平工作高低电平位±3.3V)
单片机I/O中的输入和输出
  对单片机的控制,实际上就是对I/O口的控制,I/O口每个引脚都有不同的输入输出模式,但是不同类型的单片机结构不同,比如51单片机是不用设置输入和输出模式的(并不是没有,而是自动变换),而不需要程序中去配置,但是STM32在读取或者输入的时候,必须对引脚设置为对应的输入输出功能。
  这里对比STM32的8种输入输出模式简单的说明。
  输入模式
  这里输入模式分成了四种情况,上拉、下拉、模拟、浮空,这里使用表格整理一下
不同输入模式之间的区别 模式 对比51单片机 外部输入0 外部输入1 没有I/O输入 应用 上拉 有 0 0 1 按键中使用,按键一端接VCC,一端接IO口,当按键没有按下的时候电平为低电平,当按键按下的时候IO是高电平电平。 下拉 有 0 1 0 按键中使用,按键一端接地,一端接IO口。当按键没有按下的时候电平为高电平,当按键按下的时候IO是低电平。 浮空 无 0 1 无信号,读不出电平状态 在信号采集方面,比如在读取方波 模拟 AD接口 保留输入的电压值,一般是ADC,后同 一般是ADC   输出模式
  输出模式分为四种。通用开漏输出模式、通用推挽输出模式、复用开漏输出模式、复用推挽输出模式
  推挽模式:增大电流输出能力,适合快速的切换高低电平。一般可以控制继电器或者LED灯。
  开漏模式:外部不加上上拉电阻,默认输出低电平。此模式主要驱动能力不足,需要借助外部上拉电阻完成对外驱动。51单片机的P0口使用就类似开漏输出模式(实际上P0口属于真正的双端口IO)。
  复用输出一般来源于单片机上的外设,例如IIC和SPI等。
  详细理解GPIO口的各种工作模式的工作原理和对比参考以下博主整理:
  https://blog.csdn.net/a514371309/article/details/78461454
  https://blog.csdn.net/techexchangeischeap/article/details/72569999
单片机I/O中的频率
  这里按照STM32 GPIO口的引脚速度解释,GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO 引脚速度,在输出情况下,可以理解成输出驱动电路可以不失真地通过信号地最大频率,如果超过这个频率,就可能会信号失真,且你频率设置地越高,噪声越大,功耗越大,所以最好是和应用相匹配。
实战篇   这里对比一下STC89C52控制LED灯和STM32F103控制LED灯的实战代码。 #include void main() { P1=0xfe;   //控制第一个LED灯亮,说明一下为什么只有第一灯亮了,0xfe转换成 //二进制是11111110,而为为什么LED灯给低电平才会亮,是因为LED灯是 //共阳极(单片机灌点流能力较强,输出电流较弱,所以一般都是共阳极) While(1);//这里只是让程序在这无线循环,因为不是所有单片机底层都是 //无限循环执行main()函数的,而且加上防止程序跑飞。 } 郭天祥单片机LED灯原理图
    郭天祥单片机LED灯原理图 //下面对比32的GPIO口操作,同样是控制LED灯。 int main(void) { delay_init(); //延时函数初始化 LED_Init(); //初始化与LED连接的硬件接口,见下,初始高电平,不亮 while(1) { LED0=0; //亮 delay_ms(300); //延时300ms LED0=1; //灭 delay_ms(300); //延时300ms } } // delay_init(); 函数是原子延时函数初始化,用户直接使用。 // #define LED0 PBout(5) // PB5 这个属于宏定义,告诉编译器所有的LED0都用PBout(5)代替, //而PBout(5)值得就是PB5,再具体就是对OI口的位操作,具体见正点库。 //这里详细说一下LED_Init();
void LED_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB); //使能PB端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //一般LED设置为推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //该GPIO口初始化同一组的一个或者多个IO口的工作方式和 //速度,这里根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_5); //设置某个IO口输出为高电平(1)这里PB.5 输出高 }
  这里IO口的使用,涉及到时钟,初始化等配置,建议初学者先清楚IO的工作原理,入手STM32时参考正点原子的STM32教程。   像这些类似于控制LED灯对GPIO口一般还应用于各种传感器的通断控制,蜂鸣器等,单片机所有的操作都是基于IO口的操作,电子世界追究到底也都是0和1,楼主之前一直在想,所有的数字都可以转换成二进制即0和1,但是我们周围还有电压电流声音等等,这些我们把他统称为模拟量,模拟量是不能在不同的单片机之间收发的,所以先辈们先把模拟量转化成数字量(AD),数字量是可以发送的,然后再把数字量转化成模拟量(DA),剩下的就只有0和1了。非0即1,非错即对,非阴即阳,直到有一天,量子被发现了。。。。。。   皮一下!
在这里插入图片描述 欢迎交流,一起进步。