• 歡迎光臨東莞市飛江電子科技有限公司官網!
    全國咨詢熱線

    13926563901

    18925580829

    飛江淘寶店鋪

    首頁>技術資料>51單片機

    基于51單片機之編程基本模板

    發布時間:2018-03-26   瀏覽量:

    程序開始處的程序說明]

     
    *********************************************************************************************
    程序名:   
    編寫人:     
    編寫時間:  20 年 月 日
    硬件支持:  
    接口說明:   
    修改日志:  
      NO.1-        
    *********************************************************************************************
    說明:
     
    *********************************************************************************************/
     
     
     
    [單片機SFR定義的頭文件]
     
    #include //通用89C51頭文件
    #include //通用89C52頭文件
    #include //STC11Fxx或STC11Lxx系列單片機頭文件
    #include //STC12Cx052或STC12Cx052AD系列單片機頭文件
    #include //STC12C5A60S2系列單片機頭文件
     
    [更多庫函數頭定義]
     
    #include     //設定插入點
    #include      //字符處理
    #include      //定義錯誤碼
    #include      //浮點數處理
    #include     //文件輸入/輸出
    #include     //參數化輸入/輸出
    #include    //數據流輸入/輸出
    #include     //定義各種數據類型最值常量
    #include     //定義本地化函數
    #include      //定義數學函數
    #include      //定義輸入/輸出函數
    #include     //定義雜項函數及內存分配函數
    #include     //字符串處理
    #include    //基于數組的輸入/輸出
    #include      //定義關于時間的函數
    #include      //寬字符處理及輸入/輸出
    #include     //寬字符分類
    #include  //51基本運算(包括_nop_空函數)
     
     
     
    [常用定義聲明]
     
    sfr  [自定義名] = [SFR地址] ; //按字節定義SFR中的存儲器名。例:sfr P1 = 0x90;
    sbit  [自定義名] = [系統位名] ; //按位定義SFR中的存儲器名。例:sbit Add_Key = P3 ^ 1;
    bit [自定義名] ; //定義一個位(位的值只能是0或1)例:bit LED;
    #define [代替名]  [原名]  //用代替名代替原名。例:#define LED P1 / #define TA 0x25
     
    unsigned char [自定義名] ; //定義一個0~255的整數變量。例:unsigned char a;
    unsigned int [自定義名] ; //定義一個0~65535的整數變量。例:unsigned int a;
     
     
     
    [定義常量和變量的存放位置的關鍵字]
     
    data 字節尋址片內RAM,片內RAM的128字節(例:data unsigned char a;)
    bdata 可位尋址片內RAM,16字節,從0x20到0x2F(例:bdata unsigned char a;)
    idata 所有片內RAM,256字節,從0x00到0xFF(例:idata unsigned char a;)
    pdata 片外RAM,256字節,從0x00到0xFF(例:pdata unsigned char a;)
    xdata 片外RAM,64K字節,從0x00到0xFFFF(例:xdata unsigned char a;)
    code ROM存儲器,64K字節,從0x00到0xFFFF(例:code unsigned char a;)
     
     
     
     
    [選擇、循環語句]
     
    if(1){
     
    //為真時語句
     
    }else{
     
    //否則時語句
     
    }
     
    --------------------------
     
    while(1){
     
    //為真時內容
     
    }
     
    --------------------------
     
    do{
     
    //先執行內容
     
    }while(1);
     
    --------------------------
     
    switch (a){
     case 0x01:
      //為真時語句
      break;
     case 0x02:
      //為真時語句
      break;
     default:
      //冗余語句
      break;
    }
     
    --------------------------
     
    for(;;){
     
    //循環語句
     
    }
     
    --------------------------
     
     
    [主函數模板]
     
    *********************************************************************************************
    函數名:主函數
    調  用:無
    參  數:無
    返回值:無
    結  果:程序開始處,無限循環
    備  注:
    **********************************************************************************************/
    void main (void){
     
     //初始程序
     
     while(1){
     
      //無限循環程序
     
     }
    }
    **********************************************************************************************/
     
     
    [中斷處理函數模板]
    *********************************************************************************************
    函數名:中斷處理函數
    調  用:無
    參  數:無
    返回值:無
    結  果:
    備  注:
    **********************************************************************************************/
    void name (void) interrupt 1 using 1{
     
     //處理內容
    }
    **********************************************************************************************/
     
    [中斷入口說明]
     
    interrupt 0 外部中斷0(ROM入口地址:0x03)
    interrupt 1 定時/計數器中斷0(ROM入口地址:0x0B)
    interrupt 2 外部中斷1(ROM入口地址:0x13)
    interrupt 3 定時/計數器中斷1(ROM入口地址:0x1B)
    interrupt 4 UART串口中斷(ROM入口地址:0x23)
    (更多的中斷依單片機型號而定,ROM中斷入口均相差8個字節)
     
    using 0 使用寄存器組0
    using 1 使用寄存器組1
    using 2 使用寄存器組2
    using 3 使用寄存器組3
     
     
     
     
    [普通函數框架]
     
    *********************************************************************************************
    函數名:
    調  用:
    參  數:無
    返回值:無
    結  果:
    備  注:
    **********************************************************************************************/
    void name (void){
     
    //函數內容
     
    }
    **********************************************************************************************/
     
     
     
    *********************************************************************************************
    函數名:
    調  用:
    參  數:0~65535 / 0~255
    返回值:0~65535 / 0~255
    結  果:
    備  注:
    **********************************************************************************************/
    unsigned int name (unsigned char a,unsigned int b){
     
    //函數內容
     
    return a; //返回值
    }
    **********************************************************************************************/
     
     
     
    [延時函數]
     
    *********************************************************************************************
    函數名:毫秒級CPU延時函數
    調  用:DELAY_MS (?);
    參  數:1~65535(參數不可為0)
    返回值:無
    結  果:占用CPU方式延時與參數數值相同的毫秒時間
    備  注:應用于1T單片機時i<600,應用于12T單片機時i<125
    *********************************************************************************************/
    void DELAY_MS (unsigned int a){
     unsigned int i;
     while( --a != 0){
      for(i = 0; i < 600; i++);
     }
    }
    *********************************************************************************************/
     
     
     
    [定時/計數器函數]
     
    -----------------------------------------------------------------------------
    M1 M0 方式 說明
    0 0 0 13位T/C,由TL低5位和TH的8位組成13位計數器
    0 1 1 16位T/C,TL和TH共16位計數器
    1 0 2 8位T/C,TL用于計數,當TL溢出時將TH中的值自動寫入TL
    1 1 3 兩組8位T/C
    -----------------------------------------------------------------------------*********************************************************************************************
    函數名:定時/計數器初始化函數
    調  用:T_C_init();
    參  數:無
    返回值:無
    結  果:設置SFR中T/C1和(或)T/C0相關參數
    備  注:本函數控制T/C1和T/C0,不需要使用的部分可用//屏蔽
    **********************************************************************************************/
    void T_C_init (void){
     TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
     EA = 1; //中斷總開關
     
     TH1 = 0xFF; //16位計數寄存器T1高8位(寫入初值)
     TL1 = 0xFF; //16位計數寄存器T1低8位
     ET1 = 1; //T/C1中斷開關
     TR1 = 1; //T/C1啟動開關
     
     //TH0 = 0x3C; //16位計數寄存器T0高8位
     //TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
     //ET0 = 1; //T/C0中斷開關
     //TR0 = 1; //T/C0啟動開關
    }
    **********************************************************************************************/
     
    *********************************************************************************************
    函數名:定時/計數器1中斷處理函數
    調  用:[T/C1溢出后中斷處理]
    參  數:無
    返回值:無
    結  果:重新寫入16位計數寄存器初始值,處理用戶程序
    備  注:必須允許中斷并啟動T/C本函數方可有效,重新寫入初值需和T_C_init函數一致
    **********************************************************************************************/
    void T_C1 (void) interrupt 3  using 3{ //切換寄存器組到3
     TH1 = 0x3C; //16位計數寄存器T1高8位(重新寫入初值)
     TL1 = 0xB0; //16位計數寄存器T1低8位(0x3CB0 = 50mS延時)
     
     //函數內容
    }
    **********************************************************************************************/
     
    *********************************************************************************************
    函數名:定時/計數器0中斷處理函數
    調  用:[T/C0溢出后中斷處理]
    參  數:無
    返回值:無
    結  果:重新寫入16位計數寄存器初始值,處理用戶程序
    備  注:必須允許中斷并啟動T/C本函數方可有效,重新寫入初值需和T_C_init函數一致
    **********************************************************************************************/
    void T_C0 (void) interrupt 1  using 1{ //切換寄存器組到1
     TH0 = 0x3C; //16位計數寄存器T0高8位(重新寫入初值)
     TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
     
     //函數內容
    }
    **********************************************************************************************/
     
     
     
     
    [外部中斷INT函數]
     
    *********************************************************************************************
    函數名:外部中斷INT初始化函數
    調  用:INT_init();
    參  數:無
    返回值:無
    結  果:啟動外部中斷INT1、INT0中斷,設置中斷方式
    備  注:
    **********************************************************************************************/
    void INT_init (void){
     EA = 1; //中斷總開關
     EX1 = 1; //允許外部中斷1中斷   
     EX0 = 1; //允許外部中斷0中斷
     IT1 = 1; //1:下沿觸發  0:低電平觸發
     IT0 = 1; //1:下沿觸發  0:低電平觸發
    }
     
     
    *********************************************************************************************
    函數名:外部中斷INT1中斷處理程序
    調  用:[外部引腳INT1中斷處理]
    參  數:無
    返回值:無
    結  果:用戶處理外部中斷信號
    備  注:
    **********************************************************************************************/
    void INT_1 (void) interrupt 2  using 2{ //切換寄存器組到2
     
     //用戶函數內容
     
    **********************************************************************************************/
     
    *********************************************************************************************
    函數名:外部中斷INT0中斷處理程序
    調  用:[外部引腳INT0中斷處理]
    參  數:無
    返回值:無
    結  果:用戶處理外部中斷信號
    備  注:
    **********************************************************************************************/
    void INT_0 (void) interrupt 0  using 2{ //切換寄存器組到2
     
     //用戶函數內容
     
    **********************************************************************************************/
     
     
     
    [UART串口函數]
     
    *********************************************************************************************
    函數名:UART串口初始化函數
    調  用:UART_init();
    參  數:無
    返回值:無
    結  果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(占用)
    備  注:振蕩晶體為12MHz,PC串口端設置 [ 4800,8,無,1,無 ]
    **********************************************************************************************/
    void UART_init (void){
     EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
     ES = 1; //允許UART串口的中斷
     
     TMOD = 0x20; //定時器T/C1工作方式2
     SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
     TH1 = 0xF3; //定時器初值高8位設置
     TL1 = 0xF3; //定時器初值低8位設置
     PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
     TR1 = 1; //定時器啟動   
    }
    **********************************************************************************************/
     
     
    *********************************************************************************************
    函數名:UART串口初始化函數
    調  用:UART_init();
    參  數:無
    返回值:無
    結  果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(占用)
    備  注:振蕩晶體為11.0592MHz,PC串口端設置 [ 19200,8,無,1,無 ]
    **********************************************************************************************/
    void UART_init (void){
     EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
     ES = 1; //允許UART串口的中斷
     
     TMOD = 0x20; //定時器T/C1工作方式2
     SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
     TH1 = 0xFD; //定時器初值高8位設置
     TL1 = 0xFD; //定時器初值低8位設置
     PCON = 0x80; //波特率倍頻(屏蔽本句波特率為9600)
     TR1 = 1; //定時器啟動   
    }
    **********************************************************************************************/
     
    *********************************************************************************************
    函數名:UART串口接收中斷處理函數
    調  用:[SBUF收到數據后中斷處理]
    參  數:無
    返回值:無
    結  果:UART串口接收到數據時產生中斷,用戶對數據進行處理(并發送回去)
    備  注:過長的處理程序會影響后面數據的接收
    **********************************************************************************************/
    void UART_R (void) interrupt 4  using 1{ //切換寄存器組到1
     unsigned char UART_data; //定義串口接收數據變量
     RI = 0;   //令接收中斷標志位為0(軟件清零)
     UART_data = SBUF; //將接收到的數據送入變量 UART_data
     
     //用戶函數內容(用戶可使用UART_data做數據處理)
     
     //SBUF = UART_data; //將接收的數據發送回去(刪除//即生效)
     //while(TI == 0); //檢查發送中斷標志位
     //TI = 0;  //令發送中斷標志位為0(軟件清零)
    **********************************************************************************************/
     
    *********************************************************************************************
    函數名:UART串口接收CPU查尋語句(非函數體)
    調  用:將下面內容放入主程序
    參  數:無
    返回值:無
    結  果:循環查尋接收標志位RI,如有收到數據則進入if (RI == 1){}
    備  注:
    **********************************************************************************************/
     
    unsigned char UART_data; //定義串口接收數據變量
    if (RI == 1){  //接收中斷標志位為1時
     UART_data = SBUF; //接收數據 SBUF 為單片機的接收發送緩沖寄存器
     RI = 0;   //令接收中斷標志位為0(軟件清零)
     
     //用戶函數內容(用戶可使用UART_data做數據處理)
     
     //SBUF = UART_data; //將接收的數據發送回去(刪除//即生效)
     //while(TI == 0); //檢查發送中斷標志位
     //TI = 0;  //令發送中斷標志位為0(軟件清零)
    }
    **********************************************************************************************/
     
     
    *********************************************************************************************
    函數名:UART串口發送函數
    調  用:UART_T (?);
    參  數:需要UART串口發送的數據(8位/1字節)
    返回值:無
    結  果:將參數中的數據發送給UART串口,確認發送完成后退出
    備  注:
    **********************************************************************************************/
    void UART_T (unsigned char UART_data){ //定義串口發送數據變量
     SBUF = UART_data; //將接收的數據發送回去
     while(TI == 0);  //檢查發送中斷標志位
     TI = 0;   //令發送中斷標志位為0(軟件清零)
    }
    **********************************************************************************************/
     
    黑人粗大无码AV人妻一区