|

/*********************************************************************************************
函數名: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(軟件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口發送字符串函數
調 用:UART_TC (?);
參 數:需要UART串口發送的數據(8位/1字節)
返回值:無
結 果:向串口發送一個字符串,長度不限。
備 注:例:UART_TC("d9887321$"); 此函數需要#include <string.h>頭文件支持。
/**********************************************************************************************/
void UART_TC (unsigned char *str){
while(*str != '\0'){
UART_T(*str);
*str++;
}
*str = 0;
}
/**********************************************************************************************
/*********************************************************************************************
程序名: UART串口查尋方式程序實例
硬件支持: STC12C2052AD 外部12MHZ晶振
接口說明: 連接串口ISP下載線
/*********************************************************************************************
說明:
用Windows系統中的“超級終端”軟件,將串口端設置 [ 4800,8,無,1,無 ]
或采用STC-ISP軟件中的串口助手功能,將串口端設置 [ 4800,8,無,1,無 ]
向串口發送數據,單片機將數據發還給PC端并顯示。
/*********************************************************************************************/
#include <STC12C5A60S2.h> //STC12C5AxxS2系列單片機頭文件
//#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列單片機頭文件
/*********************************************************************************************
函數名: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; //定時器啟動
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:主函數
調 用:無
參 數:無
返回值:無
結 果:程序開始處,無限循環
備 注:
/**********************************************************************************************/
void main (void){
unsigned char UART_data; //定義串口接收數據變量
UART_init();
while(1){
if (RI == 1){ //接收中斷標志位為1時
UART_data = SBUF; //接收數據 SBUF 為單片機的接收發送緩沖寄存器
RI = 0; //令接收中斷標志位為0(軟件清零)
SBUF = UART_data; //將接收的數據發送回去(刪除//即生效)
while(TI == 0); //檢查發送中斷標志位
TI = 0; //令發送中斷標志位為0(軟件清零)
}
}
}
/**********************************************************************************************/
/*********************************************************************************************
程序名: UART串口中斷方式程序實例
硬件支持: STC12C2052AD 外部12MHZ晶振
接口說明: 連接串口ISP下載線
/*********************************************************************************************
說明:
用Windows系統中的“超級終端”軟件,將串口端設置 [ 4800,8,無,1,無 ]
或采用STC-ISP軟件中的串口助手功能,將串口端設置 [ 4800,8,無,1,無 ]
向串口發送數據,單片機將數據發還給PC端并顯示。
/*********************************************************************************************/
#include <STC12C5A60S2.h> //STC12C5AxxS2系列單片機頭文件
//#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列單片機頭文件
/*********************************************************************************************
函數名: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串口接收中斷處理函數
調 用:[SBUF收到數據后中斷處理]
參 數:無
返回值:無
結 果:UART串口接收到數據時產生中斷,用戶對數據進行處理(并發送回去)
備 注:過長的處理程序會影響后面數據的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切換寄存器組到1
unsigned char UART_data; //定義串口接收數據變量
RI = 0; //令接收中斷標志位為0(軟件清零)
UART_data = SBUF; //將接收到的數據送入變量 UART_data
SBUF = UART_data; //將接收的數據發送回去(刪除//即生效)
while(TI == 0); //檢查發送中斷標志位
TI = 0; //令發送中斷標志位為0(軟件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:主函數
調 用:無
參 數:無
返回值:無
結 果:程序開始處,無限循環
備 注:
/**********************************************************************************************/
void main (void){
UART_init();
while(1){
}
}
/**********************************************************************************************/
1. MCS-51通用的UART串口是使用T1定時器產生波特率,即使用UART串口時T1不能作為他用。
2. 硬件上UART串口占用單片機的P3.0和P3.1接口(8051系列),除有特別設計,否則此接口不得復用。
可將其模板下載到本地硬盤,在編寫新程序的時候復制、粘貼到工程當中,然后根據情況寫入具體內容。
|
|
相關帖子
- • 這是定義的問題嗎,用的c語言,怎么都改不對
- • adc_dma進行采集時打印數據為0,不開dma數據能夠正常顯示,想問一下是什么原因
- • 單片機不使用外部中斷,如何LED顯示程序?
- • 做了個替BF7612CM的測試
- • 要求電路如果在照明燈點亮期間又有新的聲源出現,照明燈應重新通電時間t 請問這個...
- • Keil程序求助,這些報錯怎么解決,小白一個,剛接觸單片機
- • 求用at89c51單片機測LM331 V/F轉化后的頻率 我的沒有顯示
- • MCU模擬SPI通信,能發送數據,接收不到數據
- • 菜鳥求助 這個問題怎么解決,已經在oledfont.h定義了 還是報錯
- • STM32單片機向ESP8266發送指令,設置延時1秒上傳一次數據,延時不準確
- • 關于51單片機定時器計數不夠長的問題,想問問各位大佬有沒有什么思路
- • 單片機矩陣按鍵 原理圖+源代碼
- • 通過手機藍牙APP發出控制指令,控制3個以上LED燈亮滅和蜂鳴器報警和關閉,怎么做 求指導
- • 關于用51單片機驅動AD9851的原理及其編程思路?
- • 單片機用點陣LED實現靜態字符顯示實驗程序
- • 關于單片機矩陣鍵盤多位數的輸入程序問題
- • CCS10.2編譯器貌似不支持部分GNU的__attribute__
- • 基于89C51單片機的可調倒計時程序
- • 如何使用單片機定時器來控制一個物理按鈕的IO口的通斷啊?
- • 用51單片機做的溫度監測報警裝置,手動報警是需要按下SEND按鈕的,但是現在我想...
|
|
|
|
|