51单片机设计多功能电子秤(实训项目)

这篇具有很好参考价值的文章主要介绍了51单片机设计多功能电子秤(实训项目)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.硬件准备

1.压力传感器(HX711称重模块)

51单片机设计多功能电子秤(实训项目)

2.接线说明

51单片机设计多功能电子秤(实训项目)

如上图接线所示:称重模块HX711模块各个引脚与单片机引脚对应如下:

(1).VCC——>VCC

(2).GND——>GND

(3).SCLK——>SDA

(4).DT——>SCLK

注:引脚一定要对应接好,尤其是数据(SDA)脚和时钟(SCLK)脚

二.原理图

(一).称重模块原理图

51单片机设计多功能电子秤(实训项目)

(二).单片机原理图

51单片机设计多功能电子秤(实训项目)

三.代码详解及功能演示

(一).LCD_1602显示重量

1.子代码详解(HX711获取AD值)

/*获取ad值*/
unsigned long HX711_Read(void)
{
    unsigned long count; 
    unsigned char i; 
      HX711_DOUT = 1; 
    _nop_();
    _nop_();
      HX711_SCK = 0; 
      count=0;
      for(i=0; i<24; i++)
    { 
          HX711_SCK = 1; 
          count = count << 1; 
        HX711_SCK = 0; 
          if(HX711_DOUT)
            count++; 
    } 
     HX711_SCK = 1; 
    count = count^0x800000;//第25个脉冲下降沿来时,转换数据
    _nop_();
    _nop_();
    HX711_SCK = 0;  
    return(count);
}

/*称毛皮重*/
void Get_Maopi()
{
    Weight_Maopi = HX711_Read();
//    Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); 
}

/*称实物重*/
void Get_Weight()
{
    Weight_Shiwu = HX711_Read();  
    Weight_Shiwu = Weight_Shiwu - Weight_Maopi;
    Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/429.5);    
}

2.按键控制

/*按键扫描*/
void Keyscan()
{
    if(key1 == 0)
        Delay(10);
    if(key1 == 0)
    {
        Get_Maopi();
        while(!key1);
    }
    if(key2 == 0)
        Delay(10);
    if(key2 == 0)
    {
        Weight_Maopi = 0;
        while(!key2);
    }
}

3.源代码

#include<reg52.h>
#include <intrins.h>

/*I/O口声明*/
sbit LCD1602_RS = P3^5;
sbit LCD1602_RW = P3^6;
sbit LCD1602_EN = P3^4;
sbit HX711_DOUT = P2^1; 
sbit HX711_SCK = P2^0;
sbit key1 = P3^0;
sbit key2 = P3^1;

/*全局变量定义*/
unsigned long Weight_Shiwu = 0;
unsigned long Weight_Maopi = 0;

/*函数声明*/
void Delay(unsigned int n);
void Init_LCD1602();//LCD1602初始化函数
void LCD1602_write_com(unsigned char com);    //写指令
void LCD1602_write_word(unsigned char *s);    //写字符串
void LCD1602_write_data(unsigned char dat);    //写数据
unsigned long HX711_Read(void);
void Keyscan();
void Get_Maopi();
void Get_Weight();

int main()
{ 
    Init_LCD1602();        //LCD1602初始化
    LCD1602_write_com(0x80);        //移动光标到第一行首位
    LCD1602_write_word(" Dian Zi Cheng! ");        //显示 Dian Zi Cheng! 
    LCD1602_write_com(0x80 + 0x40);            //移动光标到第二行首位
    LCD1602_write_word("Weight :"),            //显示Weight :
    Delay(1000);        //1s延时
    while(1)
    {
        Keyscan();
        Get_Weight();    
            
        LCD1602_write_com(0x80+0x49);        //移动光标到第二行第九位
        LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30);        
        LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30);
        LCD1602_write_data(Weight_Shiwu%100/10 + 0X30);
        LCD1602_write_data(Weight_Shiwu%10 + 0X30);
        LCD1602_write_word(" g");
    }
    return 0;
}

/*称实物重*/
void Get_Weight()
{
    Weight_Shiwu = HX711_Read();  
    Weight_Shiwu = Weight_Shiwu - Weight_Maopi;
    Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/429.5);    
}

