📄 打包机.txt
字号:
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 + -