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

📄 uartgai._c

📁 一个6缸发动机的ECU控制程序
💻 _C
字号:
#define FRAMING_ERROR (1<<FE0) 
#define PARITY_ERROR (1<<UPE0) 
#define DATA_OVERRUN (1<<DOR0) 
#define DATA_REGISTER_EMPTY (1<<UDRE0) 
#define RX_COMPLETE (1<<RXC0) 

#define FRAMEFLAG1 0xFF  
#define REVSUCCEED 0x00  //接收成功回传标志
#define SENDAGAIN  0xFE  //重发标志

// USART0 Receiver buffer 
#define RX_BUFFER_SIZE0 8 
char rx_buffer0[RX_BUFFER_SIZE0]; 
volatile unsigned char rx_rd_index0,rx_counter0; 
// This flag is set on when USART0 Receival is error 
volatile unsigned char rx_error0;
volatile unsigned char FrameHead0;

void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x26;
 UBRR0L = 0x33; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0xD8;
 FlashRxBuf();
}

void FlashRxBuf(void)
{
  rx_error0 = 0;
  rx_counter0 = 0;
  rx_rd_index0 = 0;
  FrameHead0 = 0;
}

char TestFrameHead(char data)
{
  if(data == FRAMEFLAG1)  //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
    return 1;
  else 
    return 0;	
}
// USART0 Receiver interrupt service routine 
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void) 
{ 
  char status,data; 

  status=UCSR0A; 
  data=UDR0; 
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
    { 
	  if(FrameHead == 0 && rx_counter0 == 0)  //判断是否帧头
	    if(TestFrameHead(data))    //数据有效才设置FrameHead
	       FrameHead = data;
	  else 
	    {	
         rx_buffer0[rx_counter0]=data;  
         if (++rx_counter0 == RX_BUFFER_SIZE0) 
          { 
            rx_counter0 = 0; 
            rx_error0 = 1; 
          } 
		} 
     } 
  else rx_error0 = 1 ;	 
} 



// Get a character from the USART0 Receiver buffer 
char getchar(void) 
{ 
  char data; 
  while (rx_counter0==0); 
  data=rx_buffer0[rx_rd_index0]; 
  if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; 
  #asm("cli") 
  --rx_counter0; 
  #asm("sei") 
  return data; 
}


// USART0 Transmitter buffer 
#define TX_BUFFER_SIZE0 8 
char tx_buffer0[TX_BUFFER_SIZE0]; 
volatile unsigned char tx_wr_index0,tx_rd_index0,tx_counter0; 

// USART0 Transmitter interrupt service routine 
#pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
void uart0_tx_isr(void)
{ 
  if (tx_counter0) 
    { 
      --tx_counter0; 
      UDR0=tx_buffer0[tx_rd_index0]; 
      if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; 
    }; 
} 



// Write a character to the USART0 Transmitter buffer 
void putchar(char c) 
{ 
  while (tx_counter0 == TX_BUFFER_SIZE0); 
  #asm("cli") 
  if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) 
    { 
      tx_buffer0[tx_wr_index0]=c; 
      if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; 
      ++tx_counter0; 
    } 
  else 
    UDR0=c; 
  #asm("sei") 
} 

void DisposeBufDatas(void)
{
 //定义变量
 unsigned char tPumpCyc;         //换能器周期,单位s
 unsigned char tSprayOn;         //喷射脉宽,单位0.1ms
 unsigned char tSprayCyc;        //喷射周期,单位ms
 unsigned char tPivDelay;        //piv脉宽延时,单位0.1ms
 char sprayNumL;                 //SprayNum低字节
 char sprayNumH;                 //SprayNum高字节
 
 if(rx_error0)                 //接收错误
   putchar(SENDAGAIN);
 else
 {
   sprayNumL = getchar();
   sprayNumH = getchar();
   tPumpCyc = getchar();
   tSprayOn = getchar();
   tSprayCyc = getchar();
   tPivDelay = getchar();
   
   //转换数据
   SparyNum = (int)sprayNumL + ((int)sprayNumH << 8);
   T1OveForPump = (unsigned char)(tPumpCyc * 1000 / (2 * 524.288));
   CSprayOn = (unsigned char)(tSprayOn * 100 / 8);
   CSprayCyc = (unsigned char)(tSprayCyc * 1000 / 8);
   CPivDelay = (unsigned char)(tPivDelay * 100 /8);
   
   putchar(REVSUCCEED);  //回传接收成功标志
 }
 FlashRxBuf(); 
   
}//DisposeBufDatas(void)结束

⌨️ 快捷键说明

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