大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【03-延时函数演示流水灯】”,
这一篇中,笔者要给大家介绍如何用板子上的输入口来点动控制板子的输出。
所谓的点动控制,顾名思义就是:
当有输入信号的时候,让对应的板子输出ON;
当没有输入信号的时候,让对应的板子输出OFF;
我们先来看下板子输入输出IO口分布情况:
关于输入、输出引脚的软件配置,其实在上一讲的“SYK-0806-A2S1 工业自动化控制之【03-延时函数演示流水灯】”,
中就有介绍过,在“bsp_gpio.c”文件的“void GPIO_Config(void)”函数中配置Y00-Y05输出的时候,实际上同时也将X00-X07输入也配置好了:
- /************************ IO口配置 ****************************/
- void GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //结构定义
-
- //Y00
- GPIO_InitStructure.Pin = Y00_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(Y00_GPIO,&GPIO_InitStructure); //初始化
-
- //Y01
- GPIO_InitStructure.Pin = Y01_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(Y01_GPIO,&GPIO_InitStructure); //初始化
-
- //Y02
- GPIO_InitStructure.Pin = Y02_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(Y02_GPIO,&GPIO_InitStructure); //初始化
-
- //Y03
- GPIO_InitStructure.Pin = Y03_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(Y03_GPIO,&GPIO_InitStructure); //初始化
-
- //Y04
- GPIO_InitStructure.Pin = Y04_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(Y04_GPIO,&GPIO_InitStructure); //初始化
-
- //Y05
- GPIO_InitStructure.Pin = Y05_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(Y05_GPIO,&GPIO_InitStructure); //初始化
-
- //X00
- GPIO_InitStructure.Pin = X00_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X00_GPIO,&GPIO_InitStructure); //初始化
-
- //X01
- GPIO_InitStructure.Pin = X01_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X01_GPIO,&GPIO_InitStructure); //初始化
-
- //X02
- GPIO_InitStructure.Pin = X02_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X02_GPIO,&GPIO_InitStructure); //初始化
-
- //X03
- GPIO_InitStructure.Pin = X03_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X03_GPIO,&GPIO_InitStructure); //初始化
-
- //X04
- GPIO_InitStructure.Pin = X04_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X04_GPIO,&GPIO_InitStructure); //初始化
-
- //X05
- GPIO_InitStructure.Pin = X05_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X05_GPIO,&GPIO_InitStructure); //初始化
-
- //X06
- GPIO_InitStructure.Pin = X06_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X06_GPIO,&GPIO_InitStructure); //初始化
-
- //X07
- GPIO_InitStructure.Pin = X07_GPIO_PIN; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
- GPIO_Inilize(X07_GPIO,&GPIO_InitStructure); //初始化
-
- Y00 = OutputT_OFF;
- Y01 = OutputT_OFF;
- Y02 = OutputT_OFF;
- Y03 = OutputT_OFF;
- Y04 = OutputT_OFF;
- Y05 = OutputT_OFF;
- }
-
复制代码
同样,GPIO引脚分布也是在“bsp_gpio.h”文件中定义好了:
- #ifndef __BSP_GPIO_H__
- #define __BSP_GPIO_H__
-
- #include "GPIO.h"
-
- /****************** 输出GPIO ******************/
- //Y00 - Y05
- #define Y00 P37
- #define Y00_GPIO_PIN GPIO_Pin_7
- #define Y00_GPIO GPIO_P3
-
- #define Y01 P36
- #define Y01_GPIO_PIN GPIO_Pin_6
- #define Y01_GPIO GPIO_P3
-
- #define Y02 P35
- #define Y02_GPIO_PIN GPIO_Pin_5
- #define Y02_GPIO GPIO_P3
-
- #define Y03 P34
- #define Y03_GPIO_PIN GPIO_Pin_4
- #define Y03_GPIO GPIO_P3
-
- #define Y04 P33
- #define Y04_GPIO_PIN GPIO_Pin_3
- #define Y04_GPIO GPIO_P3
-
- #define Y05 P32
- #define Y05_GPIO_PIN GPIO_Pin_2
- #define Y05_GPIO GPIO_P3
-
- //X00 - X07
- #define X00 P12
- #define X00_GPIO_PIN GPIO_Pin_2
- #define X00_GPIO GPIO_P1
-
- #define X01 P13
- #define X01_GPIO_PIN GPIO_Pin_3
- #define X01_GPIO GPIO_P1
-
- #define X02 P14
- #define X02_GPIO_PIN GPIO_Pin_4
- #define X02_GPIO GPIO_P1
-
- #define X03 P15
- #define X03_GPIO_PIN GPIO_Pin_5
- #define X03_GPIO GPIO_P1
-
- #define X04 P16
- #define X04_GPIO_PIN GPIO_Pin_6
- #define X04_GPIO GPIO_P1
-
- #define X05 P17
- #define X05_GPIO_PIN GPIO_Pin_7
- #define X05_GPIO GPIO_P1
-
- #define X06 P54
- #define X06_GPIO_PIN GPIO_Pin_4
- #define X06_GPIO GPIO_P5
-
- #define X07 P55
- #define X07_GPIO_PIN GPIO_Pin_5
- #define X07_GPIO GPIO_P5
-
- #define Input_ON 0 //输入ON
- #define Input_OFF 1 //输入OFF
-
- #define OutputT_ON 1 //晶体管输出ON
- #define OutputT_OFF 0 //晶体管输出OFF
-
- void GPIO_Config(void);
-
- #endif
复制代码
接下来我们看输入部分的硬件电路:
输入部分采用了光耦隔离,在光耦的左边,X00即为外部输出信号,根据光耦控制的原理不难看出:
当X00悬空或输入高电平(24V)时,光耦未导通,此时IN00为高电平;
当X00输入低电平(0V)时,光耦导通,此时IN00为低电平;
再来看输出部分的硬件电路:
输出部分是由一个N-MOS管来实现,根据N-MOS管的控制逻辑:
当OUT00为低电平时,N-MOS管AO3400未导通,此时Y00输出为高电平;
当OUT00为高电平时,N-MOS管AO3400导通,此时Y00输出为低电平;
根据文章开头说的,我们本例要实现的控制逻辑,我们可以得到如下代码:
- void app_run(void)
- {
- //X00有信号,Y00输出低电平;反之,Y00输出高电平
- if(!X00)
- {
- Y00 = OutputT_ON;
- }
- else
- {
- Y00 = OutputT_OFF;
- }
- //X01有信号,Y01输出低电平;反之,Y01输出高电平
- if(!X01)
- {
- Y01 = OutputT_ON;
- }
- else
- {
- Y01 = OutputT_OFF;
- }
- //X02有信号,Y02输出低电平;反之,Y02输出高电平
- if(!X02)
- {
- Y02 = OutputT_ON;
- }
- else
- {
- Y02 = OutputT_OFF;
- }
- //X03有信号,Y03输出低电平;反之,Y03输出高电平
- if(!X03)
- {
- Y03 = OutputT_ON;
- }
- else
- {
- Y03 = OutputT_OFF;
- }
- //X04或X05有信号,Y04输出低电平;X04或X05都没有信号,Y04输出高电平
- if(!X04||!X05)
- {
- Y04 = OutputT_ON;
- }
- else
- {
- Y04 = OutputT_OFF;
- }
- //X06或X07有信号,Y05输出低电平;X06或X07都没有信号,Y05输出高电平
- if(!X06||!X07)
- {
- Y05 = OutputT_ON;
- }
- else
- {
- Y05 = OutputT_OFF;
- }
- }
复制代码
上述代码中,有几个“if(!X04||!X05)”这样的语句,这里有一点需要注意一下,那就是运算符的优先级问题,关于C语音中运算符的优先级我们可以看下表:
从上表中我们可以知道,一元运算符“!”的优先级要比逻辑运算符“||”的优先级高,
因此此处要判断“X04或X05有信号”时,可以写成“if(!X04||!X05)”,
当然咯,有时候大家搞不清楚运算符的优先级又懒得去查表的话,也可以多写个括号,写成“if((!X04)||(!X05))”。
程序编译OK后,直接下载即可,然后我们就可以动手试下效果了:
好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,
下一节笔者将给大家介绍“如何利用定时器来实现流水灯效果”,详见“SYK-0806-A2S1 工业自动化控制之【05-定时器控制的流水灯】”感谢大家的支持!
本章附件:
【STC15系列】SYK-0806-A2S1- 04-输入输出点动控制.rar
(57.91 KB, 下载次数: 1)
|