/*延时子函数*/
void Delay(unsigned int n)
{
    int i, j;
    for(i=0; i<n; i++)
        for(j=0; j<110; j++);
}

//判断液晶忙,如果忙则等待
void Read_Busy()
{
    unsigned char busy;
    P0 = 0xff;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do     //此语句先执行后判断
    {
        LCD1602_EN = 1;
        busy = P0;
        LCD1602_EN = 0;     //不使用时将EN拉低释放,以便于下次写数据的时候直接将EN置高
    }while(busy & 0x80);//判断P0的最高位是否为1,为1时忙碌(禁止),为0时不忙(允许发数据)
    //直到不忙时才跳出循环
}


/*写指令*/
void LCD1602_write_com(unsigned char com)
{
    Read_Busy();//判断忙否
    LCD1602_RS = 0;
    Delay(10);
    LCD1602_RW = 0;    
    P0 = com;
    LCD1602_EN = 1;
    Delay(10);
    LCD1602_EN = 0;
}

/*写数据*/
void LCD1602_write_data(unsigned char dat)
{
    Read_Busy();
    LCD1602_RS = 1;
    Delay(10);
    LCD1602_RW = 0;    
    P0 = dat;
    LCD1602_EN = 1;
    Delay(10);
    LCD1602_EN = 0;
}

/*写连续字符(字符串)*/
void LCD1602_write_word(unsigned char *s)
{
    while(*s != '\0')
    {
        LCD1602_write_data(*s);
        s++;
    }
}

/*初始化LCD1602*/
void Init_LCD1602()
{
    LCD1602_EN = 0;
    //LCD1602_RW = 0;
    LCD1602_write_com(0x38);
    LCD1602_write_com(0x0c);
    LCD1602_write_com(0x06);
    LCD1602_write_com(0x01);
}

/*获取ad值*/
unsigned long HX711_Read(void)
{
    unsigned long count; 
    unsigned char i; 
      HX711_DOUT = 1; 
    _nop_();
    _nop_();
      HX711_SCK = 0; 
      count=0;
      for(i=0; i<24; i++)
    { 
          HX711_SCK = 1; 
          count = count << 1; 
        HX711_SCK = 0; 
          if(HX711_DOUT)
            count++; 
    } 
     HX711_SCK = 1; 
    count = count^0x800000;//第25个脉冲下降沿来时,转换数据
    _nop_();
    _nop_();
    HX711_SCK = 0;  
    return(count);
}

/*称毛皮重*/
void Get_Maopi()
{
    Weight_Maopi = HX711_Read();
//    Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); 
}

/*按键扫描*/
void Keyscan()
{
    if(key1 == 0)
        Delay(10);
    if(key1 == 0)
    {
        Get_Maopi();
        while(!key1);
    }
    if(key2 == 0)
        Delay(10);
    if(key2 == 0)
    {
        Weight_Maopi = 0;
        while(!key2);
    }
}

4.功能演示

51单片机设计多功能电子秤(实训项目)

(二).LCD_1602显示重量及计算价钱(单价可以按键调节)

源代码如下

#include<reg52.h>
#include <intrins.h>

/*I/O口声明*/
sbit LCD1602_RS = P3^5;
sbit LCD1602_RW = P3^6;
sbit LCD1602_EN = P3^4;
sbit HX711_DOUT = P2^1; 
sbit HX711_SCK = P2^0;
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit key3 = P3^2;
sbit key4 = P3^3;
sbit Flag_ERROR = P2^3;

