基于单片机的串口接收程序

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


 

猜你喜欢

转载自blog.csdn.net/qq_36958104/article/details/81138386