當前位置:首頁 » 編程語言 » c語言高低電平
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言高低電平

發布時間: 2023-07-27 16:28:36

1. 單片機c語言編程時,假如一個IO已口定義了,但沒定義此口是高電平還是低電平,那系統會默認為低電平么

任何一個C語言語句,最終都是經過編譯程序編譯成匯編語言再由匯編器編譯成機器碼,但是,定語句則不痛,他們被編譯成匯編語言偽指令(不是可執行指令),只要你沒有在定義時賦值,就沒有實質的機器碼產生,也就不會改變寄存器或者內存的狀態。
由此,我們可以得出答案,單片機c語言編程時,假如一個IO已口定義了,但沒定義此口是高電平還是低電平,那系統不會默認為低電平。這個IO口具體是什麼狀態,有具體單片機的默認狀態決定,且不同的單片機有所不同,對傳統單片機,默認狀態是弱上拉准IO狀態,是高電平。

2. 急求:我編的c語言控製程序,如何更改觸發方式(按鍵判斷改為高低電平判斷),而保持原程序執行結果。

  • 新建工程

    首先新建工程,並加以簡單配置,可以參考我的分享:《IAR如何建立工程》,如下為硬體電路圖:

  • PICTL

    PICTL可以控制Px口中斷觸發信號:上升沿觸發、下降沿觸發。由於按鍵在未按下時處於高電平,按下後為低電平,松開後又為高電平,所以會產生下降沿觸發信號,配置為下降沿觸發即可:

    PICTL |= BIT0; //falling edge

  • IEN1

    除了配置引腳,還需要開啟埠引腳中斷使能,如下所示開啟PO口中斷使能:

    IEN1 |= BIT5; //P0 interrupt

  • PxIFG

    在開啟中斷前需要先清除中斷標志,以免誤入中斷造成系統混亂。

    P0IFG &= ~BIT4;

  • 系統中斷使能

    學習51都知道,在任何中斷操作時,都需要開啟系統中斷:

    EA = 1; //system interrupt open

  • 中斷函數書寫

    #pragma vector = P0INT_VECTOR

    __interrupt void P0_isr(void)

    {

    wg_waitUs(10);

    P0IFG &= ~BIT4;

    P0IF &= ~BIT4;

    P1_0 = ~P1_0; //led1 trigger

    }

    其中wg_waitUs()是延時函數,起到按鍵消抖作用。

  • 代碼框架

    void wg_ledInit(void)

    {

    P1DIR |= BIT0;

    P1 |= BIT0;

    }

    void wg_btnInit(void)

    {

    P0IEN |= BIT4; // P0.4 button input

    PICTL |= BIT0; //falling edge

    IEN1 |= BIT5; //P0 interrupt

    P0IFG &= ~BIT4;

    EA = 1; //system interrupt open

    }

    void wg_waitUs(uint16 ration)

    {

    while (ration--)

    {

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    }

    }

    void main(void)

    {

    wg_ledInit();

    wg_btnInit();

    //loop

    for(;;)

    {

    ;//

    }

    }

    #pragma vector = P0INT_VECTOR

    __interrupt void P0_isr(void)

    {

    wg_waitUs(10);

    P0IFG &= ~BIT4;

    P0IF &= ~BIT4;

    P1_0 = ~P1_0; //led1 trigger

    }

3. c語言中如何將發送的數字串(例如11011110)轉換成高低電平波形

voidoutput_high(void)
{
/*具體如何輸出高電平,要結合實際情況,如硬體環境*/
}

voidoutput_low(void)
{
/*具體如何輸出低電平,要結合實際情況,如硬體環境*/
}

voidmain(void)
{
unsignedchardata=222;//11011110,舉例
unsignedchartemp=0;
unsignedinti=0;
for(i=0;i<8;i++)
{
temp=data&1;
if(temp==0)
output_low();
else
output_high();
data=data>>1;
delay();//延時函數,舉例
}

}