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

📄 ceshi.c.bak

📁 电能表误差测试仪的代码.为c语言编写.实现测量实时保存功能.
💻 BAK
📖 第 1 页 / 共 3 页
字号:
 *************************************************************************************/
uchar Check_I2C_Ack()
{
   uchar data i=0;

   S_Dat=1;                       // 释放数据线
   S_Dat=1;

   S_Clk=1;                       // 保持数据时间,即S_Clk为高,时间大于4.7us
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;
   S_Clk=1;

   FM24_Bit=S_Dat;

   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   S_Clk=0;
   if(FM24_Bit==0)
       i=0x00;
   else
       i=0x01;

   return(i);
}
/**************************************************************************************
 *
 * FUNCTION:    Read_I2C_1Byte
 *
 * DESCRIPTION:  读取FM24C04中当前地址的数据
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    读取到的数据
 *
 *************************************************************************************/
uchar Read_I2C_1Byte()
{
   uchar  i=0;
   uchar  RD_data=0;

   for(i=0; i<8; i++)
   {
       S_Dat=1;                        // 释放数据线
       S_Dat=1;
       S_Dat=1;
       S_Dat=1;

       S_Clk=1;                        // 发送时钟信号
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;


       FM24_Bit=S_Dat;                 // 读取数据

       S_Clk=0;                        // 释放时钟信号
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
	     S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;

       if(FM24_Bit==1)                 // 组织数据
           RD_data=RD_data|0x01;
       else
           RD_data=RD_data|0x00;

       if(i<7)
           RD_data=RD_data<<1;
   }
   return(RD_data);
}



