基于51单片机HX711传感器电子秤设计制作出来的实物图如下:
元件型号 元件名称 元件标号 数量
蜂鸣器 Bell B1 1
10uF 电容 C1 1
20pF 电容 C2, C3 2
LCD1602 液晶 LCD1 1
Header 2 电源接口 P1 1
9012 三极管 Q5 1
2.7K 电阻 R1 1
10K 电阻 R2 1
SW-PB 按键 S1, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, S16, S17, S18 17
sw-灰色 电源开关 SW1 1
U1 单片机 U1 1
12M 晶振 Y1 1
单片机源程序如下:
- #include <reg52.h> //调用单片机头文件
- #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- #define ulong unsigned long
- #include<intrins.h>
- uchar code table_num[]="0123456789abcdefg";
- sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit e =P1^2; //片选信号 下降沿触发
- sbit hx711_dout=P2^1;
- sbit hx711_sck=P2^0;
- sbit beep = P1^3; //蜂鸣器
- long weight;
- uint temp,qi_weight;
- bit chaozhong_flag;
- bit leiji_flag;
- bit flag_300ms ;
- ulong price,z_price; //单价 总价
- uchar flag_p;
- /***************
- 删除键
- 去皮
- 价格清零
- ***************/
- /******1ms延时函数***12M晶振**************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /********************************************************************
- * 名称 : delay_uint()
- * 功能 : 小延时。
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /********************************************************************
- * 名称 : write_com(uchar com)
- * 功能 : 1602命令函数
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /********************************************************************
- * 名称 : write_data(uchar dat)
- * 功能 : 1602写数据函数
- * 输入 : 需要写入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602上显示这字符函数************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
- /***********************lcd1602初始化设置************************/
- void init_1602() //lcd1602初始化设置
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- }
- ////////////////在指定位置显示指定字符//////////
- void write_zifu(uchar hang,uchar add,uchar dat)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(dat);
- }
- /********************************************************************
- * 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
- * 功能 : 显示价格
- * 输入 : 行,列,需要输入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void write_sfm4_price(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/1000%10);
- write_data(0x30+date/100%10);
- write_data('.');
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- /****************开机液晶显示函数 初始化液晶的内容********************************/
- void init_1602_dis_csf() //初始化液晶
- {
- write_string(1,0," W:0.000kg ");
- write_string(2,0,"P:00.00 Z:00.00");
- write_zifu(2,7,0x5c); //¥
- // write_zifu(2,15,0x5c); //¥
- }
- /*******************压力显示程序***********************/
- void write_1602_yl(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/1000%10);
- write_data('.');
- write_data(0x30+date/100%10);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
-
- }
- void Delay__hx711_us(void)
- {
- _nop_();
- _nop_();
- }
- ulong ReadCount(void) //增益128
- {
- ulong count,value = 0;
- uchar i;
- hx711_dout=1;
- Delay__hx711_us();
- hx711_sck=0;
- count=0;
- while(hx711_dout) ;
- for(i=0;i<24;i++)
- {
- hx711_sck=1;
- count=count<<1;
- hx711_sck=0;
- if(hx711_dout)
- count++;
- }
- hx711_sck=0;
- Delay__hx711_us();
- hx711_sck=1;
- return(count);
- }
- void get_pizhong() //获取皮重,秤盘重量
- {
- ulong hx711_dat;
- hx711_dat=ReadCount(); //HX711AD转换数据处理
- temp=(uint)(hx711_dat/100);
- }
- void get_weight() //获取被测物体重量
- {
- ulong hx711_data,a;
- uint get,aa;
- hx711_data=ReadCount(); //HX711AD转换数据处理
- get=(uint)(hx711_data/100);
- if(get>temp)
- {
- a=ReadCount();
- aa=(uint)(a/100)-temp;
- weight=(uint)((float)aa/4.9+0.05);//重量转换函数,传感器型号不同此函数要适当修改
- }
- }
- /************************************************/
- /* 由于称重传感器线性度参数的不同,而对获得的重量数据处理,
- 此处可能会根据不同称重传感器,程序的代码会有所不同 */
- /************************************************/
- /*************定时器0初始化程序***************/
- void time_init()
- {
- EA = 1; //开总中断
- TMOD = 0X01; //定时器0、定时器1工作方式1
- ET0 = 1; //开定时器0中断
- TR0 = 1; //允许定时器0定时
- }
- /********************独立按键程序*****************/
- uchar key_can; //按键值
- void key() //独立按键程序
- {
- static uchar key_new = 0, key_l;
- key_can = 20; //按键值还原
- P3 = 0x0f;
- if((P3 & 0x0f) != 0x0f) //按键按下
- {
- delay_1ms(1); //按键消抖动
- if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
- { //确认是按键按下
- key_new = 0;
- key_l = P3 | 0xf0; //矩阵键盘扫描
- P3 = key_l;
- switch(P3)
- {
- case 0xee: key_can = 1; break; //得到按键值
- case 0xde: key_can = 4; break; //得到按键值
- case 0xbe: key_can = 7; break; //得到按键值
- case 0x7e: key_can = 10; break; //得到按键值
-
- case 0xed: key_can = 2; break; //得到按键值
- case 0xdd: key_can = 5; break; //得到按键值
- case 0xbd: key_can = 8; break; //得到按键值
- case 0x7d: key_can = 0; break; //得到按键值
-
- case 0xeb: key_can = 11; break; //得到按键值
- case 0xdb: key_can = 9; break; //得到按键值
- case 0xbb: key_can = 6; break; //得到按键值
- case 0x7b: key_can = 3; break; //得到按键值
-
- case 0xe7: key_can = 15; break; //得到按键值
- case 0xd7: key_can = 14; break; //得到按键值
- case 0xb7: key_can = 13; break; //得到按键值
- case 0x77: key_can = 12; break; //得到按键值
- }
- beep = 0; //蜂鸣器叫一声
- delay_1ms(100);
- beep = 1;
- }
- }
- else
- key_new = 1;
- }
- /************按键控制函数*************/
- void key_with()
- {
- if(key_can <= 9) //数字键
- {
- if(flag_p >= 4)
- {
- flag_p = 0;
- }
- if(flag_p == 0)
- price = key_can;
- else
- {
- price = price * 10 + key_can;
- }
- write_sfm4_price(2,2,price); //显示单价
- flag_p ++;
- }
- if(key_can == 15) //删除键
- {
- if(price != 0 )
- {
- flag_p --;
- price /= 10; //删除
- write_sfm4_price(2,2,price);//显示单价
- }
- }
- if(key_can == 14) //去皮
- {
- get_pizhong(); //获取皮重,秤盘重量
- }
- if(key_can == 13) //价格清零
- {
- flag_p = 0;
- price = 0;
- write_sfm4_price(2,2,price);//显示单价
- }
- }
- /*****************主函数********************/
- void main()
- {
- beep = 0; //蜂鸣器叫一声
- delay_1ms(100);
- P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1
- time_init(); //初始化定时器
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于51单片机HX711传感器电子秤设计(原理图、程序源码、BOM等).rar
(6.97 MB, 下载次数: 169)
|