• 基于51单片机的电子秤LCD1602液晶显示( proteus仿真+程序+设计报告+讲解视频)



    基于51单片机电子秤LCD显示( proteus仿真+程序+设计报告+讲解视频)

    仿真图proteus8.9及以上

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:S0083

    1. 主要功能:

    基于51单片机的电子秤proteus仿真设计

    1.电子秤可以数字显示0g-499g间物体的重量,单位克(g);

    2.电子秤可以设置单价(元/克)可计算物品金额并实现金额累加,单价范围0.01-0.99元克。

    3.通过LCD1602显示单价,物体重量,商品价格和总价;

    4.矩阵按键设置单价,计价,价格累加,清零和去皮功能;

    5.通过HX711高精度AD转换芯片读取压力传感器数值;

    需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

    img

    以下为本设计资料展示图:

    2. 讲解视频:

    讲解视频包含仿真运行讲解和代码讲解

    基于51单片机电子秤LCD1602液晶proteus仿真+程序+报告+讲解

    3. 仿真设计

    打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。

    img

    打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后LCD显示当前商品单价,重量,和商品价格,总价。

    img

    通过点击矩阵键盘的数字按键可以设置单价,下图设置单价0.12元,通过滑动变阻器可以设置重量,下图设置重量为20g,设置玩按下计价按键即可显示当前商品价格为2.4元。

    img

    按下价格累加可以记录当前的商品价格,按下清零按键清除掉当前的商品价格和总价。

    4. 程序代码

    使用keil4或者keil5编译,代码有注释,可以结合视频理解代码含义。

    LCD1602部分代码

    #include "lcd1602.h"
    完整代码见文章后面下载链接压缩包
    void delay_uint(uint i)
    {
    	while(i--);
    }
    /********************************************************************
    * 名称 : write_com(uchar com)
    * 功能 : 1602命令函数
    * 输入 : 输入的命令值
    * 输出 : 无
    ***********************************************************************/
    void write_com(uchar com)
    {
    	e=0;
    	rs=0;
    	rw=0;
    	P0=com;
    	delay_uint(20);
    	e=1;
    	delay_uint(20);
    	e=0;
    }
    
    /********************************************************************
    * 名称 : write_data(uchar dat)
    * 功能 : 1602写数据函数
    * 输入 : 需要写入1602的数据
    * 输出 : 无
    ***********************************************************************/
    void write_data(uchar dat)
    {
    	e=0;
    	rs=1;
    	rw=0;
    	P0=dat;
    	delay_uint(20);
    	e=1;
    	delay_uint(20);
    	e=0;	
    }
    
    /********************************************************************
    * 名称 : write_string(uchar hang,uchar add,uchar *p)
    * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
    	 	 write_string(1,5,"ab cd ef;")
    * 输入 : 行,列,需要输入1602的数据
    * 输出 : 无
    ***********************************************************************/
    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++;
    		}	
    }
    
    /********************************************************************
    * 名称 : init_1602()
    * 功能 : 初始化1602液晶 
    * 输入 : 无
    * 输出 : 无
    ***********************************************************************/
    void init_1602()
    {
    	write_com(0x38);						//数据总线为8位,显示2行,5x7点阵
    	write_com(0x0c);						//开显示,有光标,光标闪烁
    	write_com(0x06);						//光标自动右移
    	delay_uint(1000);						//等待设置完成
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    HX711代码:

    #include"HX711.h"
    //k=1,A通道128,k=2,B通道32,k=3,A通道64
    ulong HX711_read(uchar k)
    {
    	ulong count;
    	uchar i;
    	HX_SCK=0;//使能
    	count=0;
    	while(HX_SDA);//等待转换结束
    	for(i=0;i<24;i++)
    	{
    	HX_SCK=1;
    	count<<=1;
    	HX_SCK=0;
    	if(HX_SDA)
    		count++;
    	}
    	switch(k)
    	{
    	case 1:HX_SCK=1;HX_SCK=0;break;
    	case 2:HX_SCK=1;HX_SCK=0;HX_SCK=1;HX_SCK=0;break;
    	case 3:HX_SCK=1;HX_SCK=0;HX_SCK=1;HX_SCK=0;HX_SCK=1;HX_SCK=0;break;
    	}
    	//count^=0x800000;
    	return(count);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    主函数:

    #include "reg51.h"
    #include "HX711.h"
    #include "lcd1602.h"
    
    uint press=0;//压力
    uchar time=0;
    
    uint qupi=0;//去皮记录
    uchar money=1;//单价
    unsigned long all=0,sum=0;//价格+总价
    uchar disp1[]="0.01Y   000g";//单价+重量
    uchar disp2[]="000.00Y 0000.00Y";//金额+总价
    
    uchar key_scan()//按键检测
    {
    uchar i,j;
    i=0;
    j=0;
    P1=0x0f;
    if(P1!=0x0f) //检测有无按下
    {
     switch(P1)//检测行
     {
      case 0x0e:i=1;break;
      case 0x0d:i=5;break;
      case 0x0b:i=9;break;
      case 0x07:i=13;
     }
     P1=0xf0;
     switch(P1)//检测列
     {
      case 0xe0:j=0;break;
      case 0xd0:j=1;break;
      case 0xb0:j=2;break;
      case 0x70:j=3;
     }
     while(P1!=0xf0);//等待按键松开
    }
    return i+j;
    }
    //主函数
    void main()
    {
    	uchar k=0;
    	init_1602();
    
    	TMOD|=0X01;
    	TH0=0X3C;
    	TL0=0XB0;	
    	ET0=1;//打开定时器0中断允许
    	EA=1;//打开总中断
    	TR0=1;//打开定时器
    	while(1)
    	{			
    			k=key_scan();//按键检测
    			//去皮模式
    			if(k==4)//去皮
    			{
    				if(qupi==0){//去皮
    					qupi=press;
    				}else{
    					qupi=0;//取消去皮
    				}
    			}		
    			//设置商品价格
    			if((k>4)&&(k<=14))
    			{
    				money=money%10;
    				money=money*10+k-5;				
    			}
    			
    			if(k==1)//OK
    			{
    				all=press;
    				all=all*money;
    			}
    			if(k==2)//累加
    			{
    				sum=sum+all;
    			}
    			if(k==3)//清零
    			{
    				sum=0;
    				all=0;
    			}
    	}
    }
    //定时器0中断
    void Timer0() interrupt 1
    {
    	unsigned long i=0;	
    if(time<10)//测量
    	time++;
    else
    {
    	time=0;
    	i=HX711_read(1);
    	if(i>0x007fffff)
    		i=0;
    	press=500*i/0x007fffff;	//重量折算。最大范围是500g
    	press=press-qupi;
    
    	//显示
    	disp1[2]=money/10+0x30;
    	disp1[3]=money%10+0x30;
    
    	disp1[8]=press/100+0x30;
    	disp1[9]=press%100/10+0x30;
    	disp1[10]=press%10+0x30;
    	
    	disp2[0]=all/10000+0x30;
    	disp2[1]=all%10000/1000+0x30;
    	disp2[2]=all%1000/100+0x30;
    	disp2[4]=all%100/10+0x30;
    	disp2[5]=all%10+0x30;
    
    	disp2[8]= sum/100000+0x30;
    	disp2[9]= sum%100000/10000+0x30;
    	disp2[10]=sum%10000/1000+0x30;
    	disp2[11]=sum%1000/100+0x30;
    	disp2[13]=sum%100/10+0x30;
    	disp2[14]=sum%10+0x30;
    	write_string(1,0,disp1);
    	write_string(2,0,disp2);
    }
    	TH0=0X3C;
    	TL0=0XB0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128

    5. 设计报告

    8066字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试等

    img

    随着现代嵌入式技术的持续进步和实际应用场景的日益丰富,基于单片机设计的电子秤系统因其卓越的性能特点,在多个领域展现出了广泛的应用价值。尤其在商业零售、实验室精密测量以及日常家庭生活中,这些紧凑且高效的电子秤设备以其高精度测量能力、小巧便携的体积以及直观简洁的操作界面赢得了市场的青睐。它们能够精确地量化物体重量,并以数字形式清晰显示,同时具备灵活的价格设定机制,可适应不同商品的计价需求,单价范围从0.01元/克至0.99元/克不等,实现动态的商品价格计算及多次称量后的金额累加功能,大大提升了交易效率与用户体验。

    本课程设计项目正是立足于这一技术背景和发展趋势,旨在通过选取经典的51系列单片机作为核心控制器单元,利用其强大的数据处理能力和丰富的外围接口支持,构建一款融合了多重实用功能的电子秤仿真模型。结合Proteus这一业界领先的电路仿真平台,我们将从硬件原理图的设计到软件程序的编写进行全面实践,确保模拟出真实环境中电子秤的各项操作流程和技术指标。

    6. 设计资料内容清单&&下载链接

    资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

    0、常见使用问题及解决方法–必读!!!!

    1、程序

    2、proteus仿真

    3、功能要求

    4、软硬件流程图

    5、开题报告

    6、设计报告

    7、原理图

    8、讲解视频

    Altium Designer 安装破解

    KEIL+proteus 单片机仿真设计教程

    KEIL安装破解

    Proteus元器件查找

    Proteus安装

    Proteus简易使用教程

    单片机学习资料

    相关数据手册

    答辩技巧

    设计报告常用描述

    鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

    img

    资料下载链接:

    https://docs.qq.com/doc/DS0pjU1ZwRkx5bUh1

  • 相关阅读:
    连接工具和idea能查询出数据库数据,项目中查不到数据库数据:解决办法
    BI报表与数据开发
    windows中java环境变量配置
    北京建工携手法大大,电子签名赋能智能绿色建筑
    React中Immutable的使用
    2023/9/18 -- C++/QT
    基于Java公益志愿捐赠管理系统设计与实现(源码+LW+调试+开题报告)
    锂电池的性能指标
    EPLAN_007#3D图形的导入、编辑和定义
    惠普发布最新财报,对AIPC寄予厚望
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/138068305