/**************************************************************************************
 *
 * FUNCTION:    Write_I2C_1Byte
 *
 * DESCRIPTION:  写一个字节到24
 *
 *
 * PARAMETERS:  in: WR_data(等待写入的数据)
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void Write_I2C_1Byte(uchar  WR_data)
{
   uchar  i=0;
   uchar  j=0;

   for(i=0; i<8; i++)
   {
       j=WR_data&0x80;
       WR_data=WR_data<<1;

       if(j==0x80)
           FM24_Bit=1;
       else
           FM24_Bit=0;


       S_Dat=FM24_Bit;                 // 首先发送数据到数据线上
       S_Dat=FM24_Bit;

       S_Clk=1;                        // 然后发送时钟信号
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;
       S_Clk=1;

       S_Clk=0;                        // 最后释放发送时钟信号
       S_Clk=0;
       S_Clk=0;
       S_Clk=0;
   }

}


/**************************************************************************************
 *
 * FUNCTION:    Read_FM24_5Byte
 *
 * DESCRIPTION:  按照指定地址读取FM24C02中连续5个数据(读取到的数据放在read_buf中)
 *
 *
 * PARAMETERS:  in:  Add_FM24为指定的地址
 *              out: none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void Read_FM24_5Byte(uchar WR_24,uchar  Add_FM24)
{
   uchar  i;
   uchar  Degree_N1=0;
   uchar  Degree_N2=0;
   uchar  Degree_N3=0;
   uchar  CRC;

   EA=0;  //禁止总中断

   Read_Wait0:
   Send_I2C_Start();   //

   Write_I2C_1Byte(WR_24);   //写入写命令字
   Degree_N1++;
   if(Check_I2C_Ack()!=0)          //==0正确继续
   {
       if(Degree_N1<3)             //三次循环
           goto Read_Wait0;
       else
           goto Exit_Read;         //错误退出
   }

   Write_I2C_1Byte(Add_FM24);    //写读数据首地址
   Degree_N2++;
   if(Check_I2C_Ack()!=0)  //
   {
       if(Degree_N2<3)
           goto Read_Wait0;
       else
           goto Exit_Read;
   }

   Send_I2C_Start();


   Read_Wait1:

   Write_I2C_1Byte((WR_24+1)); //写入读命令字
   Degree_N3++;
   if(Check_I2C_Ack()!=0)
   {
       if(Degree_N3<3)
           goto Read_Wait1;
       else
           goto Exit_Read;
   }
   for(i=0; i<5; i++)
   {
       read_buf[i]=Read_I2C_1Byte();//读一个字节
       Send_I2C_Ack();              //应答
   }

   Exit_Read:

   Send_I2C_Stop();                //写停止
   CRC=0;
   for(i=0; i<4;i++)
       CRC+=read_buf[i];          //判断校验和
   CRC+='X';

   if(read_buf[4]!=CRC)           //和错误清0
   {
       for(i=0;i<4;i++)
         read_buf[i]=0x05;
       read_buf[4]=5+5+5+5+'X';
   }
   watchdog_reset=0x9a;
   EA=1;
}




/**************************************************************************************
 *
 * FUNCTION:    Write_FM24_nByte
 *
 * DESCRIPTION:  按照指定地址写入FM24C04中连续n个地址的数据(待写入的数据放在write_buf中)
 *
 *
 * PARAMETERS:  in:  Add_FM24为指定的地址
 *              out: none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void Write_FM24_5Byte(uchar WR_24,uchar  Add_FM24)
{
   uchar  i;
   uchar  Degree_N1=0;
   uchar  Degree_N2=0;
   uchar  Degree_N3=0;
   EA=0;
   for(i=0;i<250;i++);

 	   Write_Wait0:
	        Send_I2C_Start();

 	        Write_I2C_1Byte( WR_24 );
 	        Degree_N1++;
	         if(Check_I2C_Ack()!=0)
 	        {
    	         if(Degree_N1<3)
      	           goto Write_Wait0;
     	        else
        	       goto Exit_Write;
  	        }

 	        Write_I2C_1Byte( Add_FM24);
 	        Degree_N2++;
  	       if(Check_I2C_Ack()!=0)
  	       {
   	          if(Degree_N2<3)
   	              goto Write_Wait0;
    	      else
       	          goto Exit_Write;
  	       }
 	       for(i=0; i<5; i++)
  	       {
    	      Write_Wait2:
     	         Write_I2C_1Byte( write_buf[i] );

      	         if(Check_I2C_Ack()!=0)
      	         {
      	              Degree_N3++;
         	          if(Degree_N3<3)
          	            goto Write_Wait2;
          	          else
             	        goto Exit_Write;
     	         }
    	         else
     	         {
          	        Degree_N3=0;
      	         } 
  	       } 
 	       Exit_Write:
  	          Send_I2C_Stop();
  
   EA=1;
}
/**************************************************************************************
 *
 * FUNCTION:    read_cs
 *
 * DESCRIPTION:  读出全部常数和当前常数序号。
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void read_cs(void)      
{
   	uchar i,j,my_cs;
   	my_cs=0;
   	for(i=0;i<10;i++)
   	{
   		 Read_FM24_5Byte(WR_2402,add_0+(i*0x10));
   		 for(j=0;j<5;j++)
   		 {
   		    constant_all[my_cs]=read_buf[j];my_cs++;
   		 }
   	}
   	Read_FM24_5Byte(WR_2402,add_0-0x10);
   	constant_cn=read_buf[0];
    constant_mtr[0]=constant_all[constant_cn*5];
    constant_mtr[1]=constant_all[constant_cn*5+1];
    constant_mtr[2]=constant_all[constant_cn*5+2];
    constant_mtr[3]=constant_all[constant_cn*5+3];
}   
/**************************************************************************************
 *
 * FUNCTION:    save_cs
 *
 * DESCRIPTION:  保存常数和常数序号
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void save_cs(void)
{  uchar i,crc;
	 crc=0;
	 for(i=0;i<4;i++)
	 {
	    write_buf[i]=constant_mtr[i];
	    crc+=constant_mtr[i];
	 }
	 write_buf[4]=crc+'X';
	 Write_FM24_5Byte(WR_2402,add_0+(constant_cn*0x10));
	 for(i=0;i<255;i++)    //延时
	 {
	 	  for(crc=0;crc<20;crc++);
	 }
	 crc=0;
	 for(i=0;i<4;i++)
	 {
	    write_buf[i]=constant_cn;
	    crc+=constant_cn;
	 }
	 write_buf[4]=crc+'X';
	 Write_FM24_5Byte(WR_2402,add_0-0x10);	 
	 for(i=0;i<255;i++)    //延时
	 {
	 	  for(crc=0;crc<20;crc++);
	 }
}
/**************************************************************************************
 *
 * FUNCTION:    do_key
 *
 * DESCRIPTION:  按键处理,判断哪个按键按下了
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/ 
void do_key(void)
{
  //   uchar i;
     if(an_set_left_cn >= 2 )
     {  
	     an_set_left_cn=0;
	     key_time=200;
	     have_pulse_cn=0;
	     if(an_start_flag=='D')
	     {  an_start_flag=0;
	      	check_step=0x00;  
	     }
	     relay=1; 	     
	     if(flashing=='F')
	     {
	     	   current_flash_cn++;
	     	   if(current_flash_cn>=4)
	     	   {current_flash_cn=0;}      //循环闪烁   
	     }
	     else
	     	{flashing='F';current_flash_cn=0;}
	   }  
 
     if(an_set_right_cn >= 2 )
     {  
	     an_set_right_cn=0;
	     key_time=200;
	     have_pulse_cn=0;
	     if(an_start_flag=='D')
	     {  an_start_flag=0;
	      	check_step=0x00;  
	     }
	     relay=1; 	     
	     if(flashing=='F')
	     {
	     	   current_flash_cn--;
	     	   if(current_flash_cn>=4)
	     	   {current_flash_cn=3;}      //循环闪烁   
	     }
	     else
	     	{flashing='F';current_flash_cn=3;}	     
	   } 

     if(an_set_up_cn >= 2 )
     {  
	     an_set_up_cn=0;
	     key_time=200;
	     have_pulse_cn=0;
	     if(an_start_flag=='D')
	     {  an_start_flag=0;
	      	check_step=0x00;  
	     }
	     relay=1; 	     
	     if(flashing=='F')            //没闪烁时不处理常数位的增减。
	     {
	        constant_mtr[current_flash_cn]++;
	        if(constant_mtr[current_flash_cn]>=0x0A)
	        {constant_mtr[current_flash_cn]=0;}
	     }
	     else
	     {  constant_all_flag='A';
	     	  if( constant_showing=='S')
	     	  {constant_cn++;}
	     	  else
	     	  { constant_showing='S';}
	     	  
	     	  if(constant_cn>9)
	     	  {constant_cn=0;}
	     	  
          constant_mtr[0]=constant_all[constant_cn*5];
          constant_mtr[1]=constant_all[constant_cn*5+1];
          constant_mtr[2]=constant_all[constant_cn*5+2];
          constant_mtr[3]=constant_all[constant_cn*5+3];	     	  
	     }
	   }
      
     if(an_set_down_cn >= 2)
     {  
	     an_set_down_cn=0;
	     key_time=200;
	     have_pulse_cn=0;
	     if(an_start_flag=='D')
	     {  an_start_flag=0;
	      	check_step=0x00;  
	     }
	     relay=1; 	     
	     if(flashing=='F')           //没闪烁时不处理常数位的增减。
	     {
	         constant_mtr[current_flash_cn]--;
	         if(constant_mtr[current_flash_cn]>=0x0A)
	         {constant_mtr[current_flash_cn]=9;}	
	      }
	     else
	     {  constant_all_flag='A';
	     	  if( constant_showing=='S')
	     	  {constant_cn--;}
	     	  else
	     	  { constant_showing='S';}
	     	  if(constant_cn>9)
	     	  {constant_cn=9;}

⌨️ 快捷键说明

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