#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
}
}
