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

📄 process_bak.c

📁 AVR mega16的单片机程序
💻 C
字号:
#include  <iom16.h>
#include  <stdio.h>
#include  <ina90.h>
#include  "Public.h"
#include  "Process.h"

void (* reset) (void) ;

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

}


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

while( STBA != 0x00 )
{
/*  if(Over_Timer > 10*60) // 等待 1分钟
  {
    return OVER;
  }*/
  if(Over_Timer > 10) // 等待 1分钟
  {
    return OVER;
  }
}
IBFA_H;
_NOP();
*data = PINA;
IBFA_L;

return TRUE;

}
/* Host 模式下的输出数据*/
signed char Host_Out_Data(uchar * data)
{

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

PORTD |= (*data&0xf0) ;
PORTD &= ((*data&0xf0)|0x0f) ;
Send_Over=FALSE;
while( PC2_IN ==0x00 )
{
  if(Send_Over == TRUE)
    return OVER;
}

//OBFA_H;
_NOP();
OBFA_L;

while( ACKA !=0x00 )
{
  if(Send_Over == TRUE)
  {
    OBFA_H;
    return OVER;
  }
}
OBFA_H;

return TRUE;

}
/* Device 模式下的读入数据*/
signed char Device_Read_Data(uchar * data)
{

PC2_H;
ACKA_H;
_NOP();
while( OBFA != 0 )
{
  if(Send_Over == TRUE)
  {
    PC2_L;
    return OVER;
  }
}

*data = PINA;
PC2_L;
ACKA_L;
_NOP();
//ACKA_H;
return TRUE;
}
/* Device 模式下的输出数据*/
signed char Device_Out_Data(uchar * data)
{

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

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

STBA_L;
_NOP();
//STBA_H;
/*
while( IBFA != 1 )
{
  if(Send_Over == TRUE)
    return OVER;
}
*/
while( IBFA != 0 )
{
  if(Send_Over == TRUE)
    return OVER;
}
STBA_H;
return TRUE;

}
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^");
             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(0xA0+j);
                      Send_String("$AB");
                      Send_String(tempbuf);
                      Send_String("^");
             break;
             case 'C':
                       Send_String("$AC");
                       itostr((char*)tempbuf,Report.Ok);
                       Send_String(tempbuf);
                       Send_String("-");
                       itostr((char*)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 ;
        }
}
void  Host_Process(void)
{
    uchar i  ;
  signed char flag;
if(Send_Enable == TRUE)
          {
            Send_Enable = FALSE;
        /*
            for(i = 0 ;i <12 ; i++ )
           {
             USART_Transmit( (HexToAsc(Send_DataBuf[i])&0xff00)>>8); // Echo the received character
             USART_Transmit( HexToAsc(Send_DataBuf[i])&0x00ff); // Echo the received character
           }
        */
//    给下位机产生中断信号
            INTRA_H;
            INTRA_L;
           for(i = 0 ; i < 30 ; i++ )
          {
            _NOP();
          }
            INTRA_H;

        for(i = 0 ; i < 12 ; i++ )
          {
            flag = Host_Out_Data(Send_DataBuf+i);
            if( flag == FALSE)
            {
            LED_Mode = 3 ;
            #if DEBUG == 1
               Send_String("$AR^");
            #endif
               Report.Error ++;
               return ;
            }
           else  if( flag == OVER)
            {
            #if DEBUG == 1
                           Send_String("$AV^");
            #endif
               Report.Over ++;
               return ;
            }
          }
          Send_Over = FALSE;
          for(i = 0 ; i < 12 ; i++ )
          {
            flag = Host_Read_Data(Read_DataBuf+i);

             if( flag == FALSE || Read_DataBuf[11] != 0xCC
                ||(Read_DataBuf[0] != 0xAA && Read_DataBuf[0] != 0xA5))
            {
              LED_Mode = 3 ;
#if DEBUG == 1
               Send_String("$AR^");
#endif
               Report.Error ++;
               return ;
            }
            else  if( flag == OVER)
            {
#if DEBUG == 1
               Send_String("$AV^");
#endif
               Report.Over ++;
               return ;
            }
          }
#if DEBUG == 1
           Send_String("$AK^");
#endif
           Report.Ok ++;
           LED_Mode = 1 ;
         }
}
void  Device_Process(void)
{
  uchar i  ;
  char s[10];
  signed char flag;
    flag = 0xaa;
          Send_Over = FALSE;
          PC2_L;
          for(i = 0 ; i < 12 ; i++ )
          {
            flag = Device_Read_Data(Read_DataBuf+i);
            if(flag == FALSE )
              break;
          }
            if( flag == FALSE || Read_DataBuf[11] != 0xCC
                ||(Read_DataBuf[0] != 0xAA && Read_DataBuf[0] != 0xA5))
            {
#if DEBUG == 1
               Send_String("$AR^");
#endif
               Report.Error ++;
               LED_Mode = 4 ;
               return ;
            }
            else  if( flag == OVER)
            {
#if DEBUG == 1
               Send_String("$AV^");
#endif
               Report.Over ++;
               LED_Mode = 4 ;
               return ;
            }

          Send_DataBuf[0] = Read_DataBuf[0];
          Send_DataBuf[10] |= 0xA0 ;
          Send_DataBuf[11]  = 0xCC ;
          for(i = 0 ; i < 12 ; i++ )
          {
            Device_Out_Data(Send_DataBuf+i);
          }

          Report.Ok ++;

#if DEBUG == 1
           Send_String("$AK^");
/*             Read_DataBuf[12]=0;
             Send_String(Read_DataBuf);
//             sprintf(s,"times= %d\n\r",Report.Ok);
             Send_String(" Times= ");
           */
  s[0]='0'+(Report.Ok%10000)/1000;
  s[1]='0'+(Report.Ok%1000)/100;
  s[2]='0'+(Report.Ok%100)/10;
  s[3]='0'+(Report.Ok%10);
  s[4]=0;
           Send_String((uchar*)s);
           Send_String("\n\r");
           LED_Mode = 2 ;
#endif

}

⌨️ 快捷键说明

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