標(biāo)題: 單片機(jī)串口編程參考 [打印本頁(yè)]

作者: 51黑科技    時(shí)間: 2016-2-4 04:06
標(biāo)題: 單片機(jī)串口編程參考
標(biāo)準(zhǔn)串口參考程序如下:(來(lái)源周立功單片機(jī)公司)具有一般參考意義。
#include<reg51.h>
unsigned char UART_RX; //定義串口接收數(shù)據(jù)變量
unsigned char RX_flag; //定義穿行接收標(biāo)記
/*********************************************************************************************
函數(shù)名:UART串口初始化函數(shù)
調(diào)  用:UART_init();
參  數(shù):無(wú)
返回值:無(wú)
結(jié)  果:?jiǎn)?dòng)UART串口接收中斷,允許串口接收,啟動(dòng)T/C1產(chǎn)生波特率(占用)
備  注:振蕩晶體為12MHz,PC串口端設(shè)置 [ 4800,8,無(wú),1,無(wú) ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
ES = 1; //允許UART串口的中斷

TMOD = 0x20; //定時(shí)器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)
TH1 = 0xF3; //定時(shí)器初值高8位設(shè)置
TL1 = 0xF3; //定時(shí)器初值低8位設(shè)置
PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
TR1 = 1; //定時(shí)器啟動(dòng)   
}
/**********************************************************************************************/

/*********************************************************************************************
函數(shù)名:UART串口接收中斷處理函數(shù)
調(diào)  用:[SBUF收到數(shù)據(jù)后中斷處理]
參  數(shù):無(wú)
返回值:無(wú)
結(jié)  果:UART串口接收到數(shù)據(jù)時(shí)產(chǎn)生中斷,用戶對(duì)數(shù)據(jù)進(jìn)行處理(并發(fā)送回去)
備  注:過(guò)長(zhǎng)的處理程序會(huì)影響后面數(shù)據(jù)的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4  using 1{ //切換寄存器組到1
RI = 0;   //令接收中斷標(biāo)志位為0(軟件清零)
UART_RX = SBUF; //將接收到的數(shù)據(jù)送入變量 UART_data
RX_flag=1;  //標(biāo)記接收
//用戶函數(shù)內(nèi)容(用戶可使用UART_data做數(shù)據(jù)處理)

//SBUF = UART_data; //將接收的數(shù)據(jù)發(fā)送回去(刪除//即生效)
//while(TI == 0); //檢查發(fā)送中斷標(biāo)志位
//TI = 0;  //令發(fā)送中斷標(biāo)志位為0(軟件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:UART串口發(fā)送函數(shù)
調(diào)  用:UART_T (?);
參  數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
返回值:無(wú)
結(jié)  果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認(rèn)發(fā)送完成后退出,采用非中斷方式
備  注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定義串口發(fā)送數(shù)據(jù)變量
ES=0;    //禁止穿行中斷
SBUF = UART_data; //將接收的數(shù)據(jù)發(fā)送回去
while(TI == 0);  //檢查發(fā)送中斷標(biāo)志位
TI = 0;   //令發(fā)送中斷標(biāo)志位為0(軟件清零)
ES=1;   //打開穿行中斷
}
/*********************************************************************************************
函數(shù)名:UART串口發(fā)送字符串函數(shù)
調(diào)  用:UART_S (?);
參  數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
返回值:無(wú)
結(jié)  果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認(rèn)發(fā)送完成后退出,采用非中斷方式
備  注:
/**********************************************************************************************/
void UART_S(unsigned char *str)
{
while(1)
{
  if(*str=='\0') break;
  UART_T(*str++);
}
}
/*********************************************************************************************
函數(shù)名:主函數(shù)
調(diào)  用:main();
參  數(shù):
返回值:無(wú)
結(jié)  果:
備  注:
/**********************************************************************************************/
void main()
{
unsigned char Buf_data[]={"      welcome to MCU world.     \n\r"};
UART_init();
UART_S(Buf_data);
while(1){
  if(RX_flag==1)
  {
   UART_T(UART_RX);
   RX_flag=0;
  }
}
}
///////////////////////////////////////////////////////////////////
個(gè)人認(rèn)為普通單片機(jī)在通信頻率上及不上AVR單片機(jī),更可能使用USB轉(zhuǎn)串口工具進(jìn)行開發(fā),所以串口波特率不能過(guò)高,最好是2400或4800。過(guò)高只會(huì)導(dǎo)致亂碼或丟失。






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1