日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/8/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 上升沿_输入输出的上升沿和下降沿是怎么来的,一起看看 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

高電平、低電平、上升沿和下降沿的區(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。