久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4247|回復: 4
打印 上一主題 下一主題
收起左側

8051單片機C語言編程模板

  [復制鏈接]
跳轉到指定樓層
樓主
ID:350104 發表于 2018-11-13 17:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
常用的編程模板  提升編程效率 希望對大家有用!

[單片機SFR定義的頭文件]

#include <REG51.h> //通用89C51頭文件
#include <REG52.h> //通用89C52頭文件
#include <STC11Fxx.H> //STC11Fxx或STC11Lxx系列單片機頭文件
#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列單片機頭文件
#include <STC12C5A60S2.H> //STC12C5A60S2系列單片機頭文件

[更多庫函數頭定義]

#include <assert.h>    //設定插入點
#include <ctype.h>     //字符處理
#include <errno.h>     //定義錯誤碼
#include <float.h>     //浮點數處理
#include <fstream.h>    //文件輸入/輸出
#include <iomanip.h>    //參數化輸入/輸出
#include <iostream.h>   //數據流輸入/輸出
#include <limits.h>    //定義各種數據類型最值常量
#include <locale.h>    //定義本地化函數
#include <math.h>     //定義數學函數
#include <stdio.h>     //定義輸入/輸出函數
#include <stdlib.h>    //定義雜項函數及內存分配函數
#include <string.h>    //字符串處理
#include <strstrea.h>   //基于數組的輸入/輸出
#include <time.h>     //定義關于時間的函數
#include <wchar.h>     //寬字符處理及輸入/輸出
#include <wctype.h>    //寬字符分類
#include <intrins.h>        //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(軟件清零)
}
/**********************************************************************************************/

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:64765 發表于 2019-10-10 21:05 | 只看該作者
好資料,學習了,謝謝分享。
回復

使用道具 舉報

板凳
ID:58110 發表于 2019-10-11 08:01 | 只看該作者
還有這樣的好東西,真不錯,謝謝分享!
回復

使用道具 舉報

地板
ID:34607 發表于 2019-10-12 10:20 | 只看該作者
謝謝分享,內容詳實,非常難得!
回復

使用道具 舉報

5#
ID:585365 發表于 2019-10-13 08:41 | 只看該作者
謝謝分享,內容詳實,非常難得!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频在线看 | 一区二区高清不卡 | 99久久久国产精品 | 在线看成人av | 久久精品一 | 一区二区国产精品 | 久久av网| 一区二区电影 | 香蕉一区二区 | 91在线视频免费观看 | 欧美精品一区二区三区四区 在线 | 91精品国产高清久久久久久久久 | 亚洲36d大奶网 | 国产一区二区三区免费观看视频 | 久久久国产一区 | 日韩二区三区 | 亚洲精彩视频 | 久久成人激情 | 精品亚洲一区二区 | 99精品福利视频 | 97天天干 | 成人在线一区二区三区 | 亚洲国产精品一区二区久久 | 久久久美女 | 亚洲精品黄色 | 日本黄色大片免费看 | 国产一区久久久 | 国内精品久久久久久 | 精品国产一区二区三区性色av | 狠狠干美女 | 福利视频一区二区 | 国产精品久久久久久一级毛片 | 亚洲精品一区二区三区中文字幕 | 颜色网站在线观看 | 日本一区二区三区视频在线 | 91色视频在线观看 | 日本xx视频免费观看 | 五月精品视频 | 自拍偷拍亚洲一区 | 欧美专区在线视频 | 久久成人一区二区三区 |