电路原理图如下:
单片机源程序如下:
- /*************************************************************
- 电子秤
- 补充说明:
- ***************************************************************/
- #include<reg52.h>//头文件
- #include<lcd12864.H>
- #include<HX711.h>
- #include<KEY.h>
- #include<math.h>
- #include<stdio.h>
- #define MAX 3 //宏定义,单价最大输入3位数
- /************************引脚定义************************/
- sbit led=P3^2; //超重指示灯
- /************************变量定义************************/
- uchar key; //存储按键值
- double price=0; //存储零时单价
- double prices=0; //存储最终单价
- bit price_f=0; //记录输入单价标志位
- bit price_w=0; //记录输入单价完成标志位
- uchar price_z=0; //存储总价
- bit dian_f=0; //小数单价标志位
- bit dian_w=0; //小数单价标志位
- uchar n=0; //记录当前输入了几位数
- /********************************************************
- 函数名称:void fixed_display()
- 函数作用:固定显示函数
- 参数说明:
- ********************************************************/
- void fixed_display()
- {
- LCD12864_display_string(2,1,"电子秤"); //2:表示第3列,1:表示第1行,所有关于显示都一样
- LCD12864_display_string(0,2,"重量:"); //0:表示第1列,2:表示第2行,所有关于显示都一样
- LCD12864_display_string(0,3,"单价: 0");
- LCD12864_display_string(0,4,"总价:");
- LCD12864_display_string(7,2,"g");
- LCD12864_image3216(6,3,ASI); //6:表示第7列,3:表示第3行,显示【元/Kg】
- LCD12864_display_string(7,4,"元");
- }
- /********************************************************
- 函数名称:void chuli_num(uchar keys)
- 函数作用:在输入单价的时候按下数字按键处理函数
- 参数说明:
- ********************************************************/
- void chuli_num(uchar keys)
- {
- if((price_f==1&&price_w==0&&n<MAX)||(dian_f==1&&dian_w==0))//判断是否为输入单价状态,并且输入未满最大整数位数或者小数未满一位,才可以继续输入
- {
- if(dian_f==0) //判断是否为整数
- {
- price=price*10+keys;//单价计算
- n++; //输入的位数加1
- if(n==MAX) //判断是否输入完成
- price_w=1; //是的话标记输入完成
- }
- else //否者为小数
- {
- price=price+(float)keys/10;//单价计算 12+ 1/10=12.1
- dian_w=1; //标记小数输入完成。因为单价最低也就0.1元,所以只能输入一位小数
- price_w=1; //标记单价输入完成
- }
- }
- }
- /********************************************************
- 函数名称:void chuli()
- 函数作用:按键处理函数
- 参数说明:
- ********************************************************/
- void chuli()
- {
- /*****************按下数字键1~9键*****************/
- if(key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9')//判断当前按下是否为0~9的数字键
- chuli_num(key-0x30);
- /*********************按下‘0’键***********************/
- if(key=='0')
- {
- if((price_f==1&&price!=0&&price_w==0&&n<MAX)||(dian_f==1&&dian_w==0))//判断是否为输入单价状态,并且输入未满最大整数位或者小数未满一位,才可以继续输入
- {
- if(dian_f==0) //判断是否为整数
- {
- price=price*10+0; //单价计算
- n++; //输入位数加1
- if(n==MAX) //判断是否输入四位完成
- price_w=1; //是,标记输入完成
- }
- else //小数
- {
- price=price+0.0; //单价计算
- dian_w=1; //标记小数输入完成。
- price_w=1; //标记单价输入完成
- }
- }
- }
- /*********************按下‘.’键***********************/
- if(key=='.')
- {
- if(price_f==1&&dian_f==0) //标记位当前单价是具有小数
- dian_f=1;
- }
- /*********************按下‘去皮’键***********************/
- if(key=='Q')
- {
- if(price_f!=1) //重新获取初值,0kg对应的AD值
- init_val=fil();
- }
- /*********************按下‘单价’键***********************/
- if(key=='D')
- {
- price_f=1; //标记位单价输入状态
- LCD12864_display_string(3,3," ");
- }
- /*********************按下‘重输’键***********************/
- if(key=='C')
- {
- if(price_f==1)
- {
- price_f=1; //清除所以数据,重新输入单价
- price=0;
- n=0;
- price_w=0;
- dian_f=0;
- dian_w=0;
- LCD12864_display_string(3,3," ");
- }
- }
- /*********************按下‘退格’键***********************/
- if(key=='T') //13
- {
- if(price_f==1&&price!=0) //判断是否为输入状态,并且当前输入的单价不为0采集必要进行退格处理
- {
- if(dian_f==1) //小数
- {
- price_w=0;
- dian_w=0;
- dian_f=0;
- price=(ulong)price;
- LCD12864_display_string(3,3," ");
- }
- else //整数
- {
- n--; //输入的位数减1
- price_w=0;
- price=(ulong)price/10;//单价计算
- LCD12864_display_string(3,3," ");
- }
- }
- else
- if(price_f==0)
- {
- prices=0;
- //清空显示合计后的价格
- LCD12864_display_string(3,3," ");
- }
- }
- /*********************按下‘确认’键***********************/
- if(key=='=')
- {
- if(price_f==1) //按下确定键后,将输入的单价记录下来
- {
- prices=price; //记录单价
- price_f=0; //以下清除所有变量
- price=0;
- n=0;
- price_w=0;
- dian_f=0;
- dian_w=0;
- }
- }
- }
- /********************************************************
- 函数名称:void main()
- 函数作用:主函数
- 参数说明:
- ********************************************************/
- void main()
- {
- uchar weight_s[8]; //存储重量转换为字符串
- uchar price_s[4]="0"; //存储单价转换为字符串
- uchar z_s[8];
- uchar wei,i;
- LCD12864_init();
- /*LCD12864_display_string(1,2,"初始化.");
- init_val=fil2();
- LCD12864_display_string(1,2,"初始化..");
- init_val=(init_val+fil2())/2;
- LCD12864_display_string(1,2,"初始化...");
- init_val=(init_val+fil2())/2;*/
- write_com(0x01); //清除屏幕显示
- LCD12864_image12864(num12864); //开机显示启动画面
- init_val=fil2(); //读取0kg初始值
- while(ii>=8000) //判断模块是否插接好
- {
- LCD12864_clear12864(); //清除开机画面
- LCD12864_display_string(2,1,"☆警告☆");
- LCD12864_display_string(1,2,"未检测到模块");
- LCD12864_display_string(0,3,"关闭电源后检测下");
- LCD12864_display_string(0,4,"HX711 是否插接好");
- }
- init_val=(init_val+fil2())/2; //读取0kg初始值,这里多次采集取平均值,为了提高测量精度
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=fil2();
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=fil2();
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- init_val=(init_val+fil2())/2;
- LCD12864_clear12864(); //清除开机画面
- fixed_display(); //显示固定内容
- while(1) //死循环
- {
- if(price_f==0) //非单价输入状态
- {
- value=fil(); //采集实际AD
- if(value<init_val)
- value=(init_val-value)/418.251;//转换成实际重量,其中最后一个数字是指1g所占的AD410.05
- //value=(init_val-value)/41.220;//转换成实际重量,其中最后一个数字是指1g所占的AD值
- else
- {
- value=0; //重量=0
- led=1; //关闭led
- }
- if(value<=10000) //判断是否超重
- //if(value<=100000)
- {
- led=1; //关闭超重警示
- //显示实际重量
- wei=sprintf(weight_s,"%ld",(ulong)value);
- //wei=sprintf(weight_s,"%0.1f",(double)value/10);
- for(i=wei/2+3;i<7;i++)
- LCD12864_display_string(i,2," ");
- LCD12864_display_string(3,2,weight_s);
- //显示总价
- wei=sprintf(z_s,"%0.1f",(double)value/1000*prices);
- //wei=sprintf(z_s,"%0.1f",(double)value/10000*prices);
- for(i=wei/2+3;i<7;i++)
- LCD12864_display_string(i,4," ");
- LCD12864_display_string(3,4,z_s);
- }
- else //超重
- {
- led=0; //指示灯警示
- LCD12864_display_string(3,2,"超重 ");//显示“超重”提示
- }
- }
- key=keyscan();//获取按键返回值
-
- if(key!=0xff) //判断是否有按键按下
- {
- chuli(); //按键处理
- if(price_f==1) //单价输入
- {
- if(dian_f==1)
- {
- sprintf(price_s,"%0.1f",price); //将价格转换成字符,有小数
- LCD12864_display_string(3,3,price_s); //显示价格
- LCD12864_clear3216(6,3);
- }
- else
- {
- sprintf(price_s,"%ld",(ulong)price); //将价格转换成字符,整数
- LCD12864_display_string(3,3,price_s); //显示价格
- LCD12864_clear3216(6,3);
- }
- }
- else
- {
- sprintf(price_s,"%0.1f",prices); //将价格转换成字符,最终的价格
- LCD12864_display_string(3,3,price_s); //显示价格
- LCD12864_image3216(6,3,ASI); //显示【元/Kg】
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
电子秤源程序代码(Keil).zip
(69.36 KB, 下载次数: 210)
|