/*全局变量定义*/
unsigned long Weight_Shiwu = 0;
unsigned long Weight_Maopi = 0;
unsigned int price = 1;
unsigned long all = 0;
/*函数声明*/
void Delay(unsigned int n);
void Init_LCD1602();//LCD1602初始化函数
void LCD1602_write_com(unsigned char com);    //写指令
void LCD1602_write_word(unsigned char *s);    //写字符串
void LCD1602_write_data(unsigned char dat);    //写数据
unsigned long HX711_Read(void);
void Keyscan();
void Get_Maopi();
void Get_Weight();
void All_Price();
int main()
{ 
    Init_LCD1602();        //LCD1602初始化
    LCD1602_write_com(0x80);//移动光标到第一行首位
    LCD1602_write_word(" Dian Zi Cheng! ");    //显示 Dian Zi Cheng! 
    LCD1602_write_com(0x80 + 0x40);            //移动光标到第二行首位
    LCD1602_write_word(" Welcom to use! ");    //显示Welcom to use!
    Delay(1000);        //1s延时
    LCD1602_write_com(0x01); //清屏

    LCD1602_write_com(0x80);//移动光标到第一行首位
    LCD1602_write_word("Weight :");//显示Weight :

    LCD1602_write_com(0x80 + 0x40);//移动光标到第二行首位
    LCD1602_write_word("p:");//显示price :

    

    

    //Delay(1000);        //1s延时
    while(1)
    {
        Keyscan();
        Get_Weight();
        All_Price();
        if(Weight_Shiwu > 5000)        //超重报警
        {
            Flag_ERROR = 0;      //报警
            LCD1602_write_com(0x80+0x09);
            LCD1602_write_word("ERROR!");    
        }
        else
        {
            Flag_ERROR = 1;//关闭蜂鸣器        
            LCD1602_write_com(0x80+0x09);//移动光标到第1行第九位
            LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30);        
            LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30);
            LCD1602_write_data(Weight_Shiwu%100/10 + 0X30);
            LCD1602_write_data(Weight_Shiwu%10 + 0X30);
            LCD1602_write_word(" g");

            LCD1602_write_com(0x80+0x43);        //移动光标到第二行第3位
            LCD1602_write_data(price/10 + 0X30);
            LCD1602_write_data(price%10 + 0X30);
            LCD1602_write_word("Y");
            
            LCD1602_write_com(0x80+0x47);        //移动光标到第二行第7位
            LCD1602_write_word("All:");//显示All_price :
            LCD1602_write_data(all%1000/100 + 0X30);
            LCD1602_write_data(all%100/10 + 0X30);
            LCD1602_write_data(all%10 + 0X30);
            LCD1602_write_word("Y");        
        }
    }
        
    return 0;
}


//计算价钱
void All_Price()
{    
    
    all = price *Weight_Shiwu; 
}


/*称实物重*/
void Get_Weight()
{
    Weight_Shiwu = HX711_Read();  
    Weight_Shiwu = Weight_Shiwu - Weight_Maopi;
    Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/429.5);
        
}

/*延时子函数*/
void Delay(unsigned int n)
{
    int i, j;
    for(i=0; i<n; i++)
        for(j=0; j<114; j++);
}

//判断液晶忙,如果忙则等待
void Read_Busy()
{
    unsigned char busy;
    P0 = 0xff;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do     //此语句先执行后判断
    {
        LCD1602_EN = 1;
        busy = P0;
        LCD1602_EN = 0;     //不使用时将EN拉低释放,以便于下次写数据的时候直接将EN置高
    }while(busy & 0x80);//判断P0的最高位是否为1,为1时忙碌(禁止),为0时不忙(允许发数据)
    //直到不忙时才跳出循环
}


/*写指令*/
void LCD1602_write_com(unsigned char com)
{
    Read_Busy();//判断忙否
    LCD1602_RS = 0;
    Delay(10);
    LCD1602_RW = 0;    
    P0 = com;
    LCD1602_EN = 1;
    Delay(10);
    LCD1602_EN = 0;
}

/*写数据*/
void LCD1602_write_data(unsigned char dat)
{
    Read_Busy();
    LCD1602_RS = 1;
    Delay(10);
    LCD1602_RW = 0;    
    P0 = dat;
    LCD1602_EN = 1;
    Delay(10);
    LCD1602_EN = 0;
}

/*写连续字符(字符串)*/
void LCD1602_write_word(unsigned char *s)
{
    while(*s != '\0')
    {
        LCD1602_write_data(*s);
        s++;
    }
}

/*初始化LCD1602*/
void Init_LCD1602()
{
    LCD1602_EN = 0;
    //LCD1602_RW = 0;
    LCD1602_write_com(0x38);//显示模式设置
    LCD1602_write_com(0x0c);//显示开及光标设置
    LCD1602_write_com(0x06);//显示光标移动设置
    LCD1602_write_com(0x01);//显示清屏
}

