日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁(yè) 新聞資訊 >> 新聞?lì)^條 >> N76E003/MS51FB9AE之IO控制
新聞資訊
NEWS INFORMATION

N76E003/MS51FB9AE之IO控制

關(guān)鍵字:單片機(jī)教程 GPIO設(shè)置 N76E003 發(fā)布時(shí)間:2019-05-22

N76E003最多支持26個(gè)可位尋址的通用I/O引腳,分成4組 P0 到 P3 。每一個(gè)端口有它的端口控制寄存器(Px)。端口控制寄存器的寫和讀有不同的意思。寫端口控制寄存器設(shè)置輸出鎖存邏輯值,讀端口引腳的邏輯狀態(tài)。所有I/O引腳(除P2.0)可以被軟件獨(dú)立配置成四種I/O模式中的一種。這四種模式是準(zhǔn)雙向模式(標(biāo)準(zhǔn)8051端口結(jié)構(gòu))、推挽輸出、輸入和開(kāi)漏模式。每一個(gè)端口通過(guò)兩個(gè)特殊功能寄存器PxM1 和 PxM2來(lái)選擇端口Px的I/O模式。下表指示如何選擇Px.n的I/O模式。注意任何復(fù)位之后,默認(rèn)的配置是高阻輸入模式。

所有I/O引腳可以通過(guò)PxS寄存器里對(duì)應(yīng)的位選擇為TTL電平輸入或施密特觸發(fā)輸入 。施密特觸發(fā)輸入有更好的抗干擾能力。所有的I/O引腳可通過(guò)軟件選擇位控制,斜率輸出能力。輸出斜率控制寄存器是PxSR。默認(rèn)是慢斜率。.如果用戶想要增加I/O引腳輸出速率,設(shè)置PxSR的相應(yīng)位,將斜率設(shè)置成高速輸出。
當(dāng)配置RPD (CONFIG0.2) 為0,P2.0被配置為輸入引腳。同時(shí)P2.0將永遠(yuǎn)在輸入模式和施密特觸發(fā)模式,通過(guò)P20UP(P2S.7)使能內(nèi)部上拉電阻。如果RPD未編程,P2.0作為外部復(fù)位引腳,P2.0作為管腳功能無(wú)效,由于作為復(fù)位腳,內(nèi)部上拉電阻始終有效,此種狀態(tài)下讀取P2.0的值始終為0.

準(zhǔn)雙向模式
準(zhǔn)雙向模式作為標(biāo)準(zhǔn)8051的I/O結(jié)構(gòu),可以同時(shí)用作輸入和輸出。當(dāng)端口輸出邏輯高時(shí),驅(qū)動(dòng)能力較弱,同時(shí)允許外部器件將電平拉低。當(dāng)引腳被拉低時(shí)有強(qiáng)驅(qū)動(dòng)能力,會(huì)吸收大電流。在準(zhǔn)雙向I/O 結(jié)構(gòu)中,有三個(gè)上拉MOS管,適應(yīng)不同的應(yīng)用。其中一個(gè)上拉叫做特弱上拉,當(dāng)端口鎖定在邏輯1時(shí),打開(kāi)特弱上拉,特弱上拉有很小電流將引腳拉高。
第二種上拉為“弱上拉”,當(dāng)外部端口引腳自身處于邏輯1時(shí)打開(kāi)。這種上拉提供源電流以使準(zhǔn)雙向引腳輸出1。如果引腳為邏輯1,被外部器件拉低, “弱上拉”關(guān)閉, 僅有“特弱上拉”打開(kāi)。 此時(shí)要將引腳拉低,外部器件要有足夠的灌電流 (大于ITL)以克服“弱上拉”,并使端口的電壓低于輸入門限電壓 (低于VIL)。

第三種上拉為“強(qiáng)上拉”。這種上拉用于在準(zhǔn)雙向口引腳上,加速端口電平由邏輯0轉(zhuǎn)為邏輯1的轉(zhuǎn)換速度。 當(dāng)這種
情況發(fā)生時(shí),打開(kāi)強(qiáng)上拉用兩個(gè)CPU時(shí)鐘的時(shí)間快速地將端口引腳拉高。 然后就關(guān)閉,弱上拉和特弱上拉繼續(xù)
保持該端口引腳為高。 準(zhǔn)雙向端口結(jié)構(gòu)如下所示。

