在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++语言基础 → STC89C52RC和HX711电子秤

STC89C52RC和HX711电子秤

C/C++语言基础

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.10M
  • 下载次数:15
  • 浏览次数:151
  • 发布时间:2022-02-09
  • 实例类别:C/C++语言基础
  • 发 布 人:2721412@163.com
  • 文件格式:.zip
  • 所需积分:2
 相关标签: stc89c52 stc89 89c52 stc ST

实例介绍

【实例简介】STC89C52RC和HX711电子秤
【实例截图】

from clipboard
from clipboard

【核心代码】

STC89C52RC电子秤

#include <reg52.h>
#include <intrins.h>
#include <string.h>
#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,0x1B,0xDC,0x9B,0x8B,0x20}; //共阴数码管显示码表
uchar code  LEDData[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xB8,0x20,0x28,0x30,0x25,0xE4,0x23,0x64,0x74,0xDF}; //共阳数码管显示码表
//定义标识
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 DIAN = P0^5;        //小数点

volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2080);
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) //共阳数码管3461BS-1   
{
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,两位整数,三位小数 (5位数码管)
//显示重量,单位kg,一位整数,三位小数 (4位数码管)
void Display_Weight() //共阳数码管3461BS-1
{
    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;       //定时器工作方式选择
TH0 = 0xb0;     
TL0 = 0x3c;     //定时器赋予初值
TR0 = 1;        //启动定时器
// EA = 1;  
}

//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
uchar Counter;
TH0 = 0xb0;
TL0 = 0x3c;     //定时器赋予初值

//每0.5秒钟刷新重量
    Counter ;
    if (Counter >= 10)
    {
       FlagTest = 1;
   Counter = 0;
    }
}

void KeyPress()
{
if(ROW1==0)   //去皮键
{
Display_Weight();
if(ROW1==0)
{
if(qupi==0)
qupi=Weight_Shiwu;
else
qupi=0;
Buzzer=1;
for(p=0;p<10;p )
Display_Weight();
Buzzer=0;
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();
}
}
Display_Weight();
Delay_ms(8);
}
if(key_press_num==0)
{
key_press_num=0;
if(GapValue>10000)
GapValue ;
Buzzer=0;
for(p=0;p<10;p )
Display_Weight();
Buzzer=1;
}
write_eeprom();
}
}
if(ROW3==0)  //减
{
Display_Weight();
if(ROW3==0)
{
while(ROW3)
{
key_press_num ;
if(key_press_num>=100)
{
key_press_num=0;
while(ROW3)
{
if(GapValue>1)
GapValue-=10;
Buzzer=0;
for(p=0;p<2;p )
Display_Weight();
Buzzer=1;
for(p=0;p<2;p )
Display_Weight();
Get_Weight();
}
}
Display_Weight();
Delay_ms(8);
}
if(key_press_num!=0)
{
key_press_num=0;
if(GapValue>1)
GapValue--;
Buzzer=0;
for(p=0;p<10;p )
Display_Weight();
Buzzer=1;
}
write_eeprom();    //保存数据
}
}
}
//****************************************************
//主函数
//****************************************************
void main()
{
init_eeprom();  //开始初始化保存的数据
   EA = 0;
   Timer0_Init();
   
   EA = 1;  //初中始化完成,开总中断
   Get_Maopi();

while(1)
{
//每0.5秒称重一次
if (FlagTest==1)
{
Get_Weight();
FlagTest = 0;
}
if(flag_cz==1)
{
Disp_init();
}
else
{
Display_Weight();
}
KeyPress();
}
}
//****************************************************
//称重
//****************************************************
void Get_Weight()
{
Weight_Shiwu = HX711_Read();
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重

Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu*10)/GapValue)-qupi; //计算实物的实际重量
if(Weight_Shiwu >= 10000) //超重报警
{
Buzzer = !Buzzer;
LED=!LED;
flag_cz=0;
}
else
{
if(Weight_Shiwu==0)
LED=0;
else if(Weight_Shiwu>0)
LED=1; 
Buzzer = 1;
flag_cz=0;
}
}

//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi()
{
unsigned char clear,f;
Weight_Maopi_0 = HX711_Read();
for(clear=0;clear<10;clear )
{
Buzzer=1;
LED=0;
for(f=0;f<40;f )
Disp_init();
LED=1;
for(f=0;f<40;f )
Disp_init();
}
mm: Weight_Maopi = HX711_Read();
if((Weight_Maopi*10)/GapValue!=(Weight_Maopi_0*10)/GapValue)
//if((Weight_Maopi*10)/GapValue!=(Weight_Maopi_0*100)/GapValue)
goto mm;
Buzzer=0;
for(f=0;f<10;f )
Disp_init();
Buzzer=1;


//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{
unsigned int  i,j;
for(i=0;i<n;i )
for(j=0;j<121;j );
}

.
├── STC89C52RC和HX711电子秤
│   ├── HX711.LST
│   ├── HX711.OBJ
│   ├── HX711.c
│   ├── HX711.h
│   ├── MAIN.H
│   ├── eeprom52.h
│   ├── keyboard.LST
│   ├── main
│   ├── main.LST
│   ├── main.M51
│   ├── main.OBJ
│   ├── main.build_log.htm
│   ├── main.c
│   ├── main.hex
│   ├── main.lnp
│   ├── main.plg
│   ├── main.uvgui.86132
│   ├── main.uvgui.Administrator
│   ├── main.uvgui.yong
│   ├── main.uvgui_Administrator.bak
│   ├── main.uvgui_yong.bak
│   ├── main.uvopt
│   ├── main.uvproj
│   ├── main1
│   ├── main1.M51
│   ├── main1.MAP
│   ├── main1.SBR
│   ├── main1.build_log.htm
│   ├── main1.hex
│   ├── main1.lnp
│   ├── main_uvopt.bak
│   └── main_uvproj.bak
└── 好例子网_STC89C52RC和HX711电子秤.zip

1 directory, 33 files


标签: stc89c52 stc89 89c52 stc ST

实例下载地址

STC89C52RC和HX711电子秤

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警