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

📄 uart._c

📁 一个6缸发动机的ECU控制程序
💻 _C
字号:
#include <iom88v.h>
#include <macros.h>
#include <uart.h>
#include <timer1.h>

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

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Even
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();
}



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; 
//  		 putchar(251);  //回传接收成功标志 debug
//         putchar(251);  //回传接收成功标志debug
//  if(data == 0xFF)  //DEBUG
//    UDR0 = data;   //DEBUG
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
    { 
	  if(FrameHead0 == 0 && rx_counter0 == 0)  //判断是否帧头
	   {
	    if(TestFrameHead(data))    //数据有效才设置FrameHead	
		 {
	       FrameHead0 = data;
		 }  
	   } 
		
	  else 
	    {	
         rx_buffer0[rx_counter0]=data;  
//		 putchar(251);  //回传接收成功标志 debug
//         putchar(251);  //回传接收成功标志debug
         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; 
  char IisOn = 1;
  if((SREG & 0x80) == 0x00)  //I之前是否置位
    IisOn = 0;
	
  while (rx_counter0==0); 
  data=rx_buffer0[rx_rd_index0]; 
  if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; 
  CLI(); 
  --rx_counter0; 
  if(IisOn)
    SEI(); 
  return data; 
}




// 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) 
{ 
  char IisOn = 1;
  if((SREG & 0x80) == 0x00)  //I之前是否置位
    IisOn = 0;
  while (tx_counter0 == TX_BUFFER_SIZE0); 
  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;
  if(IisOn)	 	
    SEI(); 
} 

void DisposeBufDatas(void)
{
 //定义变量
 unsigned char tPump1Cyc;         //油泵1周期,单位ms
 unsigned char tSpray1On;         //喷射脉宽,单位0.1ms
 //unsigned char tSpray1OnH;
 unsigned int tSpray1Cyc;        //喷射周期,单位ms
 unsigned char tPump1On;       //油泵1脉宽,单位0.1ms
 char spray1NumL;                 //SprayNum低字节
 char spray1NumH;                 //SprayNum高字节
 
 unsigned char tPump2Cyc;         //油泵2周期,单位ms
 unsigned char tSpray2On;         //喷射脉宽,单位0.1ms
 unsigned int tSpray2Cyc;        //喷射周期,单位ms
 unsigned char tPump2On;       //油泵2脉宽,单位0.1ms
 char spray2NumL;                 //SprayNum低字节
 char spray2NumH;                 //SprayNum高字节
 
 char IisOn = 1;
 if((SREG & 0x80) == 0x00)  //I之前是否置位
   IisOn = 0;
 
 if(rx_error0)                 //接收错误
  {
   CLI();
   putchar(SENDAGAIN);
   putchar(SENDAGAIN);
   if(IisOn)	
     SEI();
  } 
 else
 { 
   spray1NumL = getchar();
   spray1NumH = getchar();
   tSpray1On = getchar();
   tSpray1Cyc = getchar();
   tPump1Cyc = getchar();
   tPump1On = getchar();
   
   spray2NumL = getchar();
   spray2NumH = getchar();
   tSpray2On = getchar();
   tSpray2Cyc = getchar();
   tPump2Cyc = getchar();
   tPump2On = getchar();
   
/************debug*****************/
     //putchar(sprayNumL);   //debug
	 //putchar(sprayNumH);   //debug
	// putchar(tPump1Cyc);   //debug
	 //putchar(tSprayOn);   //debug
	 //putchar(tSprayCyc);   //debug
	 //putchar(tPivDelay);   //debug

//**********************************/   
   
   //转换数据
   Pump1Num = (int)spray1NumL + ((int)spray1NumH << 8);
   PPump1Num = Pump1Num;
   Spray1Num = Pump1Num ;
   SSpray1Num = Spray1Num;
   CPump1Cyc = tPump1Cyc * 1000-370;//修正0.37ms
   CPump1CycH = (CPump1Cyc >> 8);
   CSpray1On = (unsigned int)(tSpray1On  * 100 );
   CSpray1Cyc = (unsigned long )tSpray1Cyc * 1000 ;
   CPump1On = tPump1On * 1000;
   CPump1OnH = (CPump1On >> 8);
   
   Spray2Num = (int)spray2NumL + ((int)spray2NumH << 8);
   Pump2Num = Spray2Num;
   PPump2Num = Pump2Num;
   SSpray2Num = Spray2Num;
   //Pump2Num =  Pump1Num;
   CPump2Cyc = tPump2Cyc * 1000 -350;
   //CPump2Cyc = CPump1Cyc;
   CPump2CycH = (CPump2Cyc >> 8);
   //CPump2CycH =CPump1CycH ;
   CSpray2On = (unsigned int)(tSpray2On  * 100 );
   CSpray2Cyc = (unsigned long )tSpray2Cyc * 1000 ;
   CPump2On = tPump2On * 1000 -200;
   //CPump2On = CPump1On;
   CPump2OnH = (CPump2On >> 8);
   //CPump2OnH = CPump1OnH;
	 HighByte1 = (unsigned char )(CSpray1Cyc >> 16);
	 HighByte2 = (unsigned char )(CSpray2Cyc >> 16);
 
  
   CLI();                //禁止中断,保证以下发送的两字节连续
   putchar(REVSUCCEED);  //回传接收成功标志
   putchar(REVSUCCEED);  //回传接收成功标志

   if(IisOn)
     SEI();
 }
 FlashRxBuf(); 
   
}//DisposeBufDatas(void)结束

⌨️ 快捷键说明

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