输入输出的上升沿和下降沿是怎么来的,一起看看
高电平、低电平、上升沿和下降沿的区别
数字电路中,电平从低电平(逻辑信号为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位输出
}
单片机芯片74HC595的引脚图详解
14脚:DS(SER),串行数据输入引脚
13脚:OE,%20输出使能控制脚,它是低电才使能输出,所以接GND
12脚:RCK,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器。
11脚:SCK,移位寄存器时钟引脚,上升沿时,移位寄存器中的bit%20数据整体后移,并接受新的bit(从SER输入)。
10脚:MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接%20高电平即可。
9%20脚%20:串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联。
Qx:并行输出引脚
使用参数VCC:2V~6V,5V最好
I%20Qn:+-%2035mA
注意第一个从SER送入的bit将会从Q7出去。
74HC595介绍一张图片和一段文字,哪种信息传递方式给人的第一视觉冲击是最大的?我想大家心中都有答案。
这也是我文章标题的来由。废话就到这里,下面我就用图片来分析595这个chip。
74HC595的最重要的功能就是:串行输入,并行输出。3态高速位移寄存器(好腻害的说)
595里面有2个8位寄存器:移位寄存器、存储寄存器
移位寄存器
在我看来,74HC595的移位寄存器工作方式就像shou%20%20qiang弹夹。但是子弹的发射(移位寄存器中的数据转储到存储寄存器),又像是【散x弹】(因为是并行输出嘛)
为什么说和弹夹很像呢?
1、串行输入,已进入的位数据依次下移(所以叫移位寄存器)%20|%20子弹也是一颗一颗上的,先上的子弹,被后上的慢慢往下压。
2、第一个输入的位,是并行输出的最后一个位%20|%20最先进入弹夹的子弹,最后射出。
74HC595的引脚图
14脚:DS,又叫SER 英文全称是:Serial data input ,顾名思义,就是串行数据输入口。
595的数据来源只有这一个口,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。
假如,我们要将二进制数据0111 1111 输入到595的移位寄存器中,下面来上一张动态图,模拟了前2个位输入的情景。
这个图有7帧,做了很久,毕竟不是做美工的。可谓术业有专攻,闻道有先后啊,还是要虚心学习 :)
0111 1111 这个数据完全输入后是这样的
我们还要注意一个脚:11脚,(shift register clock input) 移位寄存器时钟引脚。上升沿有效。
首先我们要介绍这个引脚的作用。
我们知道51单片机的工作离不开晶振,他使CPU的工作步调稳定有序,就像跑步时喊1,2,1的那个人。
那么这里的位移寄存器时钟也是同样的道理,当一个新的位数据要进来时,已经进入的位数据就在移位寄存器时钟脉冲的控制下,整体后移,让出位置。
上升沿:电平从低到高的那个过程。移位寄存器时钟在上升沿这个过程中才起作用。
存储寄存器
到这里我们已经大致讲了怎么上子弹,也把子弹上齐了。下面来将怎么将子弹打出去,也就是怎么将移位寄存器的数据转移到存储寄存器
存储寄存器是直接和8个输出引脚相通的,将移位寄存器的数据转移到存储寄存器后,Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 就可以接受带到我们
开始输入的一个字节的数据。所谓存储寄存器,就是数据可以存在这个寄存器中,并不会随着一次输出就消失,只要595不断电,也没有新 的
数据从移位寄存器中过来,数据就一直不变且有效。新的数据过来后,存储寄存器中的数据就会被覆盖更新。
12脚: (storage register clock input ) 存储寄存器时钟
数据从位移寄存器转移到存储寄存器,也是需要时钟脉冲驱动的,这就是12脚的作用。它也是上升沿有效。
自此,我们已经讲解了一个595正常情况下的工作流程
相关问答
单片机 怎么检测 上升沿 与下降沿?可以通过单片机的引脚来检测,通过设置引脚的外部中断,检测引脚的边沿信号就可以检测上升沿或者下降沿,以stm32单片机为例,先将定时器设定为外部触发,然后配...
如何用 单片机 普通I/O口检测 上升沿 或下降沿?用单片机普通I/O口检测上升沿或下降沿,只有一种方法,就是写程序,采用查询方式,查询引脚的状态,当状态发生变化,就是下降沿,或上升沿了。用单片机普通I/O口检...
单片机 检查 上升沿 并计数,怎么实现?可否有例子示范?对于51单片机,可用一个外部中断引脚,如INT0-P3.2设置成下降沿中断模式,中断后计数,在中断程序中,查询P3.2引脚状态,由0变成1,即发现上升沿后就计数。然后...
8086复位信号是 上升沿 吗?是的,该单片机的复位是利用复位信号波形的上升沿触发的。是的,该单片机的复位是利用复位信号波形的上升沿触发的。
单片机 高电平输出是一个阶梯波是怎么回事?1、阶梯波是阶梯波逆变器或其他类似的逆变器输出的交流电压波形。2、逆变器实现阶梯波输出有多种不同线路,输出波形的阶梯数目差别很大。阶梯波逆变器的优点...
单片机的 程序中,为什么按键要去抖动?人手在按下按键的时候,由于抖动和按键触点的原因会产生多个上升沿和下降沿,导致单片机误认为按键受到了多次操作,所以要进行去抖处理,软件的处理方法一般是加...
51 单片机 外部中断电平触发和边缘触发的区别?电平触发,需要触发信号达到某一个电平值的同时,并保持一定的时间,若维持时间未到而电平消失则触发无效;而边沿触发,就是上升沿或者下降沿触发,也是需要达到...
芯片74LS161中的进位输出端CO的工作原理是?74LS161中的进位输出端CO的工作原理是:CO=Q0·Q1·Q2·Q3·CET。从74LS161功能表功能表中可以知道,当清零端CR=“0”,计数器输出Q3、Q2、Q1、Q0立即为全“0”...
单片机 可以直接上电么!不复位可不可以啊!有什么区别么!我的板子也没有复位电路啊!也运行的很好啊?可以直接上电,但是在电路上电时候或电压波动不稳定的时候,当给单片机上电那一瞬间,电压有在几微秒内(有的是几毫秒内)不是直接跳变到5V的而是一个直线上升的...
单片机 设置低电平为啥还是高电平?单片机初始化状态输入输出端默认为高电平。单片机的I/O口的输出信号是数字信号,0-2.3V是低电平;3.2-5V是高电平。虽说是数字信号,但实则是高速的模拟信号,因...