上升沿_输入输出的上升沿和下降沿是怎么来的,一起看看
高電平、低電平、上升沿和下降沿的區(qū)別
數(shù)字電路中,電平從低電平(邏輯信號為0)變?yōu)楦唠娖?邏輯信號為1)的那一瞬間叫作上升沿,電平從高電平(邏輯信號為1)變?yōu)榈碗娖?邏輯信號為0)的那一瞬間叫作下降沿。
高電平觸發(fā),是指I/O口電平為高電平時(shí)相應(yīng)的功能或執(zhí)行程序一直有效,直到電平被拉為低電平才失效。上升沿觸發(fā)是當(dāng)信號從低電平變?yōu)楦唠娖綍r(shí)的瞬間有效,不管后面再變?yōu)楦唠娖交虻碗娖蕉紵o效。
低電平觸發(fā),是指I/O口電平為低電平時(shí)相應(yīng)的功能或執(zhí)行程序一直有效,直到電平被拉為高電平才失效。下升沿觸發(fā)是當(dāng)信號從高電平變?yōu)榈碗娖綍r(shí)的瞬間有效,不管后面再變?yōu)榈碗娖交蚋唠娖蕉紵o效。
數(shù)字電路中的“1”和“0”指的就是電平的高低
這種電平觸發(fā)方式在數(shù)字電路的應(yīng)用上最為常見,在工業(yè)自動化應(yīng)用的控制程序上也很常見。我們最為熟悉的就是PLC在編寫程序時(shí)用到的上升沿和下降沿指令,這些指令是集成在PLC內(nèi)部的程序塊。如果我們不選擇PLC作為控制部件,而是要用單片機(jī)來控制,那么上升沿和下降沿的功能我們該如何實(shí)現(xiàn)?單片機(jī)內(nèi)部是沒有這些編輯好的程序塊的,要實(shí)現(xiàn)這個(gè)功能就必須自己編寫程序。程序該如何編寫,下面我們結(jié)合程序深入地來講一講這個(gè)問題。
圖1
首先,程序中使用的變量定義如圖1。
圖2
主程序如圖2。
圖3
輸入上升沿、輸入下降沿是如何通過程序產(chǎn)生的,如圖3。
圖4
輸出上升沿、輸出下降沿是如何通過程序產(chǎn)生的,如圖4。
以上只演示了輸入、輸出IO口的上升沿和下降沿產(chǎn)生的過程。如果我們需要用到其他"位變量"的上升沿或下降沿,同樣可以用這種方式實(shí)現(xiàn)。
下面我把完整的程序附在后面,有需要的老鐵們可以復(fù)制出來使用
/***********************實(shí)現(xiàn)上升沿下降沿的程序源代碼*************************/
#include
#define FOSC 24000000L
void get_input(); //輸入函數(shù)
void out_output(); //輸出函數(shù)
char underedge, uperedge; //輸入上升沿、下降沿變量
char out_underedge, out_uperedge; //輸出上升沿、下降沿變量
char inputimg = 0, outputimg = 0; //輸入、輸出映像變量
char inputimgtmp = 0, outputimgtmp = 0; //輸入、輸出臨時(shí)映像變量
void main()
{
while(1)
{
underedge = 0; uperedge = 0; //輸入上升沿清除。因?yàn)槊繏呙枰淮紊仙囟?/p>
//會被復(fù)位,所以上升沿的持續(xù)時(shí)間是一個(gè)掃
//描周期。
get_input();
if(uperedge & 0x1) //檢測是否有輸入上升沿出現(xiàn),有則執(zhí)行流程程序。
{
//此處編寫流程處理程序
}
if(underedge & 0x1) //檢測是否有輸入下降沿出現(xiàn),有則執(zhí)行流程程序。
{
//此處編寫流程處理程序
}
outputimg |= 0x1; //IO口第一位輸出
out_underedge = 0; out_uperedge = 0; //輸出上升沿清除。下降沿的持續(xù)時(shí)間
//與上升沿相同。
out_output();
}
}
void get_input()
{
int i;
bit a, b;
if(P20) //P20 = 1,表示輸入口為高電平,無輸入。
inputimgtmp &= 0xfe; //無輸入,清除臨時(shí)映像的相應(yīng)位。
else
inputimgtmp |= 0x1; //有輸入,置位臨時(shí)映像的相應(yīng)位。
for(i = 1; i < 256; i = i * 2)
{
a = inputimg & i; //取出輸入映像和臨時(shí)映像的值
b = inputimgtmp & i; //在下面比較。
if(a != b) //輸入映像和臨時(shí)映像的值出現(xiàn)變化,
//說明有上升沿或下降沿出現(xiàn)。
{
if(a) //輸入映像相應(yīng)位為1,置位下降沿位標(biāo)志。
underedge |= i;
else //輸入映像相應(yīng)位為0,置位上升沿位標(biāo)志。
uperedge |= i;
}
}
inputimg = inputimgtmp; //臨時(shí)映像轉(zhuǎn)存入輸入映像
}
void out_output()
{
int i;
bit a, b;
for(i = 1; i < 256; i = i * 2)
{
a = outputimgtmp & i; //取出輸出映像和臨時(shí)映像的值
b = outputimg & i; //在下面比較。
if(a != b) //輸出映像和臨時(shí)映像的值出現(xiàn)變化,
//說明有上升沿或下降沿出現(xiàn)。
{
if(a) //輸出映像相應(yīng)位為1,置位下降沿位標(biāo)志。
out_underedge |= i;
else //輸出映像相應(yīng)位為1,置位下降沿位標(biāo)志。
out_uperedge |= i;
}
}
outputimgtmp = outputimg; //輸出映像轉(zhuǎn)存入臨時(shí)映像
P10 = outputimg & 0x1; //IO口第1位輸出
P11 = outputimg & 0x2; //IO口第2位輸出
}
總結(jié)
以上是生活随笔為你收集整理的上升沿_输入输出的上升沿和下降沿是怎么来的,一起看看的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flutter显示图标_如何让 Flut
- 下一篇: 每列大于0的个数_题目1342——把一个