历史上的今天
今天是:2024年12月09日(星期一)
2020年12月09日 | STC89C51单片机+HX711称重模块电子秤程序
2020-12-09 来源:51hei
电子秤是基于STC89C51单片机,以及HX711称重模块,利用单片机控制A/D转换,屏幕数据显示,键盘实时输入,设计方案能够易于各种场合使用。
单片机源程序如下:
#include #include #include #include "main.h" #include "HX711.h" #include "eeprom52.h" #define uchar unsigned char #define uint unsigned int unsigned long HX711_Buffer = 0; unsigned long Weight_Maopi = 0; unsigned long Weight_Maopi_0 = 0; long Weight_Shiwu = 0; unsigned int qupi=0; unsigned char p=0; //键盘处理变量 unsigned char keycode; unsigned char key_press_num=0; uint GapValue,GapValue1; bit flag_cz=0; uchar code LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B}; //数码管显示码表 //定义标识 volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清0 volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清0 //校准参数 //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。 //当发现测试出来的重量偏大时,增加该数值。 //如果测试出来的重量偏小时,减小改数值。 //该值可以为小数 //#define GapValue 349 sbit LED=P1^1; sbit ROW1=P3^0; sbit ROW2=P3^1; sbit ROW3=P3^2; sbit ROW4=P3^3; sbit DIAN = P0^5; //小数点 volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂 /******************把数据保存到单片机内部eeprom中******************/ void write_eeprom() { SectorErase(0x2000); GapValue1=GapValue&0x00ff; byte_write(0x2000, GapValue1); GapValue1=(GapValue&0xff00)>>8; byte_write(0x2001, GapValue1); byte_write(0x2060, a_a); } /******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() { GapValue = byte_read(0x2001); GapValue = (GapValue<<8)|byte_read(0x2000); a_a = byte_read(0x2060); } /**************开机自检eeprom初始化*****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 1) //新的单片机初始单片机内问eeprom { GapValue = 3500; a_a = 1; write_eeprom(); //保存数据 } } /*****显示开机初始化等待画面*****/ void Disp_init(void) { P0 = ~0x80; //显示---- P2 = 0xBF; //依次打开各位 Delay_ms(1); //延时 P2 = 0xEF; Delay_ms(1); P2 = 0xFB; Delay_ms(1); P2 = 0xFE; Delay_ms(1); P2 = 0xFF; //关闭显示 } //显示重量,单位kg,两位整数,三位小数 void Display_Weight() { P0 = ~LEDData[Weight_Shiwu%10]; // P2 = 0xBF; //打开位 Delay_ms(1); //延时 P2 = 0xff; //关闭显示 P0=~LEDData[Weight_Shiwu%100/10]; //显示个位 P2 = 0xEF; Delay_ms(1); P2 = 0xff; //关闭显示 P0 =~LEDData[Weight_Shiwu%1000/100]; //显示十位 P2 = 0xFB; Delay_ms(1); P2 = 0xff; //关闭显示 P0 =~LEDData[Weight_Shiwu%10000/1000]; //显示百位 DIAN = 0; //显示小数点 P2 = 0xFE; Delay_ms(1); P2 = 0xff; //关闭显示 } //定时器0初始化 void Timer0_Init() { ET0 = 1; //允许定时器0中断 TMOD = 1; //定时器工作方式选择 TL0 = 0xb0; TH0 = 0x3c; //定时器赋予初值 TR0 = 1; //启动定时器 } //定时器0中断 void Timer0_ISR (void) interrupt 1 using 0 { uchar Counter; TL0 = 0xb0; TH0 = 0x3c; //定时器赋予初值 //每0.5秒钟刷新重量 Counter ++; if (Counter >= 10) { FlagTest = 1; Counter = 0; } } //按键响应程序,参数是键值 //返回键值: // 7 8 9 10(清0) // 4 5 6 11(删除) // 1 2 3 12(未定义) // 14(未定义) 0 15(.) 13(确定价格) void KeyPress() { if(ROW1==0) //清零键 { Display_Weight(); if(ROW1==0) { if(qupi==0) qupi=Weight_Shiwu; else qupi=0; Buzzer=0; for(p=0;p<10;p++) Display_Weight(); Buzzer=1; while(ROW1==0) Display_Weight(); } } if(ROW2==0) //加 { Display_Weight(); if(ROW2==0) { while(!ROW2) { key_press_num++; if(key_press_num>=100) { key_press_num=0; while(!ROW2) { if(GapValue<10000) GapValue+=10; Buzzer=0; for(p=0;p<2;p++) Display_Weight(); Buzzer=1; for(p=0;p<2;p++) Display_Weight(); Get_Weight(); }
史海拾趣
|
概述 在微机测控系统中,用作上位机的PC机系统与用作下位机的单片机之间经常要进行信息交换。目前的主流单片机和PC机内部均带有串行口,因而两者之间的通信可通过串行口完成。但是,在实际应用中有时主控PC机和单片机相隔很远,为保证数据能高速及 ...… 查看全部问答> |
|
看见有人讨论器件模拟的问题,这里也发我的一份学习资料。 希望对有需要的朋友能提供帮助。标价一枚,呵呵。没有芯币而又确实需要的朋友可以发我电子邮件(scuja@163.com)或QQ联系(919194832)。一般晚上十一点下班。经常不在线多多包涵。 本人 ...… 查看全部问答> |
|
又要给人面试了。一些嵌入式系统相关的面试话题,大家也参考下。 Topic of Computer System Basic (1) alignment access and fix MIPS: exception handler, 2-instruction operations (2) cache cach ...… 查看全部问答> |
|
我现在需要对COM1口的那8个地址进行操作,要关闭串口,然后再打开,我想知道,从3f8到3ff对应的地址的意义,我怎样操作才可以实现关闭串口,然后再打开。谢谢了… 查看全部问答> |
|
全球半导体领导厂商 - 德州仪器 ( Texas Instruments, TI ),在2011年 9 月底与美国国家半导体合并后为市场提供更丰富的LED照明芯片产品,TI将于3月14日,3月16日以及3月20日到22日分别在厦门,上海、深圳,中山和广州举办2012 TI通 ...… 查看全部问答> |
|
#include <msp430x54x.h> #define SDA_1 P3OUT |= BIT7 //SDA = 1#define SDA_0   ...… 查看全部问答> |
|
去年本人在DIY论坛发布了一个帖子,想做智能家居,得到许多朋友的关注和帮助,本人表示非常的感谢! 现在本人智能家居的方案已经基本搞完,但是合伙人因为种种原因退出了!现在本人想再次寻找一个新的合作伙伴! 希望 ...… 查看全部问答> |




