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

📄 process.c

📁 AVR mega16的单片机程序
💻 C
字号:
#include  <iom16.h>
#include  <stdio.h>
#include  <string.h>
#include  <ina90.h>
#include  "Public.h"
#include  "Process.h"
void Delay(void);
uint times  ;

void (* reset) (void) ;
extern void USART_Transmit( unsigned char data );
/* Return 0 (FALSE) if the receive buffer is empty */
unsigned char DataInReceiveBuffer( void )
{
 if(USART_RxHead == USART_RxTail)
     return 0;
 else
     return 1;


}
void Delay(void)
{
  uchar i;
if( Work_Mode == 0xA2)
{ // 控制机模式
for(i = 0 ; i < 30 ; i++ )
      _NOP();
}
else
{
for(i = 0 ; i < 50 ; i++ )
      _NOP();
}

}

/* Host 模式下的输入数据*/
signed char  Read_Data(uchar * data)
{

*data = PINA;

return TRUE;

}
void Out_Data(uchar * data)
{

PORTB |= (*data&0x0f) ;
PORTB &= ((*data&0x0f)|0xf0) ;
PORTD |= (*data&0xf0) ;
PORTD &= ((*data&0xf0)|0x0f) ;

}


void WatchDog(void)
{
    if((time_100ms%6)>=0&&(time_100ms%6)<3)
          DOG_H ;
    else  DOG_L ;
}
void  Usart_Process(void)
{

  uchar i,j ;


if( DataInReceiveBuffer() == 1 )
        {
          for(i = USART_RxTail ; i < USART_RxHead ; )
          {
            if(USART_RxBuf[i++] == '$' && USART_RxBuf[USART_RxHead ] == '^')
            {
                i ++ ;
              switch (USART_RxBuf[i++])
             {
             case '0':
                     if(Send_Mode!= 0xA0)
                     {
                     Send_Mode= 0xA0 ;
                     EEPROM_write(0x90,Send_Mode);
                     }
                     Send_String("$A0^");
                     Send_Enable = TRUE ;

             break;
             case '1':
                     if(Send_Mode != 0xA1 )
                     {
                       Send_Mode= 0xA1 ;
                       EEPROM_write(0x90,Send_Mode);
                     }
                     Send_String("$A1^");
             break;
             case '2':
                    if(Work_Mode != 0xA2 )
                     {
                       Work_Mode= 0xA2 ;
                       EEPROM_write(0x80,Work_Mode);
                       Send_String("$A2^");
                       reset=0;
                       reset ();//while(1); //工作模式发生改变 需要复位CPU,使用外部 Watchdog 完成
                     }
                     Send_String("$A2^");
             break;
             case '3':
                    if(Work_Mode != 0xA3 )
                     {
                       Work_Mode= 0xA3 ;
                       EEPROM_write(0x80,Work_Mode);
                       Send_String("$A3^");
                       reset=0;
                       reset ();while(1); //工作模式发生改变 需要复位CPU,使用外部 Watchdog 完成

                     }
                     Send_String("$A3^");

             break;
             case '4':
                    for(j = 0; j < 24 ; j++)
                       EEPROM_write(0xA0+j,USART_RxBuf[i++]);
                   for(j = 0; j < 24 ; j++)
                      tempbuf[j] = EEPROM_read(0xA0+j);
                      Send_String("$A4");
                      Send_String(tempbuf);
                      Send_String("^");
                   for(j = 0; j < 12 ; j++)
                   {
                     Send_DataBuf[j] = AscToHex(EEPROM_read(0xA0+2*j),EEPROM_read(0xA0+2*j+1));
                   }
                break;
             case '5':
                    for(j = 0; j < 24 ; j++)
                       EEPROM_write(0xC0+j,USART_RxBuf[i++]);
                   for(j = 0; j < 24 ; j++)
                      tempbuf[j] = EEPROM_read(0xC0+j);
                      Send_String("$A5");
                      Send_String(tempbuf);
                      Send_String("^");
                   for(j = 0; j < 12 ; j++)
                   {
                     Send_DataBuf[j] = AscToHex(EEPROM_read(0xC0+2*j),EEPROM_read(0xC0+2*j+1));
                   }
                break;
             case '8':
                     Send_Mode=EEPROM_read(0x90);
                     if(Send_Mode == 0xA0)
                        Send_String("$A0^");
                     else if(Send_Mode == 0xA1)
                        Send_String("$A1^");
                     else
                        Send_String("$AE^"); // error
             break;
             case '9':
                     Work_Mode=EEPROM_read(0x80);
                     if(Work_Mode == 0xA2)
                        Send_String("$A2^");
                     else if(Work_Mode == 0xA3)
                        Send_String("$A3^");
                     else
                        Send_String("$AE^"); // error
             break;
             case 'A':
                   for(j = 0; j < 24 ; j++)
                      tempbuf[j] = EEPROM_read(0xA0+j);
                      Send_String("$AA");
                      Send_String(tempbuf);
                      Send_String("^");
             break;
             case 'B':
                   for(j = 0; j < 24 ; j++)
                      tempbuf[j] = EEPROM_read(0xC0+j);
                      Send_String("$AB");
                      Send_String(tempbuf);
                      Send_String("^");
             break;
             case 'C':
                       Send_String("$AC");
                       itostr(tempbuf,Report.Ok);
                       Send_String(tempbuf);
                       Send_String("-");
                       itostr(tempbuf,Report.Error);
                       Send_String(tempbuf);
                      /*  Send_String("-");
                      itostr((char*)tempbuf,Report.Over);
                       Send_String(tempbuf);*/
                       Send_String("^");

             break;

             default:
             break;
            }

        if( USART_RxBuf[USART_RxHead ] == '^')
          USART_RxTail = USART_RxHead = 0 ;


           }

        }
      // memset(USART_RxBuf,'\0',64);

        }

}
void  Host_Process(void)
{
    uchar i  ;

if(Send_Enable == TRUE)
   {
     IBFA_L;
     OBFA_H;

         time_10ms = 0 ;
         Send_Over=FALSE;
         Send_Enable=FALSE;

         times = 0;

           INTRA_H;
           Delay();
           INTRA_L;  //    给下位机产生中断信号
           Delay();
           INTRA_H;
           Delay();

       while( PC2_IN ==0x00 ) //等待 从机响应中断
            {
              if(times >delay*30)
              {
           //  #if DEBUG == 1
            //    Send_String("$S0");
          //    #endif
                LED_Mode = 3 ;
                  goto M5_2;
              }
              times ++ ;
            }

        Out_Data(Send_DataBuf); // 发送第一个字节数据
        OBFA_H;Delay();
        OBFA_L;Delay();// 输出缓冲区满给从机

 for(i = 1 ; i < 12 ; i++ )
          {

            times = 0 ;

            while( ACKA !=0x00 ) // 从机接受应答
            {
              if(times>delay)
              {
          //    #if DEBUG == 1
              //  Send_String("$S");
          //    #endif
             //  Report.Over ++;

                LED_Mode = 3 ;//3
                goto M5_2;
              }
              times ++ ;
            }

             Out_Data(Send_DataBuf+i);
             OBFA_H;Delay();
             OBFA_L;Delay();

          }

//  read data
times = 0;
   IBFA_L;//Delay();
  for(i = 0 ; i < 12 ; i++ )
          {
            times = 0 ;

            while( STBA !=0x00 )
            {
              if(times>delay)
              {
          //    #if DEBUG == 1
              //  Send_String("$R");
           //   #endif
          //      Report.Over ++;
                 LED_Mode = 3 ;//3
                goto M5_2;
              }
              times ++ ;
            }

            Read_Data(Read_DataBuf+i);
            IBFA_H;Delay();//输入缓冲满
            IBFA_L;Delay();//数据主机已读出

         }

         Report.Ok ++;
         LED_Mode=1;
         IBFA_L;
         OBFA_H;
          Delay();
         return ;
M5_2:
         Report.Error ++;
         IBFA_L;
         OBFA_H;
          Delay();
     }

}
void  Device_Process(void)
{
    uchar i ;
    // char s[10];

 time_10ms = 0 ;


 STBA_H;
 ACKA_H;
 PC2_H; // 响应中断
 //Delay(); //Delay(); Delay();
 for(i = 0 ; i < 12 ; i++ )
     {
         times = 0;
         while( OBFA != 0 )
            {
                 if(times>delay)
                    {
//                    #if DEBUG == 1
                    //  Send_String("$R");
 //                   #endif
                     // Report.Over ++;
                      LED_Mode = 4;
                      goto M5_2;
                  }
                   times ++ ;
            }
        // 主机输出缓冲满则读出数据

            Read_Data(Read_DataBuf+i);
            ACKA_L;PC2_L;Delay();
            ACKA_H;PC2_H;Delay(); // ack有低到高表示已将数据读出

     }
// 判断接收数据是否正确
  if( Read_DataBuf[11] != 0xCC
                ||(Read_DataBuf[0] != 0xAA && Read_DataBuf[0] != 0xA5))
            {
              LED_Mode = 4 ;
//#if DEBUG == 1
          //     Send_String("Error");
//#endif
            for(i = 0 ;i <12 ; i++ )
           {
             USART_Transmit( (HexToAsc(Read_DataBuf[i])&0xff00)>>8); // Echo the received character
             USART_Transmit( HexToAsc(Read_DataBuf[i])&0x00ff); // Echo the received character
           }
                goto M5_2;
            }

/// Send data
 times = 0;
       while( IBFA !=0x00 )
            {
              if(times >delay)
              {
//             #if DEBUG == 1
          //      Send_String("$S0");
//              #endif
                  goto M5_2;
              }
              times ++ ;
            }

        Out_Data(Read_DataBuf);
        STBA_H;Delay();
        STBA_L;Delay(); // 选通发送第一字节数据
   for(i = 1 ; i < 12 ; i++ )
      {

         times = 0;
         while( IBFA != 0x00 )
            {
                if(times>delay)
                    {
 //                   #if DEBUG == 1
                  //    Send_String("$S");
  //                  #endif
                 //     Report.Over ++;
                      LED_Mode = 4 ;
                      goto M5_2;
                  }
                   times ++ ;
            }

        Out_Data(Read_DataBuf+i);
        STBA_H;Delay();
        STBA_L;Delay();//选通发送下一字节数据
      }


 Report.Ok ++;
 LED_Mode = 2 ;
/*
#if DEBUG == 1
      Send_String("$AK^");
//            Read_DataBuf[12]=0;
 //            Send_String(Read_DataBuf);
//             sprintf(s,"times= %d\n\r",Report.Ok);

        //
  s[0]='0'+(Report.Ok%100000)/10000;
  s[1]='0'+(Report.Ok%10000)/1000;
  s[2]='0'+(Report.Ok%1000)/100;
  s[3]='0'+(Report.Ok%100)/10;
  s[4]='0'+(Report.Ok%10);
  s[5]=0;
           Send_String((uchar*)s);
           Send_String("\n\r");


#endif
*/
       STBA_H;
       PC2_L;
       ACKA_H;
        Delay();
       return ;
 M5_2:
       Report.Error ++;
       STBA_H;
       PC2_L;
       ACKA_H;
      Delay();
}

⌨️ 快捷键说明

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