自动称量参考程序.docx
《自动称量参考程序.docx》由会员分享,可在线阅读,更多相关《自动称量参考程序.docx(58页珍藏版)》请在冰豆网上搜索。
自动称量参考程序
自动称量参考程序.c
#
#
/
#
#
include
defineFOSC22118400L
***定义通讯协议***/
definesend_zhen_tousend_data1(0xEE);
definesend_zhen_wen
send_data1(0xFF);send_data1(0xFC);send_data1(0xFF);send_data1(0xF
F);
/
*
*************定义程序必须有的变量
*******************************/
bitbusy=0;//COM1使用
sbitsck=P0^3;//定义HX711的SCK
sbitd_out=P0^2;//定义HX711的D_0UT引脚
sbitk_1=P3^2;
sbitk_2=P3^3;
sbitk_3=P3^4;
sbitk_4=P3^5;
sbitk_5=P2^0;//定义了5个开关量输入
sbitstep_en=P2^2;
sbitstep_dir=P2^3;
/
/sbitstep_pul=P2^4;//定义步进电机驱动引脚
sbitjd1=P1^7;
sbitjd2=P1^6;//定义继电器驱动引脚
************通信使用命令********************/
xdataunsignedcharread_hua_mian_id[8]=
0XEE,0XB1,0X01,0XFF,0XFC,0XFF,0XFF,0xcc};
/
{
xdataunsignedchar
shua_xin_off[8]={0xee,0xb3,0x00,0xff,0xfc,0xff,0xff,0xcc};
xdataunsignedchar
shua_xin_on[8]={0xee,0xb3,0x01,0xff,0xfc,0xff,0xff,0xcc};
xdataunsignedchar
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页
自动称量参考程序.c
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页
自动称量参考程序.c
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;
jd1=0;jd2=0;
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页
自动称量参考程序.c
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);//工作界面的目标量
delay_1ms(100);
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)
{
send_str1(read_hua_mian_id);
delay_1ms(5);
if((read_message[1]==0xB1)&(read_message[2]==0x01))
第4页
自动称量参考程序.c
hua_mian_id=read_message[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();
}
break;
/硬件功能测试
case0x03:
/
{
ying_jian_ce_shi();
}
break;
/参数设置
case0x04:
/
{
can_shu_she_zhi();
}
break;
/传感器校准
case0x05:
/
{
jiao_cheng();
}
break;
/特别密码界面
case0x06:
/
{
te_shu_mi_ma();
}break;
case0xfe:
{
;
}
break;
}
}
}
voidPCA_isr()interrupt7
{
第5页
自动称量参考程序.c
CCF0=0;
CH=0;
CL=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页
自动称量参考程序.c
{
do
while(*s!
=0xcc);
send_data1(*s++);
}
/
/1ms
voiddelay_1ms(unsignedchark)
{
unsignedchari,j,m;
for(m=0;m{
_
nop_();
nop_();
i=22;
_
j=128;
do
{
while(--j);
while(--i);
}
}
}
//50ms
voiddelay_50ms(unsignedintm)
{
unsignedchari,j,k;
unsignedintn=0;
for(n=0;n{
_
_
nop_();
nop_();
i=5;
j=52;
k=195;
do
{
do
{
while(--k);
while(--j);
}
while(--i);
}
}
}
/
/按键扫描程序,返回5个按键值的某一个
unsignedcharscan_k(void)
{
第7页
自动称量参考程序.c
unsignedchari=0x38;//什么都没有按,则返回8
if(k_1==0)
{
delay_1ms(70);//70ms
if(k_1==0)
i=0x31;
}
k_1=1;
if(k_2==0)
{
delay_1ms(70);//70ms
if(k_2==0)
i=0x32;
}
k_2=1;
if(k_3==0)
{
delay_1ms(70);//70ms
if(k_3==0)
i=0x33;
}
k_3=1;
if(k_4==0)
{
delay_1ms(70);//70ms
if(k_4==0)
i=0x34;
}
k_4=1;
if(k_5==0)
{
delay_1ms(70);//70ms
if(k_5==0)
i=0x35;
}
k_5=1;
returni;
}
/
/读取HX711数值,25个脉冲
unsignedlongread_hx711(void)
{
unsignedlongcount=0;
unsignedchari=0;
sck=0;//AD转换准备。
AD结束后,电平也为0;
count=0;//接收存储区清零
第8页
自动称量参考程序.c
while(d_out==1);//等待芯片准备好.
sck=1;
NOP2();//芯片上升沿读取数据。
sck=0;
NOP2();
for(i=0;i<23;i++)
{
sck=1;
NOP1();
if(d_out)count++;//上升沿读取数据
count=count<<1;
sck=0;
NOP2();
}
for(i=0;i<1;i++)
{
sck=1;
NOP2();
sck=0;
NOP2();
}
sck=0;
returncount;
}
voidmao_pao_pai_xu(unsignedlong*a,unsignedcharchang_du)
{
unsignedchari=0,j=0;
unsignedlongtemp=0;
for(j=0;j<(chang_du-1);j++)
{
for(i=0;i<(chang_du-1-j);i++)
{
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页
自动称量参考程序.c
unsignedchari=0;
for(i=0;i<3;i++)
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(aa=pi_zhong;
if(aa=(a-pi_zhong)*xi_shu_xiao;
else
a=(a-pi_zhong)*xi_shu_da;
returna;
}
//返回实际重量
unsignedlongshi_ji_zhong_liang(void)
{
floata=0;
a=get_zhi_liang();
a*=100;
returna;
}
//步进电机处理函数,开关和频率
voidstep_control(unsignedchark,unsignedintf)
{
if(f==0)
{
CR=0;
}
第10页
自动称量参考程序.c
else
{
CR=0;
step_f=FOSC/4/f+0.5;
CH=0;
CL=0;
CCAP0L=step_f;
CCAP0H=step_f>>8;
}
if(k==1)
{
CR=1;
CR=0;
}
else
{
}
}
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);
}
//更新某画面,某号控件,某个字节长度的数字
voidset_txt(unsignedcharscreen_id,unsignedchar
control_id,unsignedlongdat,unsignedcharcounter)
{
unsignedcharp[8]=0;
unsignedchari=0;
if(counter==1)
{
send_zhen_tou;
第11页
自动称量参考程序.c
send_data1(0XB1);send_data1(0X10);sen