<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月28日   【字體:

         [程序開始處的程序說明]

         
        *********************************************************************************************
        程序名:   
        編寫人:     
        編寫時間:  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(軟件清零)
        }
        **********************************************************************************************/
         
         
         
         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