上升沿_输入输出的上升沿和下降沿是怎么来的,一起看看
高電平、低電平、上升沿和下降沿的區別
數字電路中,電平從低電平(邏輯信號為0)變為高電平(邏輯信號為1)的那一瞬間叫作上升沿,電平從高電平(邏輯信號為1)變為低電平(邏輯信號為0)的那一瞬間叫作下降沿。
高電平觸發,是指I/O口電平為高電平時相應的功能或執行程序一直有效,直到電平被拉為低電平才失效。上升沿觸發是當信號從低電平變為高電平時的瞬間有效,不管后面再變為高電平或低電平都無效。
低電平觸發,是指I/O口電平為低電平時相應的功能或執行程序一直有效,直到電平被拉為高電平才失效。下升沿觸發是當信號從高電平變為低電平時的瞬間有效,不管后面再變為低電平或高電平都無效。
數字電路中的“1”和“0”指的就是電平的高低
這種電平觸發方式在數字電路的應用上最為常見,在工業自動化應用的控制程序上也很常見。我們最為熟悉的就是PLC在編寫程序時用到的上升沿和下降沿指令,這些指令是集成在PLC內部的程序塊。如果我們不選擇PLC作為控制部件,而是要用單片機來控制,那么上升沿和下降沿的功能我們該如何實現?單片機內部是沒有這些編輯好的程序塊的,要實現這個功能就必須自己編寫程序。程序該如何編寫,下面我們結合程序深入地來講一講這個問題。
圖1
首先,程序中使用的變量定義如圖1。
圖2
主程序如圖2。
圖3
輸入上升沿、輸入下降沿是如何通過程序產生的,如圖3。
圖4
輸出上升沿、輸出下降沿是如何通過程序產生的,如圖4。
以上只演示了輸入、輸出IO口的上升沿和下降沿產生的過程。如果我們需要用到其他"位變量"的上升沿或下降沿,同樣可以用這種方式實現。
下面我把完整的程序附在后面,有需要的老鐵們可以復制出來使用
/***********************實現上升沿下降沿的程序源代碼*************************/
#include
#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位輸出
}
總結
以上是生活随笔為你收集整理的上升沿_输入输出的上升沿和下降沿是怎么来的,一起看看的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flutter显示图标_如何让 Flut
- 下一篇: 每列大于0的个数_题目1342——把一个