1、传感器灵敏度传感器在满负荷的压力情况下,如果传感器的例如:量程为3kg,灵敏度为1.0mv/v的压力传感器,当施加3kg的压力时,如果供电电源为1v,那么,输出信号就为1mv,如果供电电源为5v,那么输出信号就为5mv如果供电电源为10v,那么,输出信号就为10mv。2、HX117对5mv的信号进行采样放大。HX117的A通道带有增益为128倍的放大器,对来自传感器的输出信号进行放大,然后送24位的A/D转换器转换,单片机按指定的时序读出24位的转换结果。3、传感器的供电电压传感器的供电电压(VAVDD与AGND之间的电压)可由由HX117的稳压模块产生:VAVDD=VBG(R1+R2)/R2其中,VBG为A/D转换器的基准电压,等于1.25V。如果R1=20K,R2=8.2K,根据上面的公式可算出VAVDD=4.3V。说明:为了降低功耗,VAVDD仅在A/D采样时才有输出,因此用万用表的测量值一般低于4.3V,因为万用表测到的是有效值。4、根据A/D转换结果计算出物体的重量对于量程为3Kg,灵敏度为1.0mv/v的传感器,供电电压为4.3V时,满量程的输出为4.3mV,每Kg对应的输出信号为4.3mV/3Kg=1.43mV设物体的重量为A(Kg)时,经HX117转换后的读数为y.此时,传感器的输出电压为1.43*A(mV),该信号经128倍增益,放大到128*1.43*A((mV)=183.46*A(mV),因为VAVDD为4.3V,对于24位A/D转换器,当输入为4.3V时,A/D转换结果为224.因此重量为A(Kg)的物体,对应A/D转换的读数为183.46*A(mV)*224/4.3V=715801.9A因为A/D转换后的读数y已由单片机读出,因此物体的重量:A=y/715801.9(Kg)≈y/716(Kg)说明:因为不同的传感器,斜率特性曲线的不一致,每个传感器需要校正,即修改716这个参数,才能达到相应的精度,如果测出的重量偏大,应适当增加该值,反之减少。电子秤基本程序清单#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlongexternvoidinit_lcd(void);//初始化液晶屏,在文件1602DRV.C中externvoiddisp_str(ucharx,uchary,uchar*p);//在x行、y列显示字符串psbitHX711_DOUT=P1^0;sbitHX711_SCK=P1^1;sbitKEY1=P2^4;ulongHX711_Buffer=0;ulongWeight_Maopi=0;//秤台的皮重,由Get_Maopi()函数在开机时获取longWeight_Shiwu=0;ucharflag=0;bitFlag_ERROR=0;#defineGapValue626//校准参数GapValue,该值可以为小数//不同的传感器特性曲线不是很一致,每一个传感器需要矫正这个参数//当发现测试出来的重量偏大时,增加该数值;如果测试出来的重量偏小时,减小改数值。voidDelay__hx711_us(void){_nop_();_nop_();}//****************************************************//MS延时函数(12M晶振下测试)//****************************************************voidDelay_ms(uintn){uinti,j;for(i=0;in;i++)for(j=0;j123;j++);}//****************************************************//读取HX711的转换结果//****************************************************ulongHX711_Read(void)//增益128{ulongcount;uchari;HX711_DOUT=1;//令HX711_DOUT脚进入输入方式Delay__hx711_us();//延时2usHX711_SCK=0;//HX711_SCK置低电平count=0;//转换结果初始化为0while(HX711_DOUT);//等待HX711就绪for(i=0;i24;i++)//连续读取24位数据{HX711_SCK=1;//产生一个SCK时钟count=count1;//先读取高位后读取低位HX711_SCK=0;if(HX711_DOUT)//SCK下降沿时采样DOUT,count++;//为1,则将count的最低位置1,}//否则,count的最低位保持0HX711_SCK=1;//产生第25个脉冲的上升沿count=count^0x800000;Delay__hx711_us();HX711_SCK=0;//产生第25个脉冲的下降沿,同时启动下一次转换return(count);}//****************************************************//称重//****************************************************voidGet_Weight(){Weight_Shiwu=HX711_Read();//获取毛重(净重+皮重)Weight_Shiwu=Weight_Shiwu-Weight_Maopi;//获取净重//(此时,毛重、皮重、净重均为AD转换的数值)if(Weight_Shiwu0){Weight_Shiwu=(uint)((float)Weight_Shiwu/GapValue);//计算实物的实际重量if(Weight_Shiwu3000)//超重报警Flag_ERROR=1;elseFlag_ERROR=0;}else{Weight_Shiwu=0;Flag_ERROR=1;//负重报警}}//****************************************************//获取毛皮重量//****************************************************voidGet_Maopi(){Weight_Maopi=HX711_Read();}//扫描按键voidScan_Key(){if(KEY1==0){Delay_ms(5);if(KEY1==0){while(KEY1==0);Get_Maopi();//获得当前的皮重}}}voidmain(){ucharcodestr1[16]=ERROR!;ucharcodestr0[16]=READY!;ucharstr2[16]=g;init_lcd();disp_str(0,0,str0);Delay_ms(3000);//延时,等待传感器稳定Get_Maopi();//首先称毛皮重量while(1){Get_Weight();//称重Scan_Key();//检查有无按去皮键if(Flag_ERROR==1){disp_str(0,0,str1);}else{str2[0]=Weight_Shiwu/1000+0X30;str2[1]=Weight_Shiwu%1000/100+0X30;str2[2]=Weight_Shiwu%100/10+0X30;str2[3]=Weight_Shiwu%10+0X30;disp_str(1,0,str2);}}}