?? 打包機.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 + -