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

📄 打包机.txt

📁 ad7705在打包机仪表中的应用
💻 TXT
📖 第 1 页 / 共 2 页
字号:
bit err_set;
bit pack_finish;
unsigned int data stand[3];
unsigned char point;
unsigned char mul;
unsigned char compare;
unsigned int dat_a1,dat_a2;
unsigned char big,low;
unsigned int pack_num;
unsigned int aim_dat;
unsigned char luocha_dat;
void INT0_SVC() interrupt 0
{
Key = ZLG7289_Key();
}
void main()
{
  TMOD = 0x01;
  EA = 0;
  IT0 = 1; 
  EA = 1;
  ZLG7289T_Init(); 
  ZLG7289_Init(); 
  ZLG7289T_Reset();
  pack_finish=0;

  while(1)
  {
    main_ini();
    while(key_press&err_set)
    {
      unsigned char F_delay_num;
	  for(F_delay_num=0;F_delay_num<Fdelay_num;F_delay_num++)
	  {
	   weigh_dis();
       key_main(Key);

       if(!start)
       {
        AUTO_PACK();
	    key_press=0;
        _nop_();
       } 
      }
      if(pack_finish)
	  finish=!finish;
    }
  }
}
void AUTO_PACK()
{
  err();
  if(err_set)
  {
   pack_control=1;
  if(big_dat==aim_dat)
  unsmall_screw();
  else
  Hsmall_screw();
  pack_control=0;
  Delay (5);
  pack_num++;
  if(pack_num==10000)pack_num=0;
  Write_A_Page(dis_6,ZLG7289T_N,pack_2402);
  AUTO_luocha();
  pack_finish=1;
  }
}
void Hsmall_screw()
{ 
   unsigned char equal_big=0,equal_small=0;
   big_control=1;
   while(equal_big<equal_big_max)
   {
    unsigned int com;
	com=big_dat*10;
      big_control=0;
   Delay (5);//

   small_control=1;
   while(equal_small<equal_small_max)
   {
    unsigned int com;
    com=(aim_dat-luocha_dat)*10;
    if(dat_a2<com)
	{
	 weigh_dis();
	 equal_small=0;
	}
	else 
	equal_small++;
   }
   small_control=0;
   Delay (5);
}

void unsmall_screw()
{
  unsigned char unequal_big=0;
  big_control=1;
  while(unequal_big<unequal_big_max)
  {
   unsigned int com;
   com=(aim_dat-luocha_dat)*10;
   if(dat_a2<com)
	{
	 weigh_dis();
	 unequal_big=0;
	}
	else 
	unequal_big++;
   }
   big_control=0; 
   Delay (5);//
}
AUTO_luocha()
{
 unsigned int dat_adin,dat_adten=0,sub_dat;
 unsigned char i;
 for(i=0;i<5;i++)
 {
   dat_adin=operation(stand,mul);
   dat_adten=dat_adten+dat_adin;
 }
 dat_adten=dat_adten/50;
  Read_N_Bytes(dis_6,luocha_num,luo_2402 );
 dis_6[1]=luocha_dat/10;
 dis_6[0]=luocha_dat%10;
 Write_A_Page(dis_6,luocha_num,luo_2402);
}

void err()
{
   if(big_dat>aim_dat)
  err_num=2;
}
void ZLG7289Tdis_e(unsigned char e_num)
{
 ZLG7289T_Hide(0xff);
 ZLG7289T_Download(0, 0, 0, 0x0a);
 ZLG7289T_Download(0, 5, 0, 0x0a);
 ZLG7289T_Flash(0);
}
/*
函数:void main_ini()
功能:系统初始化
*/
void main_ini()
{
	big_control=0;
	small_control=0;
	pack_control=0;
	finish=0;
    dat_a1=0;
    dat_a2=0;
    Read_N_Bytes(dis_6,ZLG7289T_N,pack_2402);
	ZLG7289T_dissapear(ZLG7289T_N,l_num,dis_6,0);
    pack_num=dis_6[5]*1000+dis_6[4]*100+dis_6[3]*10+dis_6[2];

    big_dat=dis_6[1]*10+dis_6[0];
	luocha_dat=dis_6[3]*10+dis_6[2];
	if(point)
	{
	  aim_dat=aim_dat*10;
	}
}
void Delay (unsigned int t)
{
	do
	{
		TH0 = 0xDC;
		TL0 = 0x00;
		TR0 = 1;
		while ( !TF0 );
		TF0 = 0;
		TR0 = 0;
	} while (--t);
}

void switch_point()
{

 point=Read_One_Byte(point_2402);
 switch(point)
 {
   case 0: compare=5;break;
   case 1: compare=15;break;
   default: break;
 }
}
void weigh_dis()
{
 dat_a1=operation(stand,mul);
 if(dat_a1<10)   
 {
  dat_a1=0;
  dat_a2=0;
  dis_6[0]=0 ;
  dis_6[1]=0 ;
  dis_6[2]=0 ;
  dis_6[3]=0 ;
  dis_6[4]=0 ;        
  polar=0;
  }
 else   
 {
  if(dat_a1>dat_a2)
  {
	if((dat_a1-dat_a2)>compare)
	{
	  big++;
	  low=0;
	}
   }
   else
   {
     if((dat_a2-dat_a1)>compare)
	 {
	   low++;
	   big=0;
	 }
   }
 }
}
void stand_operation(unsigned int *p)
{
  unsigned char data dat_s8[6]; 
  unsigned int data dat16;      
  unsigned int data dat16_ad0;  
  unsigned int data dat16_ad1;  
  Read_N_Bytes(dat_s8,ZLG7289_N,sw1h_2402);
  dat16=dat_s8[3]*1000+dat_s8[2]*100+dat_s8[1]*10+dat_s8[0];  
  Read_N_Bytes(dat_s8,2,sw0Ah_2402);
  dat16_ad0=dat_s8[1]*256+dat_s8[0];
  dat16_ad1=dat_s8[1]*256+dat_s8[0];
  p[0]=dat16;                
  p[1]=dat16_ad1-dat16_ad0;   
  p[2]=dat16_ad0;             
}

unsigned int operation(unsigned int *p,unsigned char mul)
{
   unsigned long data dat_float;  
   unsigned int xdata dat_ad; 
   unsigned  int data sub;  
   dat_ad=ReadData7705();    
   if(dat_ad>p[2])       
   {
    polar=0;               
   }
   else                      
   {
    polar=1;                 
    sub=p[2]-dat_ad;     
   }        
   dat_float=(unsigned long)p[0]*sub;   
   dat_float=dat_float/p[1]; 
   return dat_float;
}
void dis_p(unsigned char *dis,unsigned int dat_sixteen,unsigned char point)
{
    unsigned char i,m=2;
    unsigned  int div=10000;
	dat_sixteen=dat_sixteen/10;
	dis[5]=0;//清掉不用的位
    for(i=4;i>0;i--)
    {
	 dis[i]=dat_sixteen/div;
	 dat_sixteen=dat_sixteen%div;
	 div=div/10;
	}
	dis_6[0]=dat_sixteen;
	if (point)dis[1]=dis[1]|0x80;
}
/*
函数:dis_polar
功能:加正负号显示程序
参数:
      polar:极性 0 正
                 1 负
	  *p:显示的数组
*/
void dis_polar(bit polar,unsigned char *p)
{
 unsigned char i=4;
 bit bdata pol=1;
 if(polar)
 {
  while(pol&(bit)i)
  {
   if(p[i])
   {
    p[i+1]=0x0A;
	pol=0;
   }
   i--;
  }
 }
}


/*========对2402的读写========*/
/*调用时需要参数DELY_TIME*/
#include <2402.h>
/*
函数:delayus(unsigned int t)
功能:毫秒级的时间延时函数
参数:t:延时的时间
*/

void delayus(unsigned int data t)
 {
  while(t!=0)
  t--;
 }

/*
函数:I2C_Start(void)
功能:启动I2C总线
参数:
说明:当SCL为高电平时使SDA产生一个负跳变
*/

void I2C_Start(void)
 {
  SDA=1;
  SCL=1;
  delayus(DELAY_TIME);
  SDA=0;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:I2C_Stop(void)
功能:终止I2C总线
参数:
说明:当SCL为高电平时使SDA产生一个正跳变
*/
 
void I2C_Stop(void)
 {
  SDA=0;
  SCL=1;
  delayus(DELAY_TIME);
  SDA=1;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:SEND_0(void)
功能:发送0
参数:
说明: 在SCL为高电平时使SDA信号为低
*/

void SEND_0(void)
 {
  SDA=0;
  SCL=1;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:SEND_1(void)
功能:发送1
参数:
说明:在SCL为高电平时使SDA信号为高
*/
 
void SEND_1(void)
 {
  SDA=1;
  SCL=1;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:Check_Acknowledge(void)
功能:发送完一个字节后检验设备的应答信号
参数:
说明: 
*/
  
bit Check_Acknowledge(void)
 {
  char data F0;
  SDA=1;
  SCL=1;
  delayus(DELAY_TIME/2);
    F0=SDA;
  delayus(DELAY_TIME/2);
    SCL=0;
  delayus(DELAY_TIME);
   if(F0==1)
  return FALSE;
  return TRUE;
 }

/*
函数:WriteI2CByte(char b)
功能:向I2C总线写一个字节
参数:b:写入的字节
说明: 
*/ 

void WriteI2CByte(char b)
 {
  char data i;
  for(i=0;i<8;i++)
  if((b<<i)&0x80)
     SEND_1();
  else
     SEND_0();
 }

/*
函数:ReadI2CByte(void)
功能:从I2C总线读一个字节
参数:
说明: 
*/ 
 
char ReadI2CByte(void)
 {
 char data  b=0,i,F0;
 for(i=0;i<8;i++)
  {
   SDA=1;          /*释放总线*/
   SCL=1;          /*接受数据*/
     delayus(10);
   F0=SDA;
     delayus(10);
   SCL=0;
    if(F0==1)
     {
      b=b<<1;
      b=b|0x01;
     }
    else
   b=b<<1;
  }
  return b;
 }

/*
函数:Write_One_Byte(char addr,char thedata)
功能:向2402写一个字节
参数:addr: 数据存储的地址
      thedata:所要存储的数据
说明: 
*/ 

void Write_One_Byte(char addr,char thedata)
 {
   bit acktemp=1;
   I2C_Start();                /*总线开始*/
   WriteI2CByte(0xa0);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*向address首地址开始写数据*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(thedata);      /*把thedata写进去*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   I2C_Stop();                 /*总线停止*/
 }

/*
函数:Write_A_Page(char *buffer,char m,char addr)
功能:向2402写一个数组
参数:*buffer:所要存储的数组
       m:存储的字节数
      addr: 数据存储的首地址
说明: 
*/  

void Write_A_Page(char *buffer,char m,char addr)
 {
   bit acktemp=1;
   int i;
   I2C_Start();
   WriteI2CByte(0xa0);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*address*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   for(i=0;i<m;i++)
   {
    WriteI2CByte(buffer[i]);
     if(!Check_Acknowledge())
      {
       I2C_Stop();
      }
   }
   I2C_Stop();
 }

/*
函数:Read_One_Byte(char addr)
功能:从2402读一个子节
参数:addr: 数据存储的地址
说明: 
*/  
 
char Read_One_Byte(char addr)
 {
   bit acktemp=1;
   char mydata;
   I2C_Start();           /*启动I2C总线*/
   WriteI2CByte(0xa0);    /*向I2C总线写一个字节*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*向I2C总线写一个字节,addr 是地址*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   I2C_Start();
   WriteI2CByte(0xa1);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   mydata=ReadI2CByte();
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   return mydata;
   I2C_Stop();            /*停止I2C总线*/
 }

/*
函数:Read_N_Bytes(char *buffer,char n,char addr)
功能:从2402顺序读n个字节到指定的数组
参数:*buffer:读取的字节数据所要存储的数组
       n:读取的字节数
      addr: 数据所存储的首地址
说明: 
*/  
 
void Read_N_Bytes(char *buffer,char n,char addr)
 {
   bit acktemp=1;
   int data i=0;
   I2C_Start();           /*启动I2C总线*/
   WriteI2CByte(0xa0);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*address*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   I2C_Start();
   WriteI2CByte(0xa1);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   for(i=0;i<n;i++)
   {
    buffer[i]=ReadI2CByte();
     if(i!=n-1)
      SEND_0();    /*发送应答*/
     else
      SEND_1();    /*发送非应答*/
   }
   I2C_Stop();     /*停止I2C总线*/

⌨️ 快捷键说明

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