⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seriele.c

📁 C51 CAN开发测试软件和驱动程序
💻 C
字号:

#ifndef  _SERIAL_H
#define  _SERIAL_H

#include <P8XC5X2.H>
#include <intrins.h>
#include <string.h>
//数据类型定义
#define   uchar  unsigned char
#define   ulong  unsigned long
#define   uint   unsigned int  
//串口状态定义
#define   RCV_IDH      0             //接收描述符的高8位
#define   RCV_IDL      1             //接收id的低3位+rtr位+dlc(4位)
#define   RCV_DATA     2             //接收数据


uchar     data  Rcv_Status=0;        //接收状态字节
uchar     data  Rcv_Point =0;        //接收计数

uchar     data  Send_Point=0;        //发送计数 

uchar     idata  RcvBuf[0x10];        //接收数据缓冲区
uchar     idata  SendBuf[0x10];       //发送数据缓冲区
extern     uchar     data   DispBuf[5];

bit       UartRcvGood;

void  InitUart(void);               //初始化串口

void   Exe_Scon(uchar cmd,uchar dlc,uchar *databuf);//串口发送函数

/*-------------------------------------------------------------------------------------------
 串口中断函数
 -------------------------------------------------------------------------------------------*/    
void  Uart_Val(void)  interrupt 4   using 3
{
  uchar   TempData;    //临时变量
  if(_testbit_(RI))
  {
    TempData=SBUF;
    switch(Rcv_Status)
    { 
      case RCV_IDH:
           RcvBuf[0]=TempData;
		   Rcv_Status++;
		   break;
      case RCV_IDL:
	       RcvBuf[1]=TempData;
		   if((RcvBuf[1]&0x10)!=0)           //远程帧
 		   {
             Rcv_Status=0;
 		     UartRcvGood=1;
		   }
		   else								//数据帧
		   {
		     Rcv_Point=2;//TempData&0x0f;     //取数据长度
		     Rcv_Status++;
		   }
		   break;
      case RCV_DATA:
	       RcvBuf[Rcv_Point]=TempData;
           Rcv_Point++;
		   if((Rcv_Point-2)==(RcvBuf[1]&0x0f))
           {
             Rcv_Point=0;
             Rcv_Status=0;
			 UartRcvGood=1;
		   }
		   break;
      default:
           break; 
    }
  }                     //结束if(_testbit(RI))
  if(_testbit_(TI))
  {
    Send_Point++;        
    if(Send_Point<(SendBuf[2]+4))   //未发送完毕,继续发送
      SBUF=SendBuf[Send_Point];
    else
    {
     Send_Point=0;
    }
  }//结束if(_testbit(TI))
} 


/*-------------------------------------------------------------------------------------------
 函数原型:  void  InitUart(void)		                    
 参数说明:  无                                                        
 返回值:    无 
 说明:		用于初始化串口               
 -------------------------------------------------------------------------------------------*/    
void  InitUart(void)
{
  SCON =  0x50;     //串口工作方式1
  TMOD |= 0x20;     //T1,初值自动重装
  TH1  =  0xfd;     //波特率9600bps  @ 11,0592M
  TL1  =  0xfd; 
  TR1  =  1;        //开始计数
  IE  |=  0x90;     //开放串口中断

}

//
void   Exe_Scon(uchar cmd,uchar dlc,uchar *databuf)
{ 
  uchar  i,bcc=0;
  SendBuf[0] = 0x00;
  SendBuf[1] = cmd;
  SendBuf[2] = dlc;
  memcpy(&(SendBuf+3),databuf,dlc); 
  for(i=0; i<dlc+3;i++)
    bcc^=SendBuf[i];
  SendBuf[dlc+3] = bcc;
  Send_Point=0; 
  SBUF  = SendBuf[0];
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -