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

📄 serial.c

📁 控制X射线和高压源的典型应用程序
💻 C
字号:


//*************************************************************************
//串口中断服务程序
//*************************************************************************
//#include "TestSerial.h" 
#include <c8051f060.h>                    // SFR declarations
#include <stdio.h>

#define DB_SENDMAXSIZE 30                  //上传最大可能长度 30 字节。
#define DB_RECMAXSIZE  9                   //下传最大可能长度 9 字节。
//#define UpSize         13
#define ModuAddr     170                //= 170 ;0XAA
#define  SYSCLK 24500000  //22118400                   // SYSCLK frequency in Hz   24500000 //
#define  BAUDRATE   9600                   // 115200用户定义的timer1 波特率


unsigned char UpSize = 13  ;
bit CommRecDataOverflowFlag,FlagRecComm,SendItComm;
unsigned char Count1ms,DownSize = 3 , AddSum ;
unsigned char CommSendBufferHead, CommSendBufferTail;
unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE] ; 
unsigned char CommRecBufferHead, CommRecBufferTail;
unsigned char xdata CommRecBuffer[DB_RECMAXSIZE]; 

sbit R485 = P2^1;  //P0^2 ; //P5^3;                              //485 接收/发送, 选择位。

void ClearCommRecBuffer(void)
{
  char   data  old_SFRPAGE ;
  old_SFRPAGE = SFRPAGE  ;
    SFRPAGE = 0X00 ;
	CommRecBufferTail=0;
	FlagRecComm=0;
    CommRecBuffer[0]  = 0x00;
    CommRecBuffer[1]  = 0x00;
    CommRecBuffer[40] = 0x00;
    DownSize = 3;

  SFRPAGE = old_SFRPAGE ;
}

void OpenComm(void) 
{
   char   data  old_SFRPAGE ;
    old_SFRPAGE = SFRPAGE  ;
    SFRPAGE = 0X00 ;
    R485 = 0;                               // 0:接收数据。
   
	
   // FOLLOW IS FOR TIMER0,1 INIT.
    PCON  |= 0x80;		        // 电源控制寄存器
	TMOD   = 0x21;	       	    // Configure Timer 0,1 for use.
	CKCON |= 0x12;		        // Timer 1 derived from SYSCLK.
    TH1    = -(SYSCLK/BAUDRATE/16);  //SYSCLK = 22.1168 ,BAUDRATE/16 
	TR1    = 1  ;    			    // Start Timer 1
	TR0    = 1 ;
	CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
	CommRecBufferHead=CommRecBufferTail=0;
	FlagRecComm=0;

	// FOLLOW IS FOR UART0 INIT.
   SFRPAGE = UART0_PAGE;	
   SCON0   = 0x50;                     // SCON: mode 1, 8-bit UART, enable RX
   SSTA0   = 0x10;                     // BY Timer 1 generates UART0 baud rate and
                                       // 禁止UART0 的波特率/2 功能.
    RI0=0;					// Clear UART0 receive.
	TI0=0;					// Clear UART0  transmit.
	
	ES0=1; 					// allow the serial interrupt

	SendItComm=1;           // 	enable send the data to SBUF0.
   
	SFRPAGE = old_SFRPAGE ;
	}
//---------------------------------------------------------------------
//通信预置数据
//-----------------------------------------------------------------------

void SendCommBuffer(unsigned char *base, unsigned char Len)  //  UpSize = 8 个上传数据
{
  unsigned char i=0, AddSum ;
	
	if (SendItComm)
	{
       R485 = 1;                                 // 1;发送数据。
       i = 0 ;
       AddSum = 0; 
	   while (i<Len-1)                 //i = 0 --- 6 为要传送的数据,放入缓冲区。 
      	 {	 
	       AddSum +=  base[i] ;
		   CommSendBuffer[i]=base[i]; 
	       i++;
	      }
          CommSendBuffer[Len-1] =  AddSum;  // [7] 为ADDSUM at end, place the addsum.
       }
  CommSendBufferHead=0;
  SBUF0=CommSendBuffer[CommSendBufferHead];          // send the first  byte,开始通讯.
}

//--------------------------------------------------------------------------
//通信中断程序
//---------------------------------------------------------------------------

void CommISR(void) interrupt 4  using 3
{
  
    unsigned char i=0;
	if (TI0)                                          //清除发送中断标志
	{
	    TI0=0;
        CommSendBufferHead++; 	
		
		if (CommSendBufferHead != (UpSize) )  //UpSize = 8 则上传0--7 共8个数据 ,
		   {	 
			SBUF0=CommSendBuffer[CommSendBufferHead]; // < 13 ,0--12 共13个数据被发送.send the next byte
			SendItComm=0;
		   }
       else                                        // = 13 相等,本次通讯完成。
            {
	    	SendItComm=1;                             //允许进行下一次通讯。
	        R485 = 0;                                 // 0:接收数据。
            DownSize = 3;
			}
    }

	if (RI0)
    	{	 
		RI0=0;                                      //清除接收中断标志
		CommRecBuffer[CommRecBufferTail]=SBUF0;     //receive data。           
	    CommRecBufferTail++;
        if (CommRecBufferTail >= DB_RECMAXSIZE)
		 {
		   CommRecBufferTail = 0 ;                 //如果接受的数据比缓冲区还长,指针清零.
		 }
		if ( CommRecBuffer[0]== ModuAddr )        //是本设备接收的地址吗?
		 {
	            if (CommRecBufferTail==2)           //先加指针,因此=2。
	               {
                      DownSize = CommRecBuffer[1];      //指针在0Xa5后第一个单元。
			       }
		        if (CommRecBufferTail>=DownSize)         //本次通讯,数据已传输完了吗?
 	               {
				        for (i=0; i<DownSize-1 ;i++)
                           {
              	             AddSum =  AddSum +  CommRecBuffer[ i ] ;
					   	   }
	                 	if ( CommRecBuffer[ DownSize-1 ]== AddSum)  // 累加和相等吗?
		  	               { 
		                    	FlagRecComm=1;          //本次通讯数据正确,通知主程序取数。
                                DownSize = 3;               //否则只修改指针,不通知主程序取数。
                                REN0 = 0;               //禁止UART0 接收数据,主程序取数后再打开
					       }
                    CommRecBufferTail = 0x00;           //只要指针大于DownSize,将指针恢复到起始地址。
                    AddSum = 0;                         //清除累加和。
                    CommRecBuffer[ 0 ] = 0;
                    DownSize = 3; 
	   	           }                                 
          
	      }
 		  if ( CommRecBuffer[0]!= ModuAddr )
		  {
            CommRecBufferTail = 0x00;              //第一个字符不相等,将指针恢复到起始地址。
            AddSum = 0;                            //清除累加和。
 		  }
     } 
}






⌨️ 快捷键说明

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