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

📄 ddsy922.c

📁 为88SC102IC卡与AT89C52做表的可以供大家参考
💻 C
📖 第 1 页 / 共 5 页
字号:
                    case 0x1f:
                     {
                      (*(s+6))|=0x80;(*(s+7))=14; /*存入命令码及长度字节*/
                      (*(s+8))=0x1F;(*(s+9))=0x90;
                    for(i=0;i<4;i++)
                    *(s+10+i)=real_energy.money0.money_overplus[3-i];
                    for(i=0;i<4;i++)
                    *(s+14+i)=real_energy.money.money_sum[3-i];    
                    for(i=0;i<4;i++)
                    *(s+18+i)=real_energy.electric.energy[3-i]; 

                     // page_read(OFFSET_OF(EEPROM_DATA,eprom_real_energy), s+10,sizeof(struct real_energy));
                      TXD_Int(s); /*发送一帧数据*/             
                     }
                    break; 
                  }
                 } 
                 break; 
                case 0xc0:
                   	{
                   switch(*(s+7))  
                     {                
                    case 0x30:
                     {
                       (*(s+6))|=0x80;(*(s+7))=0x05; /*存入命令码及长度字节*/
                      (*(s+8))=0x30;(*(s+9))=0xc0;
                       for(i=0;i<3;i++)
                      *(s+10+i)=meter_para.pulse_constant[2-i];   
                    //  IRcvStr(FM24W08,0x00,s+8,3);//电表的有功脉冲常数 
                       TXD_Int(s); /*发送一帧数据*/
                     }
                    break;
                    case 0x33:
                     {
                      (*(s+6))|=0x80;(*(s+7))=0x08; /*存入命令码及长度字节*/
                   // for(i=0;i<6;i++)
                   // *(s+10+i)=meter_para.factory_No[i];                         
                      //  IRcvStr(FM24W08,0x00,s+8,6);//电表的出厂编号 
                      TXD_Int(s); /*发送一帧数据*/
                     }
                    break;
                    case 0x34:
                     {
                      //  IRcvStr(FM24W08,0x00,s,6); /*读取电表通讯地址*/
                     (*(s+6))|=0x80;(*(s+7))=0x08; /*存入命令码及长度字节*/
                    //for(i=0;i<6;i++)
                    //*(s+10+i)=meter_para.factory_No[i];                       
                     //  IRcvStr(FM24W08,0x00,s+8,4);//电表购电卡卡号
                      TXD_Int(s); /*发送一帧数据*/
                      }
                    break; 
                    }                                
                   }
                 break;
                }
               }               
              break;
            case 0x02: /*读后续帧数据*/
               break;
            case 0x03: /*重读帧数据*/
               break;
            case 0x04: /*写数据*/               
              switch(*(s+8))
                {
                case 0xb6:                
               if(~Serial_Password(s+8))/*密码是否正确*/
               return 0; /*错误,返回*/
               for(i=0;i<3;i++)
                  {aa=*(s+10+i);
                  *(s+10+i)=*(s+12-i);
                  *(s+12-i)=aa;} 
	              page_write(OFFSET_OF(EEPROM_DATA,eprom_money_notice0),s+10,3);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
              // DelayNus1(1);
               /*构造返回数据帧*/            
               (*(s+6))|=0x80;(*(s+7))=0x03; /*存入命令码及长度字节*/
               *(s+8)=0;
               TXD_Int(s); /*发送一帧数据*/
               break;	
                break;
                case 0xc0:
                break;
                case 0xc1:
                break;
                case 0xc2:
                break;
                case 0xc3:
                break;
                case 0xc4:
                break;
                case 0xe1:
                break;
                }
               break;
            case 0x08: /*广播校时*/
               break;
            case 0x0A: /*写设备地址帧数据*/
               break;
            case 0x0C: /*更必通信速率帧数据*/
               break;
            case 0x10: /*最大需量清零帧数据*/
               break;
            case 0x14: /*读取指定数据标识项集合*/
               break;
            case 0x18: /*读取冻结电量数据*/
               break;
            case 0x1A: /*冻结电能数据*/
               break;
            case 0x1B: /*单相编程数据*/
               break;
            case 0x1D: /*单相读显示项数据*/
               break;
            case 0x1E: /*单相读编程项数据*/
               break; 
            default: /*其他命令*/
               break;
            }
          break; 
       }    
   return 1; /*帧执行正确,返回*/
}
//********************************************************************
//通讯主函数
//原型:void Serial_Command();
//功能:执行通讯命令
//入口参数:无
//出口参数:无
//********************************************************************/
void Serial_Command()
{
    if(Command_status1&0x04) /*通讯事件发送*/
    {
    if(~Serial_Command_Run(ec.ReceBuf)) /*帧执行*/
    //{ESR=1;Command_status1&=0xfb;return;} /*帧错误,恢复信道功能*/
    //ESR=1; /*恢复信道功能*/
    Command_status1&=0xfb; /*j 清除通讯处理事件*/
    }
}

/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void comm_ini(void)
 {  	
   page_read(0x4e,ec.ReceBuf,1);  //  0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
	switch(ec.ReceBuf[0])
    {
	case 0: 
    	TH1   = 0xFd;
		break;
	case 1: 
		TH1   = 0xFa;        
		break; 
	case 2: 
		TH1   = 0xF4;
		break;
	case 3: 
		TH1   = 0xe8;
		break;
	default: 
        //TH1   = 0xFd;
		TH1   = 0xe8;
		break;		
	 }    
  }  


