1. 程式人生 > >微控制器串列埠傳送和接受程式

微控制器串列埠傳送和接受程式

include "config.h"

/******************************串列埠1的波特率********************************/ //T1作波特率發生器 //在波特率加倍情況下  #define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 FF #define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 254 FE #define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 253 FD #define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 252 FC #define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 250 FA

#define SYS_Fosc 11059200L //晶振頻率 uint32_t COMM_BAUD_RATE=9600 ; //串列埠波特率 #define OSC_FREQ 11059200 //11059200

static INT8U Send_buf[10] = {0} ; static INT8U Recv_buf[10] = {0} ;

static INT8U SendDataLen = 0 ; static INT8U ResendDataLen = 0 ; /************************************************************************ 函 數 名: 串列埠初始化 功能描述: STC10L08XE 微控制器串列埠初始化函式 返回函式: none 其他說明: none **************************************************************************/ void UartIni(void) { TMOD = 0x20; // 設定 T1 為波特率發生器 SCON = 0x50; // 0101,0000 8位資料位, 無奇偶校驗 PCON = 0x00; //PCON=0;

TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);//設定為9600波特率 TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);

TR1 = 1; //定時器1開啟 REN = 1; //串列埠1接收使能 ES = 1; //串列埠1中斷使能 EA = 1;  } //串列埠接受函式初始化1 void UartIni1(void) { SCON = 0x50; //8-bit variable UART TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode TH1 = TL1 = -(SYS_Fosc/12/32/COMM_BAUD_RATE); //Set auto-reload vaule TR1 = 1; //Timer1 start run ES = 1; //Enable UART interrupt EA = 1; //Open master interrupt switch } /*********************************************************** * 名 稱:  * 功 能:  * 入口引數: 無  * 出口引數:無 * 說 明:  **********************************************************/ void Uart_Isr() interrupt 4 using 1 { if(RI) { }

} /************************************************************************ 功能描述: 串列埠傳送一位元組資料 sbuf=data  接受 data=sbuf 入口引數: DAT:帶傳送的資料 返 回 值: none 其他說明: none **************************************************************************/ void Uart_PutByte(uint8_t DAT) { ES = 0; TI=0; DAT=SBUF ; while(TI==0); TI=0; ES = 1; } ///***************************************************************************************************** // - 功能描述: 串列埠接受一幀資料 // - 隸屬模組: 內部  // - 引數說明:  // - 返回說明:  // - 注:無  //*****************************************************************************************************/ void SendCmd(INT8U len ) { INT8U i = 0 ; for(i=0; i<len; i++)//資料 { Uart_PutByte(Send_buf[i]) ; } }

///******************************************************************************************** // - 功能描述:求和校驗 // - 隸屬模組: // - 引數說明: // - 返回說明: // - 注: 和校驗的思路如下 // 傳送的指令,去掉起始和結束。將中間的6個位元組進行累加,最後取反碼 // 接收端就將接收到的一幀資料,去掉起始和結束。將中間的資料累加,再加上接收到的校驗 // 位元組。剛好為0.這樣就代表接收到的資料完全正確。 //********************************************************************************************/ void DoSum( INT8U *Str, INT8U len) { INT16U xorsum = 0; INT8U i;

for(i=0; i<len; i++) { xorsum = xorsum + Str[i]; } xorsum = 0 -xorsum; *(Str+i) = (INT8U)(xorsum >>8); *(Str+i+1) = (INT8U)(xorsum & 0x00ff); }

///******************************************************************************************** // - 功能描述: 串列埠向外傳送命令[包括控制和查詢] // - 隸屬模組: 外部 // - 引數說明: CMD:表示控制指令,請查閱指令表,還包括查詢的相關指令 // feedback:是否需要應答[0:不需要應答,1:需要應答] // data:傳送的引數 // - 返回說明: // - 注:  //********************************************************************************************/ void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat) { Send_buf[0] = 0xff; //保留位元組  Send_buf[1] = 0x06; //長度 Send_buf[2] = CMD; //控制指令 Send_buf[3] = feedback;//是否需要反饋 Send_buf[4] = (INT8U)(dat >> 8);//datah Send_buf[5] = (INT8U)(dat); //datal DoSum(&Send_buf[0],6); //校驗 SendCmd(8); //傳送此幀資料 }

/************************************************************************ 功能描述: 串列埠傳送字串資料 入口引數: *DAT:字串指標 返 回 值: none 其他說明: API 供外部使用,直觀! **************************************************************************/ void PrintCom(uint8_t *DAT) { while(*DAT) { Uart_PutByte(*DAT++); } }

/************************************************************************ 功能描述: 串列埠傳送字串資料 直接傳送 hex 檔案 0x0f 等價於 0f 入口引數: *DAT:字串指標 返 回 值: none 其他說明: API 供外部使用,直觀! **************************************************************************/ void PrintCom1(uint8_t *DAT) { int i; for(i=0;i<12;i++) { Uart_PutByte(*DAT++); //Uart_PutByte 串列埠傳送一位元組資料 sbuf=data  } }