您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的电子秤程序
#includeREGX51.H#includeintrins.h//#includeLCD1602.h//#includeHX711.h#defineuintunsignedint#defineucharunsignedcharsbitLCD1602_RS=P2^5;sbitLCD1602_RW=P2^6;sbitLCD1602_EN=P2^7;sbitHX711_DOUT=P2^0;sbitHX711_SCK=P2^1;unsignedlongHX711_Buffer=0;unsignedlongWeight_Maopi=0,Weight_Shiwu=0;charPrice_Count=0;ucharKEY_NUM=0;ucharPrice_Buffer[3]={0x00,0x00,0x00};unsignedlongMoney=0;bitFlag_OK=0;ucharcom;//延时函数//****************************************************voidDelay__hx711_us(void){_nop_();_nop_();}voidLCD1602_delay_ms(unsignedintn){unsignedinti,j;for(i=0;in;i++)for(j=0;j123;j++);}voidDelay_ms(unsignedintn){unsignedinti,j;for(i=0;in;i++)for(j=0;j123;j++);}//****************************************************//写指令//****************************************************voidLCD1602_write_com(ucharcom){LCD1602_RS=0;LCD1602_delay_ms(1);LCD1602_EN=1;P0=com;LCD1602_delay_ms(1);LCD1602_EN=0;}//****************************************************//写数据//****************************************************voidLCD1602_write_data(uchardat){LCD1602_RS=1;LCD1602_delay_ms(1);P0=dat;LCD1602_EN=1;LCD1602_delay_ms(1);LCD1602_EN=0;}//****************************************************//连续写字符//****************************************************voidLCD1602_write_word(unsignedchar*s){while(*s0){LCD1602_write_data(*s);s++;}}voidInit_LCD1602(){LCD1602_EN=0;LCD1602_RW=0;//设置为写状态LCD1602_write_com(0x38);//显示模式设定LCD1602_write_com(0x0c);//开关显示、光标有无设置、光标闪烁设置LCD1602_write_com(0x06);//写一个字符后指针加一LCD1602_write_com(0x01);//清屏指令}//****************************************************//矩阵键盘扫描//****************************************************unsignedcharKEY_Scan(){unsignedchartemp=0;unsignedcharcom=0x55,com1=0,com2=0;P3=0xf0;if(P3!=0xf0){com1=P3;P3=0x0f;com2=P3;}P3=0xf0;while(P3!=0xf0);temp=com1|com2;if(temp==0xee)com=1;//数字1if(temp==0xed)com=4;//数字4if(temp==0xeb)com=7;//数字7if(temp==0xe7)com=11;//备用键*号键if(temp==0xd7)com=0;//数字0if(temp==0xb7)com=14;//备用键*号键if(temp==0xde)com=2;//数字2if(temp==0xdd)com=5;//数字5if(temp==0xdb)com=8;//数字8if(temp==0xbe)com=3;//数字3if(temp==0xbd)com=6;//数字6if(temp==0xbb)com=9;//数字9if(temp==0x7e)com=16;//数字A键,去皮功能if(temp==0x7d)com=15;//数字B键清除键,二次测量if(temp==0x7b)com=12;//数字C输入单价错误时返回上一步if(temp==0x77)com=13;//数字D键,计算总价return(com);}unsignedlongHX711_Read(void)//增益128{unsignedlongcount;unsignedchari;HX711_DOUT=1;Delay__hx711_us();HX711_SCK=0;count=0;while(HX711_DOUT);for(i=0;i24;i++){HX711_SCK=1;count=count1;HX711_SCK=0;if(HX711_DOUT)count++;}HX711_SCK=1;count=count^0x800000;//第25个脉冲下降沿来时,转换数据Delay__hx711_us();HX711_SCK=0;return(count);}//****************************************************//称重//****************************************************voidGet_Weight(){HX711_Buffer=HX711_Read();HX711_Buffer=HX711_Buffer/100;if(HX711_BufferWeight_Maopi){Weight_Shiwu=HX711_Buffer;Weight_Shiwu=Weight_Shiwu-Weight_Maopi;//获取实物的AD采样数值。Weight_Shiwu=(unsignedint)((float)Weight_Shiwu/4.22+0.05);//计算实物的实际重量//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的4.30这个除数。//当发现测试出来的重量偏大时,增加该数值。//如果测试出来的重量偏小时,减小改数值。//该数值一般在4.0-5.0之间。因传感器不同而定。//+0.05是为了四舍五入百分位//Buzzer=1;//关闭警报}//elseif(HX711_BufferWeight_Maopi-30)//{//Buzzer=0;//负重量报警//}//elseif(HX711_BufferWeight_Maopi+24970)//大于5Kg的最大量程,报警//{//Buzzer=0;//}//if(Weight_Shiwu5000||HX711_BufferWeight_Maopi-30)//{//Buzzer=0;//}//else//{//Buzzer=1;//}////}//****************************************************//获取毛皮重量//****************************************************voidGet_Maopi(){HX711_Buffer=HX711_Read();Weight_Maopi=HX711_Buffer/100;}//****************************************************//主函数//****************************************************voidmain(){Init_LCD1602();//初始化LCD1602LCD1602_write_com(0x80);//指针设置LCD1602_write_word(Welcometouse!);//开机画面第一行Delay_ms(2000);//延时2sloop:Price_Count=0;Price_Buffer[0]=0;Price_Buffer[1]=0;Price_Buffer[2]=0;Flag_OK=0;LCD1602_write_com(0x80);//指针设置LCD1602_write_word(WEIg|PRI|MON);LCD1602_write_com(0x80+0x40);//指针设置LCD1602_write_word(0.000|.|.);Get_Maopi();//称毛皮重量while(1){if(Flag_OK==0){Get_Weight();//称重//显示当前重量LCD1602_write_com(0x80+0x40);LCD1602_write_data(Weight_Shiwu/1000+0x30);LCD1602_write_data('.');LCD1602_write_data(Weight_Shiwu%1000/100+0x30);LCD1602_write_data(Weight_Shiwu%100/10+0x30);LCD1602_write_data(Weight_Shiwu%10+0x30);}KEY_NUM=KEY_Scan();if(KEY_NUM!=0x55)//当返回的不是初值时候,确认按键按下。{if(KEY_NUM==16)//数字A键,去皮功能{Get_Maopi();//去皮}if(KEY_NUM==15)//数字B键清除键,二次测量{gotoloop;}if(KEY_NUM==12)//数字C输入单价错误时返回上一步{Price_Count--;if(Price_Count0){Price_Count=0;}Price_Buffer[Price_Count]=0;//清除上一个输入的数据switch(Price_Count){case0:LCD1602_write_com(0x80+0x40+6);LCD1602_write_data('');break;case1:LCD1602_write_com(0x80+0x40+7);LCD1602_write_data('');break;case2:LCD1602_write_com(0x80+0x40+9);LCD1602_write_data('');break;default:break;}}if(KEY_NUM==13)//数字D键,计算总价{Money=Price_Buffer[0]*100+Price_Buffer[1]*10+Price_Buffer[2];Money=Money*Weight_Shiwu/1000;LCD1602_write_com(0x80+0x40+11);LCD1602_write_data(Money/1000+0x30);LCD1602_write_data(Money%1000/100+0x30);LCD1602_write_data(M
本文标题:基于51单片机的电子秤程序
链接地址:https://www.777doc.com/doc-6030248 .html