推挽模式

推挽輸出模式與準(zhǔn)雙向輸出模式有相同的下拉結(jié)構(gòu)。當(dāng)端口鎖定為1時(shí),提供持續(xù)的強(qiáng)上拉。推挽輸出模式用于需要從端口輸出大電流時(shí)的應(yīng)用。

輸入高阻模式

輸入模式提供真實(shí)的高阻輸入路徑。雖然準(zhǔn)雙向模式也可以作為輸入引腳,但是它需要相對(duì)強(qiáng)的輸入源。輸入模式的好處是減少在邏輯0時(shí)電流的消耗,如果是準(zhǔn)雙向模式,邏輯0時(shí)總是消耗來(lái)自VDD 的電流。用戶需要注意的是,輸入模式應(yīng)該由外部設(shè)備或電阻提供一個(gè)確定的電平。懸浮的引腳在掉電狀態(tài)下會(huì)引起漏電。

 

開(kāi)漏模式
開(kāi)漏輸出配置關(guān)閉所有內(nèi)部上拉,當(dāng)端口鎖定為邏輯0時(shí),僅打開(kāi)驅(qū)動(dòng)端口的下拉晶體管。當(dāng)端口鎖存為邏輯1
時(shí),它就和輸入模式一樣。通常用于I2C輸出線上,開(kāi)漏引腳需要加一個(gè)外部上拉電阻,典型連一個(gè)電阻到
VDD。 用戶需要注意的是,開(kāi)漏模式輸出邏輯1的時(shí)候,應(yīng)該由外部設(shè)備或電阻提供一個(gè)確定的電平。懸浮的引
腳在掉電狀態(tài)下會(huì)引起漏電。

讀-修改-寫 指令
從SFR或內(nèi)部RAM讀一個(gè)字節(jié),修改它,并重新寫回去的指令,叫做讀-修改-寫指令。當(dāng)目標(biāo)是一個(gè)I/O端口或
一個(gè)端口位,這些指令讀內(nèi)部輸出鎖存而不是外部引腳的狀態(tài),這種指令讀端口SFR的值,修改它并寫回到SFR
端口。所有讀-修改-寫的指令如下所列:

指令 描述
ANL 邏輯 與. (ANL direct, A and ANL direct, #data)
ORL 邏輯 或. (ORL direct, A and ORL direct, #data)
XRL 邏輯 異或 OR. (XRL direct, A and XRL direct, #data)

JBC if bit = 1 轉(zhuǎn)跳指令并清除. (JBC bit, rel)
CPL 位取反. (CPL bit)
INC 加一指令. (INC direct)
DEC 減一指令. (DEC direct)
DJNZ 減一不為零轉(zhuǎn)跳指令. (DJNZ direct, rel)
MOV bit, C 移進(jìn)位標(biāo)志到位. (MOV bit, C)
CLR bit 清位. (CLR bit)
SETB bit 置位. (SETB bit)

最后三條指令看似不是明顯的讀-修改-寫指令,實(shí)際它們就是讀-修改-寫指令。 可以讀整個(gè)端口鎖定值,修改改變位,寫入新的值。

管腳控制寄存器
N76E003有許多I/O控制寄存器提供靈活的各種應(yīng)用。和I/O端口相關(guān)的SFRs可以分類成四組:輸入輸出控制,輸出模式控制、輸入類型和灌電流控制,輸出斜率控制。所有SFRs如下所列:
輸入輸出數(shù)據(jù)控制 
這些寄存器是I/O輸入輸出數(shù)據(jù)緩存。讀獲取I/O輸入的數(shù)據(jù)。寫驅(qū)動(dòng)數(shù)據(jù)輸出,所有這些寄存器都是可位尋址的。

輸出模式控制
這些寄存器控制輸出模式。配置為輸出模式在四種模式中:輸入模式、準(zhǔn)雙向模式、推挽或開(kāi)漏模式。每一個(gè)引腳可以獨(dú)立地配置。對(duì)P2.0引腳,有一個(gè)上拉電阻控制位是P2S.7。

 

 

輸入類型
每一個(gè) I/O 引腳可以獨(dú)立地配置成TTL輸入或施密特觸發(fā)輸入。注意所有PxS 寄存器通過(guò)切換SFR頁(yè)到頁(yè)1來(lái)訪問(wèn)。

輸出斜率控制
N76E003可單獨(dú)控制管腳輸出斜率。默認(rèn)情況下,管腳采用普通斜率模式。當(dāng)用戶切換到高速斜率模式時(shí),每個(gè)管腳斜率可看到顯著變化。注更改PxSR寄存器需要將SFR頁(yè)切換到頁(yè)1 。

 

 

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0
////------------------- Define Port as Quasi mode  -------------------
//#define P00_Quasi_Mode                P0M1&=~SET_BIT0;P0M2&=~SET_BIT0
//#define P01_Quasi_Mode                P0M1&=~SET_BIT1;P0M2&=~SET_BIT1
//#define P02_Quasi_Mode                P0M1&=~SET_BIT2;P0M2&=~SET_BIT2
//#define P03_Quasi_Mode                P0M1&=~SET_BIT3;P0M2&=~SET_BIT3
//#define P04_Quasi_Mode                P0M1&=~SET_BIT4;P0M2&=~SET_BIT4
//#define P05_Quasi_Mode                P0M1&=~SET_BIT5;P0M2&=~SET_BIT5
//#define P06_Quasi_Mode                P0M1&=~SET_BIT6;P0M2&=~SET_BIT6
//#define P07_Quasi_Mode                P0M1&=~SET_BIT7;P0M2&=~SET_BIT7
//#define P10_Quasi_Mode                P1M1&=~SET_BIT0;P1M2&=~SET_BIT0
//#define P11_Quasi_Mode                P1M1&=~SET_BIT1;P1M2&=~SET_BIT1
//#define P12_Quasi_Mode                P1M1&=~SET_BIT2;P1M2&=~SET_BIT2
//#define P13_Quasi_Mode                P1M1&=~SET_BIT3;P1M2&=~SET_BIT3
//#define P14_Quasi_Mode                P1M1&=~SET_BIT4;P1M2&=~SET_BIT4
//#define P15_Quasi_Mode                P1M1&=~SET_BIT5;P1M2&=~SET_BIT5
//#define P16_Quasi_Mode                P1M1&=~SET_BIT6;P1M2&=~SET_BIT6
//#define P17_Quasi_Mode                P1M1&=~SET_BIT7;P1M2&=~SET_BIT7
//#define P20_Quasi_Mode                P2M1&=~SET_BIT0;P2M2&=~SET_BIT0
//#define P30_Quasi_Mode                P3M1&=~SET_BIT0;P3M2&=~SET_BIT0
////------------------- Define Port as Push Pull mode -------------------
//#define P00_PushPull_Mode            P0M1|=SET_BIT0;P0M2&=~SET_BIT0
//#define P01_PushPull_Mode            P0M1|=SET_BIT1;P0M2&=~SET_BIT1
//#define P02_PushPull_Mode            P0M1&=~SET_BIT2;P0M2|=SET_BIT2
//#define P03_PushPull_Mode            P0M1&=~SET_BIT3;P0M2|=SET_BIT3
//#define P04_PushPull_Mode            P0M1&=~SET_BIT4;P0M2|=SET_BIT4
//#define P05_PushPull_Mode            P0M1&=~SET_BIT5;P0M2|=SET_BIT5
//#define P06_PushPull_Mode            P0M1&=~SET_BIT6;P0M2|=SET_BIT6
//#define P07_PushPull_Mode            P0M1&=~SET_BIT7;P0M2|=SET_BIT7
//#define P10_PushPull_Mode            P1M1&=~SET_BIT0;P1M2|=SET_BIT0
//#define P11_PushPull_Mode            P1M1&=~SET_BIT1;P1M2|=SET_BIT1
//#define P12_PushPull_Mode            P1M1&=~SET_BIT2;P1M2|=SET_BIT2
//#define P13_PushPull_Mode            P1M1&=~SET_BIT3;P1M2|=SET_BIT3
//#define P14_PushPull_Mode            P1M1&=~SET_BIT4;P1M2|=SET_BIT4
//#define P15_PushPull_Mode            P1M1&=~SET_BIT5;P1M2|=SET_BIT5
//#define P16_PushPull_Mode            P1M1&=~SET_BIT6;P1M2|=SET_BIT6
//#define P17_PushPull_Mode            P1M1&=~SET_BIT7;P1M2|=SET_BIT7
//#define P20_PushPull_Mode            P2M1&=~SET_BIT0;P2M2|=SET_BIT0
//#define P30_PushPull_Mode            P3M1&=~SET_BIT0;P3M2|=SET_BIT0
////------------------- Define Port as Input Only mode -------------------
//#define P00_Input_Mode                P0M1|=SET_BIT0;P0M2&=~SET_BIT0
//#define P01_Input_Mode                P0M1|=SET_BIT1;P0M2&=~SET_BIT1
//#define P02_Input_Mode                P0M1|=SET_BIT2;P0M2&=~SET_BIT2
//#define P03_Input_Mode                P0M1|=SET_BIT3;P0M2&=~SET_BIT3
//#define P04_Input_Mode                P0M1|=SET_BIT4;P0M2&=~SET_BIT4
//#define P05_Input_Mode                P0M1|=SET_BIT5;P0M2&=~SET_BIT5
//#define P06_Input_Mode                P0M1|=SET_BIT6;P0M2&=~SET_BIT6
//#define P07_Input_Mode                P0M1|=SET_BIT7;P0M2&=~SET_BIT7
//#define P10_Input_Mode                P1M1|=SET_BIT0;P1M2&=~SET_BIT0
//#define P11_Input_Mode                P1M1|=SET_BIT1;P1M2&=~SET_BIT1
//#define P12_Input_Mode                P1M1|=SET_BIT2;P1M2&=~SET_BIT2
//#define P13_Input_Mode                P1M1|=SET_BIT3;P1M2&=~SET_BIT3
//#define P14_Input_Mode                P1M1|=SET_BIT4;P1M2&=~SET_BIT4
//#define P15_Input_Mode                P1M1|=SET_BIT5;P1M2&=~SET_BIT5
//#define P16_Input_Mode                P1M1|=SET_BIT6;P1M2&=~SET_BIT6
//#define P17_Input_Mode                P1M1|=SET_BIT7;P1M2&=~SET_BIT7
//#define P20_Input_Mode                P2M1|=SET_BIT0;P2M2&=~SET_BIT0
//#define P30_Input_Mode                P3M1|=SET_BIT0;P3M2&=~SET_BIT0
////-------------------Define Port as Open Drain mode -------------------
//#define P00_OpenDrain_Mode        P0M1|=SET_BIT0;P0M2|=SET_BIT0
//#define P01_OpenDrain_Mode        P0M1|=SET_BIT1;P0M2|=SET_BIT1
//#define P02_OpenDrain_Mode        P0M1|=SET_BIT2;P0M2|=SET_BIT2
//#define P03_OpenDrain_Mode        P0M1|=SET_BIT3;P0M2|=SET_BIT3
//#define P04_OpenDrain_Mode        P0M1|=SET_BIT4;P0M2|=SET_BIT4
//#define P05_OpenDrain_Mode        P0M1|=SET_BIT5;P0M2|=SET_BIT5
//#define P06_OpenDrain_Mode        P0M1|=SET_BIT6;P0M2|=SET_BIT6
//#define P07_OpenDrain_Mode        P0M1|=SET_BIT7;P0M2|=SET_BIT7
//#define P10_OpenDrain_Mode        P1M1|=SET_BIT0;P1M2|=SET_BIT0
//#define P11_OpenDrain_Mode        P1M1|=SET_BIT1;P1M2|=SET_BIT1
//#define P12_OpenDrain_Mode        P1M1|=SET_BIT2;P1M2|=SET_BIT2
//#define P13_OpenDrain_Mode        P1M1|=SET_BIT3;P1M2|=SET_BIT3
//#define P14_OpenDrain_Mode        P1M1|=SET_BIT4;P1M2|=SET_BIT4
//#define P15_OpenDrain_Mode        P1M1|=SET_BIT5;P1M2|=SET_BIT5
//#define P16_OpenDrain_Mode        P1M1|=SET_BIT6;P1M2|=SET_BIT6
//#define P17_OpenDrain_Mode        P1M1|=SET_BIT7;P1M2|=SET_BIT7
//#define P20_OpenDrain_Mode        P2M1|=SET_BIT0;P2M2|=SET_BIT0
//#define P30_OpenDrain_Mode        P3M1|=SET_BIT0;P3M2|=SET_BIT0
////--------- Define all port as quasi mode ---------
//#define Set_All_GPIO_Quasi_Mode            P0M1=0;P0M1=0;P1M1=0;P1M2=0;P2M1=0;P2M2=0;P3M1=0;P3M2=0
#endif

/*------------------------------------------------
The main C function.  Program execution starts
here after stack initialization.
------------------------------------------------*/

void main (void) 
{
//    unsigned char temp;
    Set_All_GPIO_Quasi_Mode;                    // Define in Function_define.h
    
#if 0
    InitialUART0_Timer3(115200);
//    set_CLOEN;                                          // For clock out from P1.1
  
  while(1)
  {
        clr_GPIO1;                                            // Tiny board GPIO1 LED define
        P0 = 0x00;
        P2 = 0x00;
        P1 = 0x00;
        Timer0_Delay1ms(30);
        P0 = 0xff;
        P2 = 0xff;
        P1 = 0xff;
        set_GPIO1;    

        Send_Data_To_UART0(0x35);                    //UART0 send ascii "U"
        temp = 0x31 + P0;
        Send_Data_To_UART0(temp);
        temp = 0x31 + P1;
        Send_Data_To_UART0(temp);

        Timer0_Delay1ms(30);
  }
#endif

#if 1
  
  while(1)
  {
        clr_GPIO1;                                            // Tiny board GPIO1 LED define
        P0 = 0x00;
        P2 = 0x00;
        P1 = 0x00;
        Timer0_Delay1ms(30);
        P0 = 0xff;
        P2 = 0xff;
        P1 = 0xff;
        set_GPIO1;    
        Timer0_Delay1ms(30);
  }
#endif
    

}

我自己寫的一個(gè)根據(jù)例程驅(qū)動(dòng)繼電器的例程,額,怎么說(shuō)呢,就改了

//***********************************************************************************************************
//  File Function: N76E003 Timer0/1 Mode1 demo code
//***********************************************************************************************************
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0

#endif

#define TH0_INIT        50000 
#define TL0_INIT        50000
UINT8 u8TH0_Tmp,u8TL0_Tmp,u8TH1_Tmp,u8TL1_Tmp;

int i=0;
/************************************************************************************************************
*    TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt 1  //interrupt address is 0x000B
{
      i++;
    TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;    
    if(i==200)
    {
  P12 =1; 
        i=0;
  }
    
}


void main (void)
{
   
      P12_PushPull_Mode;
      
      clr_GPIO1;
        TIMER0_MODE1_ENABLE;
 

    clr_T1M;


    u8TH0_Tmp = (65536-TH0_INIT)/256;
    u8TL0_Tmp = (65536-TL0_INIT)%256;    

    TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;

    
    set_ET0;                                    //enable Timer0 interrupt
  
    set_EA;                                     //enable interrupts
    set_TR0;                                    //Timer0 run
    while(1);
        
}

準(zhǔn)雙向是一個(gè)沒(méi)有那么大的驅(qū)動(dòng)電流,驅(qū)動(dòng)不了電機(jī)所以選擇推挽模式。

聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

宁强县| 江达县| 阆中市| 栖霞市| 凉城县| 宜兴市| 镇康县| 习水县| 清水县| 临武县| 屯留县| 达日县| 青海省| 平利县| 建始县| 冷水江市| 新宁县| 揭西县| 峨边| 三原县| 得荣县| 突泉县| 宁南县| 陵川县| 镇康县| 哈巴河县| 丘北县| 南投市| 通州市| 信丰县| 泰和县| 汶上县| 灵宝市| 阿城市| 周口市| 富平县| 尖扎县| 镇坪县| 武威市| 左贡县| 清远市|