自动称量参考程序.docx

上传人:b****5 文档编号:4674856 上传时间:2022-12-07 格式:DOCX 页数:58 大小:25.05KB
下载 相关 举报
自动称量参考程序.docx_第1页
第1页 / 共58页
自动称量参考程序.docx_第2页
第2页 / 共58页
自动称量参考程序.docx_第3页
第3页 / 共58页
自动称量参考程序.docx_第4页
第4页 / 共58页
自动称量参考程序.docx_第5页
第5页 / 共58页
点击查看更多>>
下载资源
资源描述

自动称量参考程序.docx

《自动称量参考程序.docx》由会员分享,可在线阅读,更多相关《自动称量参考程序.docx(58页珍藏版)》请在冰豆网上搜索。

自动称量参考程序.docx

自动称量参考程序

自动称量参考程序.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(a

a=pi_zhong;

if(a

a=(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1