/********************************************************************
/*
功能:查询卡座内是否有卡
输入:无
输出:1--卡座内有卡; 0--座内无卡

********************************************************************/  
unsigned char  _CardReady()
{
 Flag_ICPort=0;
   Portic=1;   
/*根据自己的硬件编写处理过程*/    
    DelayNus1(25); //5ms
    DelayNus1(25);
      if(Portic)
      {         
        Flag_ICPort=1;             
        return Flag_ICPort;
      }
    else 
        Flag_Play=0;
        return Flag_ICPort;

}
/********************************************************************
/*
功能:置IC卡读写器Clock高或低。
输入:Level
      当Level=1,给IC卡读写器Clock置高。
      当Level=0,给IC卡读写器Clock置低。
输出:无

********************************************************************/
//void _CardSetClock(unsigned char  level)
//{

/*根据自己的硬件编写处理过程*/
//   if(level==HIGH)
//      P2_3=HIGH;
//   else
 //     P2_3=LOW;
//}
/********************************************************************
/*
功能:将IC卡读写器Vcc段上电或下电。插入或者拨出IC卡前请先下电。
输入:Level
      当Level=POWERUP,给IC卡读写器上电。
      当Level=POWERDOWN,给IC卡读写器下电。
输出:无

********************************************************************/
void _CardSetPower(unsigned char  level)
{ 
/*根据自己的硬件编写处理过程*/
  if(level==HIGH)
      {
        P2_2=LOW;
        P2_1=LOW;
        DelayNus1(25);//05ma
        P2_0=LOW;       
       }           
     else 
      {
        P2_2=LOW;
        P2_1=LOW;        
        P2_0=LOW;
        DelayNus1(25);//05ma  
      }
   
}
/********************************************************************
/*
功能:置IC卡读写器PGM高或低。
输入:Level
      当Level=1,给IC卡读写器PGM置高。
      当Level=0,给IC卡读写器PGM置低。
输出:无

********************************************************************/
//void _CardSetPGM(unsigned char  level)
//{ 
/*根据自己的硬件编写处理过程*/
//   if(level==HIGH)
//    P2_3=HIGH;
//    else
//    P2_3=LOW;
//}

/********************************************************************
/*
功能:如果卡在位,上电并对AT88SC102型MEMORY卡复位。
输入:无
输出:-1 = 卡不在位;0 = 正常
*
********************************************************************/
unsigned char  _C102Reset()
{      
    if(Flag_ICPort == 0)
        return -1; 
        _CardSetPower(HIGH);
       P2_3=0;
       P2_0=1;
       P2_2=1;
       P2_1=0;
       P2_2=0;
      _nop_(); 
    return 0;

}

   

/********************************************************************
/*
原型:void _C102AddsInc(unsigned char  count)
功能:给出count个时钟脉冲,使AT88SC102型IC卡内部地址计数器增加count次。
输入:count
输出:无

********************************************************************/
void _C102AddsInc(unsigned char  count)
{   
    unsigned char  j,i;
 for(j=0;j<count;j++)
  {
    for(i=0; i<8; i++)
    {   P2_1=1;            
          _nop_();
        P2_1=0;         
        _nop_();         
    }
  }
}
 /********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void _C102Prog0(void)
{      
     //  _nop_();
       P2_3=1;
       _nop_();
       P2_0=0;
       _nop_();
       _nop_();
       P2_1=1;
       _nop_();
       P2_3=0;
       DelayNus1(250);
       P2_0=1;
       P2_1=0;
       _nop_();
}
 
 /********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/

void _C102Prog1(void)  
{ 
    //  _nop_();       
      P2_3=1;           
      P2_0=1;           
      _nop_();           
      _nop_();           
      _nop_();           
       P2_1=1;          
      _nop_();         
       P2_3=0;     
      DelayNus1(250);          
      P2_1=0;          
      _nop_();  
}  
/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
int _C102Addressing(unsigned char  address)
{
   if (_C102Reset() < 0)
        return -1;

    _C102AddsInc(address);

    return 0;
}	

/********************************************************************
/*
原型:unsigned char  C102CheckSC(unsigned char  *sc)
功能:比较密码。密码为2字节。
输入:sc:2字节
输出:返回值: 0 = 正确
              其它 = 错误  
********************************************************************/
unsigned char  C102CheckSC(unsigned char  *sc)
{ 	
  unsigned char i, k,l;	
    if( _C102Addressing(9) < 0 )
        return -1;
        for(i=0; i<7; i++)
        {   P2_1=1;            
           _nop_();
           P2_1=0;
           _nop_(); 
        }         
    for(i=0;i<2;i++)
    {      
      for(k=0;k<8;k++)         
       {
           P2_1=1;               
        P2_0=(bit)(*sc&0x80);
         *sc<<=1; 
          P2_1=0;            
           _nop_();                                         
        }
        sc++;
    }            
      cc:    P2_1=1; 
          P2_0=1;      
          P2_1=0;
         if(P2_0==1) 
            {
            _C102Prog0();
           if(P2_0==1)
             return 1;
           _C102Prog1();
           if(P2_0==0)
             return 1;
            }
           else 
            {
              l++;
              if(l>=4)
               return 1;
              goto cc;  
            }
        _CardSetPower(LOW);     
       return 0; 
}     
            
/********************************************************************
/*
原型:unsigned char  _C102Read(unsigned char  address, unsigned char  *retmsg,unsigned char  len)
功能:从IC卡地址address开始

⌨️ 快捷键说明

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