自动称量参考程序Word下载.docx
《自动称量参考程序Word下载.docx》由会员分享,可在线阅读,更多相关《自动称量参考程序Word下载.docx(58页珍藏版)》请在冰豆网上搜索。
feng_ming[8]={0XEE,0X61,0X32,0XFF,0XFC,0XFF,0XFF,0XCC};
**********声明无需存入EEPROM的变量******************/
unsignedcharsend_message[20]=0;
//发送帧消息专用数组
unsignedcharread_message[20]=0;
//接收消息专用缓冲区
unsignedcharuart_read_f=0;
unsignedcharuart_read_count=0;
unsignedlonghx711_ad=0;
//HX711AD转换结果
unsignedlongad_bi_jiao=0;
unsignedintstep_f=0;
//存放频率计算结果
unsignedintlin_step_f=10;
unsignedcharhua_mian_id=0;
floatxi_shu_xiao=0.0;
floatxi_shu_da=0.0;
unsignedlongmu_biao_liang_1=0;
//实际进料时,去掉提前量的数值
第1页
unsignedlongmu_biao_liang_8=0;
//X0.8的数值
unsignedlongshi_shi_zhi_liang=0;
//动态,实时质量
/***********声明需要存入EEPROM的变量**********/
unsignedintmi_ma=0;
unsignedintstep_fast=0;
//步进电机快速运行的频率
unsignedintstep_low=0;
//步进电机慢速运行的频率
unsignedlongmu_biao_liang=0;
//目标量
unsignedlongpian_yi=0;
//质量偏移
unsignedcharlv_bo=0;
//滤波系数
unsignedintfa_ma_da=0;
//校准时大砝码的
unsignedintfa_ma_zhong=0;
//校准时中砝码质量
unsignedintfa_ma_xiao=0;
//校准时小砝码质量
unsignedlongcai_yang_da=0;
//校准时,大砝码采样值
unsignedlongcai_yang_zhong=0;
//较准时,中砝码采样值
unsignedlongcai_yang_xiao=0;
//较准时,小砝码采样值
unsignedcharliang_du=130;
//默认亮度130
floatpi_zhong=0;
//定义皮重
/************声明子函数********************/
voiduse_k(void);
voidsend_data1(unsignedchardat);
voidsend_str1(char*s);
voidnum_to_message(unsignedlongdat);
unsignedlonghx711_10(void);
voidstep_control(unsignedchark,unsignedintf);
voidupdata_zhong_liang(unsignedlongke);
voiddelay_1ms(unsignedchark);
voiddelay_50ms(unsignedintm);
voidset_txt(unsignedcharscreen_id,unsignedchar
control_id,unsignedlongdat,unsignedcharcounter);
voidying_jian_ce_shi(void);
unsignedinttft_read_txt(unsignedcharhua_mian,unsignedchar
txt);
voidshu_ru_mi_ma(void);
voidtft_show_6bit(unsignedcharhua_mian,unsignedchar
txt,unsignedlongnum);
voidcan_shu_she_zhi(void);
voidtft_show_4bit(unsignedcharhua_mian,unsignedchar
txt,unsignedintnum);
voidjiao_cheng(void);
unsignedintass_to_num_4bit(unsignedchar*p);
unsignedlongass_num_dot(unsignedchar*p);
voidte_shu_mi_ma(void);
voidsave_eeprom(unsignedintadd,unsignedlongdat);
unsignedlongread_eeprom(unsignedintadd);
第2页
voidget_xi_shu(void);
floatget_zhi_liang(void);
unsignedlongshi_ji_zhong_liang(void);
voidmao_pao_pai_xu(unsignedlong*a,unsignedcharchang_du);
voidzheng_chang_xia_liao(void);
voidkuai_su_qing_liao(void);
voidset_mu_biao_liang(void);
/*************主函数**********************/
voidmain()
P0M1=0;
P0M0=0;
jd1=0;
jd2=0;
P1M1=0;
P1M0=0xff;
P2M1=0x10;
P2M0=0;
P3M1=0;
P3M0=0;
P4M1=0;
P4M0=0;
P5M1=0;
P5M0=0;
SCON=0x50;
AUXR=0x15;
//COM1,COM2,控制波特率发生器
T2L=0xD0;
T2H=0xFF;
//波特率设置
AUXR1|=0X40;
PS=1;
ES=1;
//允许串行口中断
AUXR1|=0X20;
CMOD=0X02;
step_f=FOSC/4/3000;
CCON=0;
CH=0;
CL=0;
CCAP0L=step_f;
CCAP0H=step_f>
>
8;
CCAPM0=0x4d;
CR=0;
**********************************/
EA=1;
//允许CPU总中断
step_en=1;
step_dir=1;
delay_1ms(250);
//250ms
*********读取**EEPROM**********/
mi_ma=read_eeprom
(1);
step_fast=read_eeprom
(2);
step_low=read_eeprom(3);
mu_biao_liang=read_eeprom(4);
第3页
pian_yi=read_eeprom(5);
lv_bo=read_eeprom(6);
fa_ma_da=read_eeprom(7);
fa_ma_zhong=read_eeprom(8);
fa_ma_xiao=read_eeprom(9);
cai_yang_da=read_eeprom(10);
cai_yang_zhong=read_eeprom(11);
cai_yang_xiao=read_eeprom(12);
liang_du=read_eeprom(13);
pi_zhong=read_eeprom(14);
**************************/
k_1=1;
k_2=1;
k_3=1;
k_4=1;
k_5=1;
****************停留在开机画面*****************/
while(hua_mian_id==0)
send_str1(read_hua_mian_id);
/获取有效的画面ID结果
if((read_message[1]==0xB1)&
(read_message[2]==0x01))
hua_mian_id=read_message[4];
}
*********发送亮度控制信号**********/
send_zhen_tou;
send_data1(0x60);
send_data1(liang_du);
send_zhen_wen;
//将亮度调暗到130
delay_1ms(100);
//200ms,使传感器电源供给稳定
get_xi_shu();
//计算称重系数
pi_zhong=hx711_10();
set_txt(1,6,mu_biao_liang,6);
//工作界面的目标量
mu_biao_liang_1=mu_biao_liang-pian_yi;
//计算去掉提前量
的值
mu_biao_liang_8=mu_biao_liang_1*8/10;
//0.8
send_str1(feng_ming);
jd1=1;
/*****************主循环*******************/
while
(1)
delay_1ms(5);
第4页
else
hua_mian_id=0xfe;
switch(hua_mian_id)
//工作界面
case0x01:
use_k();
//处理按键按下结果
updata_zhong_liang(shi_ji_zhong_liang());
break;
/输入密码界面,设置各项参数
case0x02:
shu_ru_mi_ma();
/硬件功能测试
case0x03:
ying_jian_ce_shi();
/参数设置
case0x04:
can_shu_she_zhi();
/传感器校准
case0x05:
jiao_cheng();
/特别密码界面
case0x06:
te_shu_mi_ma();
}break;
case0xfe:
;
voidPCA_isr()interrupt7
第5页
CCF0=0;
voiduart1_inte(void)interrupt4using1
if(RI)
if(SBUF==0XAA)
IAP_CONTR=0X60;
if(SBUF==0XEE)
uart_read_f=1;
for(uart_read_count=0;
uart_read_count<
20;
uart_read_count++)
read_message[uart_read_count]=0;
uart_read_count=0;
if(uart_read_f==1)
read_message[uart_read_count]=
SBUF;
uart_read_count++;
if(SBUF==0XFF)
uart_read_f=0;
uart_read_count=19;
RI=0;
if(TI)
TI=0;
busy=0;
voidsend_data1(unsignedchardat)
while(busy);
busy=1;
SBUF=dat;
voidsend_str1(unsignedchar*s)
第6页
do
while(*s!
=0xcc);
send_data1(*s++);
/1ms
voiddelay_1ms(unsignedchark)
unsignedchari,j,m;
for(m=0;
m<
k;
m++)
_
nop_();
i=22;
j=128;
while(--j);
while(--i);
//50ms
voiddelay_50ms(unsignedintm)
unsignedchari,j,k;
unsignedintn=0;
for(n=0;
n<
m;
n++)
i=5;
j=52;
k=195;
while(--k);
/按键扫描程序,返回5个按键值的某一个
unsignedcharscan_k(void)
第7页
unsignedchari=0x38;
//什么都没有按,则返回8
if(k_1==0)
delay_1ms(70);
//70ms
i=0x31;
if(k_2==0)
i=0x32;
if(k_3==0)
i=0x33;
if(k_4==0)
i=0x34;
if(k_5==0)
i=0x35;
returni;
/读取HX711数值,25个脉冲
unsignedlongread_hx711(void)
unsignedlongcount=0;
unsignedchari=0;
sck=0;
//AD转换准备。
AD结束后,电平也为0;
count=0;
//接收存储区清零
第8页
while(d_out==1);
//等待芯片准备好.
sck=1;
NOP2();
//芯片上升沿读取数据。
for(i=0;
i<
23;
i++)
NOP1();
if(d_out)count++;
//上升沿读取数据
count=count<
<
1;
1;
returncount;
voidmao_pao_pai_xu(unsignedlong*a,unsignedcharchang_du)
unsignedchari=0,j=0;
unsignedlongtemp=0;
for(j=0;
j<
(chang_du-1);
j++)
(chang_du-1-j);
if(a[i]>
a[i+1])
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
/读取HX711
unsignedlonghx711_10(void)
unsignedlongcount[3]=0;
第9页
unsignedchari=0;
3;
count[i]=read_hx711();
mao_pao_pai_xu(count,3);
returncount[1];
//返回中间值
//获取称重系数
voidget_xi_shu(void)
longa[2]=0.0;
a[0]=fa_ma_zhong-fa_ma_xiao;
a[1]=cai_yang_zhong-cai_yang_xiao;
xi_shu_xiao=a[0]/a[1];
a[0]=fa_ma_da-fa_ma_zhong;
a[1]=cai_yang_da-cai_yang_zhong;
xi_shu_da=a[0]/a[1];
/返回当前质量
floatget_zhi_liang(void)
floata=0;
a=hx711_10();
if(a<
pi_zhong)
a=pi_zhong;
cai_yang_zhong)
a=(a-pi_zhong)*xi_shu_xiao;
a=(a-pi_zhong)*xi_shu_da;
returna;
//返回实际重量
unsignedlongshi_ji_zhong_liang(void)
floata=0;
a=get_zhi_liang();
a*=100;
//步进电机处理函数,开关和频率
voidstep_control(unsignedchark,unsignedintf)
if(f==0)
第10页
step_f=FOSC/4/f+0.5;
if(k==1)
CR=1;
voidupdata_zhong_liang(unsignedlongke)
unsignedlongi=0;
unsignedchara,b,c,d,e;
i=ke;
a=i/10000;
b=i/1000%10;
c=i/100%10;
d=i/10%10;
e=i%10;
/send_str1(shua_xin_off);
set_txt(1,1,a,1);
set_txt(1,2,b,1);
set_txt(1,3,c,1);
set_txt(1,4,d,1);
set_txt(1,5,e,1);
/send_str1(shua_xin_on);
//更新某画面,某号控件,某个字节长度的数字
control_id,unsignedlongdat,unsignedcharcounter)
unsignedcharp[8]=0;
unsignedchari=0;
if(counter==1)
第11页
send_data1(0XB1);
send_data1(0X10);
sen