汉扬编程 编程大纲 输入输出的上升沿和下降沿是怎么来的,一起看看

输入输出的上升沿和下降沿是怎么来的,一起看看

高电平、低电平、上升沿和下降沿的区别

输入输出的上升沿和下降沿是怎么来的,一起看看

数字电路中,电平从低电平(逻辑信号为0)变为高电平(逻辑信号为1)的那一瞬间叫作上升沿,电平从高电平(逻辑信号为1)变为低电平(逻辑信号为0)的那一瞬间叫作下降沿。

输入输出的上升沿和下降沿是怎么来的,一起看看

高电平触发,是指I/O口电平为高电平时相应的功能或执行程序一直有效,直到电平被拉为低电平才失效。上升沿触发是当信号从低电平变为高电平时的瞬间有效,不管后面再变为高电平或低电平都无效。

输入输出的上升沿和下降沿是怎么来的,一起看看

低电平触发,是指I/O口电平为低电平时相应的功能或执行程序一直有效,直到电平被拉为高电平才失效。下升沿触发是当信号从高电平变为低电平时的瞬间有效,不管后面再变为低电平或高电平都无效。

输入输出的上升沿和下降沿是怎么来的,一起看看

数字电路中的“1”和“0”指的就是电平的高低

输入输出的上升沿和下降沿是怎么来的,一起看看

这种电平触发方式在数字电路的应用上最为常见,在工业自动化应用的控制程序上也很常见。我们最为熟悉的就是PLC在编写程序时用到的上升沿和下降沿指令,这些指令是集成在PLC内部的程序块。如果我们不选择PLC作为控制部件,而是要用单片机来控制,那么上升沿和下降沿的功能我们该如何实现?单片机内部是没有这些编辑好的程序块的,要实现这个功能就必须自己编写程序。程序该如何编写,下面我们结合程序深入地来讲一讲这个问题。

输入输出的上升沿和下降沿是怎么来的,一起看看

图1

首先,程序中使用的变量定义如图1。

图2

主程序如图2。

图3

输入上升沿、输入下降沿是如何通过程序产生的,如图3。

图4

输出上升沿、输出下降沿是如何通过程序产生的,如图4。

以上只演示了输入、输出IO口的上升沿和下降沿产生的过程。如果我们需要用到其他"位变量"的上升沿或下降沿,同样可以用这种方式实现。

下面我把完整的程序附在后面,有需要的老铁们可以复制出来使用/***********************实现上升沿下降沿的程序源代码*************************/

#include <STC15F2K60S2.H>

#define FOSC 24000000L

void get_input(); //输入函数

void out_output(); //输出函数

char underedge, uperedge; //输入上升沿、下降沿变量

char out_underedge, out_uperedge; //输出上升沿、下降沿变量

char inputimg = 0, outputimg = 0; //输入、输出映像变量

char inputimgtmp = 0, outputimgtmp = 0; //输入、输出临时映像变量

void main()

{

while(1)

{

underedge = 0; uperedge = 0; //输入上升沿清除。因为每扫描一次上升沿都

//会被复位,所以上升沿的持续时间是一个扫

//描周期。

get_input();

if(uperedge & 0x1) //检测是否有输入上升沿出现,有则执行流程程序。

{

//此处编写流程处理程序

}

if(underedge & 0x1) //检测是否有输入下降沿出现,有则执行流程程序。

{

//此处编写流程处理程序

}

outputimg |= 0x1; //IO口第一位输出

out_underedge = 0; out_uperedge = 0; //输出上升沿清除。下降沿的持续时间

//与上升沿相同。

out_output();

}

}

void get_input()

{

int i;

bit a, b;

if(P20) //P20 = 1,表示输入口为高电平,无输入。

inputimgtmp &= 0xfe; //无输入,清除临时映像的相应位。

else

inputimgtmp |= 0x1; //有输入,置位临时映像的相应位。

for(i = 1; i < 256; i = i * 2)

{

a = inputimg & i; //取出输入映像和临时映像的值

b = inputimgtmp & i; //在下面比较。

if(a != b) //输入映像和临时映像的值出现变化,

//说明有上升沿或下降沿出现。

{

if(a) //输入映像相应位为1,置位下降沿位标志。

underedge |= i;

else //输入映像相应位为0,置位上升沿位标志。

uperedge |= i;

}

}

inputimg = inputimgtmp; //临时映像转存入输入映像

}

void out_output()

{

int i;

bit a, b;

for(i = 1; i < 256; i = i * 2)

{

a = outputimgtmp & i; //取出输出映像和临时映像的值

b = outputimg & i; //在下面比较。

if(a != b) //输出映像和临时映像的值出现变化,

//说明有上升沿或下降沿出现。

{

if(a) //输出映像相应位为1,置位下降沿位标志。

out_underedge |= i;

else //输出映像相应位为1,置位下降沿位标志。

out_uperedge |= i;

}

}

outputimgtmp = outputimg; //输出映像转存入临时映像

P10 = outputimg & 0x1; //IO口第1位输出

P11 = outputimg & 0x2; //IO口第2位输出

}

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6654.html

嵌入式C语言中字节对齐的问题

为什么要学习“C”编程语言?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部