/*获取ad值*/
unsigned long HX711_Read(void)
{
    unsigned long count; 
    unsigned char i; 
      HX711_DOUT = 1; 
    _nop_();
    _nop_();
      HX711_SCK = 0; 
      count=0;
      for(i=0; i<24; i++)
    { 
          HX711_SCK = 1; 
          count = count << 1; 
        HX711_SCK = 0; 
          if(HX711_DOUT)
            count++; 
    } 
     HX711_SCK = 1; 
    count = count^0x800000;//第25个脉冲下降沿来时,转换数据
    _nop_();
    _nop_();
    HX711_SCK = 0;  
    return(count);
}

/*称毛皮重*/
void Get_Maopi()
{
    Weight_Maopi = HX711_Read();
//    Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); 
}

/*按键扫描*/
void Keyscan()
{
    if(key1 == 0)
    {
        Delay(5);
        if(key1 == 0)
        {
            while(!key1);
            Get_Maopi();            
        }
    }
    if(key2 == 0)
    {
        Delay(5);
        if(key2 == 0)
        {
            while(!key2);
            Weight_Maopi = 0;        
        }
    }
    
    if(key3 == 0)
    {
        Delay(5);
        if(key3 == 0)
        {
            price++;
            while(!key3);
        }
    }

    if(key4 == 0)
    {
        Delay(5);
        if(key4 == 0)
        {
            price--;
            while(!key4);
        }
    }
}

功能演示

51单片机设计多功能电子秤(实训项目)

四.多功能电子秤显示日历时间及闹钟设置

注:此内容详见专栏“51单片机”中《万年历》代码详解

最后,希望我的分享对你有所启发,敬请关注,持续更新,共同进步!文章来源地址https://www.toymoban.com/news/detail-417762.html

到了这里,关于51单片机设计多功能电子秤(实训项目)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于51单片机的电子秤设计

    电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。 电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计

    2024年02月02日
    浏览(40)
  • 毕业设计 基于51单片机的电子秤设计(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月11日
    浏览(46)
  • 单片机原理及应用:独立式键盘控制LED与多功能按键识别

    今天来介绍另一个外设——按键与LED的配合工作,与开关不同,按键需要注意消除抖动带来的影响,代码逻辑也会更复杂一写,下面先为大家介绍独立式键盘的相关知识。 单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输入方式,由若干按键按照一定的

    2024年01月21日
    浏览(31)
  • 基于AT89S52单片机的多功能电子万年历

    基于AT89S52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以AT89S52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,

    2024年02月03日
    浏览(34)
  • 【Proteus仿真】【51单片机】基于电阻应变片电子秤设计

    本项目使用Proteus8仿真51单片机控制器,使用LCD1602、压电传感器、信号放大电路、ADC模块等。 系统运行后,LCD1602显示采集压力值。 B站演示视频:https://space.bilibili.com/444388619 B站演示视频:https://space.bilibili.com/444388619 专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物

    2024年01月19日
    浏览(39)
  • 51单片机电子秤(HX711模块 + LCD1602)

    (简单易懂) 1.---------------序 2.HX711测重模块 3.LCD1602显示模块 4.电子秤整体实现原理 5.模块升级去皮与还原 6.源代码 零.先来一个效果展示 这里可以看到3个20g砝码加上去显示60g的重量 5个20g砝码加上去显示100g的重量,精度是比较准的 一.首先考虑如何把这样一个项目设计出来

    2023年04月08日
    浏览(34)
  • 基于单片机的智能数字电子秤proteus仿真设计

    一、系统方案 1、当电子称开机时,单片机会进入一系列初始化,进入1602显示模式设定,如开关显示、光标有无设置、光标闪烁设置,定时器初始化,进入定时器模式,如初始值赋值。之后液晶会显示Welcome To Use Electronic Scale,这是一个欢迎使用界面: 2、此电子秤是开机检测托

    2024年02月09日
    浏览(34)
  • 单片机毕业设计 stm32智能电子秤系统设计与实现 - 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月06日
    浏览(58)
  • 29、基于51单片机简易电子琴(有存储功能)系统设计

     随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴。我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器等等也很

    2024年02月03日
    浏览(39)
  • 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)

    51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示。其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间。通过调节单刀双掷开关来改变正在调整的时间是实际时间还是闹钟时

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包