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

📄 receivetest.c~

📁 关于rs485通信及iic通信的程序
💻 C~
📖 第 1 页 / 共 4 页
字号:
             if(UpdateFlag!=0)
             {                                                    
                UpdateFlag=0; 
                TWDR = IICSendBuff[IICSendCount];                
                if(7==IICSendCount)         //判断发送是否完成
                   {
                     UpdateFlag = 0;        //发送完成后标志置0
                   }  
               else   
                   {
                     IICSendCount++;
                   }
             }
             else
             {
                TWDR = 0;
             } 
             TWCR |= 0xC0; 
             break;       
        
         //已经发送了数据应答ACK
         case  0x80:                                     // 接收到主机发下来的数据,将数据保存到接收缓冲区中。如果一个数据包接收完毕,并且校验正确,则通过串行口发送出去
                                             
             IICReceiveBuff[IICReceiveCount] = TWDR;     // 接收数据 
             
             if(IICReceiveCount==8)
             {
                if(IICChecksum==0) 
                {
                  IICReceiveCount=0;
                  IIC_Receive_Handle();                  // 将IIC接收到的数据放到485发送缓冲区
                }
             }
             else
             {
                IICChecksum += IICReceiveBuff[IICReceiveCount];
                IICReceiveCount++;
             }   

            TWCR|=0XC0;
            break;    
        //case  0x88:                                    // 接收到数据,并返回NAK了。下一步是切换到未寻址从机模式,可以识别自己的SLA           
        //case  0xA0:                                    // 已发送数据,并接收到非ACK
        // case  0xC0:                                   // 总线结束,或总线重新启动
        default:                                         // 其它状态
            TWCR |= 0xC0;
             break;
    }
}


                                                            
//----------------------------------------------------------------------------------------------
//
// UART初始化
void  RS485_UARTInit(void)
{
// Declare your local variables here


// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x01;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=out Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=0 State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0xE4;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3.906 kHz
TCCR0=0xFC;
TCNT0=0x05;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0xd8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;  

//ReceiveFrameStatus = NOFRAME;
//AlarmStatus = 0x00;   
//ResetSendBuff();

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// 2 Wire Bus initialization
// Generate Acknowledge Pulse: On
// 2 Wire Bus Slave Address: 60h
// General Call Recognition: Off
// Bit Rate: 100.000 kHz
TWBR=0x0C;
TWAR=0xC0;
TWCR=0x45;

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
// WDTCR=0x1F;
// WDTCR=0x0F;
// 
// Global enable interrupts
#asm("sei")

DRE=0;                                    // 485总线初始化时处于接收状态
ReSendCount=0;                            // 重发计数器置0
Tx_Count=0;                               // 待发送数据的转换计算器置0
Tx_Send_End=0;                            // 发送结束标志置0
RS485_Send_Flag=0;                        // 发送标志位置0
ReSendFlag=0;                             // 重发标志位置0
Send_Answer_Flag=0;                       // 发送点对点回复包标志
Send_Broad_Flag=0;                        // 发送点对类,广播回复包标志
Answer_Data_Count=0;                      // 保存接收到的回复包数据计数器
RS485_Answer=0;                           // 回复包标志位置0,表示没有收到回复包
Send_Status=0;                            // 初始化发送数据状态
Add_Time_Flag=1;                          // 延时检测到总线不空闲加3ms延时 
IICReceiveCount=0;                        // IIC接收计数器清0
UpdateFlag=0;                             // IIC数据更新标志
Start_Delay=0;                            // 启动检测回复包标志清0,表示不启动
SetCurrentRS485RxStatus(RS485_Receive_IDLE);       // 将485接收状态改为空闲状态
}
  


//----------------------------------------------------------------------------------------------
//
//
void Send(INT8U Send_Buff[],INT8U Length,INT8U Address)
{                   

  if(RS485_Send_Flag==1)                              // 进入发送程序
  {                                            
     RS485_Send_Flag=0;
     if(RS485_Bus_Status==RS485_Bus_IDLE)           // 发送数据前判断总线状态是否为空闲,只有在空闲状态下才能发送数据
     {                                      

        Send_Data_Flag=1;
        RS485_Answer=0;
        //没有发送回复包标志,表示发送待发数据(包括重发数据),调用发送子程序
                 
        Send_Size=Length;                        // 获取发送数据的长度   
        P_RS485_Send_Buff=Send_Buff;             // 将指针P_RS485_Send_Buff指向发送缓冲区RS485_Send_Buff首地址   
        *P_RS485_Send_Buff=Address;
        
                               
        RS485_Send_Subprogram(); 
          
     }      
  }
  else if( Send_Data_Flag==1)
  {           
     if(Start_Delay==1)
     {  
           
       Start_Delay=0;                    // 启动检测回复包延时中断后,将启动标志清0
       Check_Time=Check_Count;
       Delay_Status=Check_Delay;         // 进入检测回复包延时中断
//                    
//        // 启动定时溢出中断,等待数据发送完,并接收到回复包  
//        TCNT0=0x3D;                       // 定时50ms      
//        TCCR0=0x05;                       // 1024分频                                                  
     }            
       
     else
     {
         // Place your code here
     }                 
     
  }              

}





//----------------------------------------------------------------------------------------------
//
//检测接收缓冲区,判断是否接收到数据,接收到返回1,没接收到返回0
INT8U Check_Status(void)
{
  if(RS485_Receive_End==1)
  { 
    RS485_Receive_End=0;
    //RS485_Receive_Save_Data();                      // 对接收到的数据进行处理 
    if(Check_Receive_Data_Flag==1)
    {
     Check_Receive_Data_Flag=0;
     return 1;
    }
  }
  else
  {
    return 0;
  }


}



//----------------------------------------------------------------------------------------------
//
void Read_Receive_Data(INT8U Receive_Buff[]) 
{
   // 进行保存数据   
 
  INT8U Save_Count=0;                              // 保存接收到的数据计数器
  INT8U i;
  for(i=0;i<Byte_Len;i++)
  {
     Receive_Buff[Save_Count]=RS485_Receive_Buff[i];
     Save_Count++;  
  }  
  IIC_Send_Handle();                                    // 调用IIC处理函数 
}






//----------------------------------------------------------------------------------------------
//
// 主程序
void main(void)
{
  
  INT8U Check_Flag; 
  //初始化UART
  RS485_UARTInit(); 
  RS485_Send_Flag=1;
  while(1)
  {   
   
      delay_ms(1000);
      led1=!led1;
      
      // 发送数据函数
     Send(RS485_Send_Buff,40,0x08);    
      // 检测是否接收到有效数据
      Check_Flag=Check_Status(); 
      // 接收到读取数据
      // 所谓的读取数据是否包括保存数据到二级缓冲区,调用IIC发送,启动发送回复包
      if(Check_Flag==1)
      {      
        Read_Receive_Data(RS485_Receive_Save);      
      }  

  }               

}  

⌨️ 快捷键说明

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