基于51单片机智能电子秤方案原理图程序设计

article/2025/6/22 10:20:42

硬件设计

(文末附资料)
在这里插入图片描述
单片机最小系统
对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。下面给出一个51单片机的最小系统电路图。
复位电路:
一、复位电路的用途:单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。单片机复位电路如下图:
二、复位电路的工作原理在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2US就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。

晶振电路:晶振是晶体振荡器的简称 在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络 电工学上这个网络有两个谐振点 以频率的高低分其中较低的频率是串联谐振 较高的频率是并联谐振 由于晶体自身的特性致使这两个频率的距离相当的接近 在这个极窄的频率范围内 晶振等效为一个电感 所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路 这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路 由于晶振等效为电感的频率范围很窄 所以即使其他元件的参数变化很大 这个振荡器的频率也不会有很大的变化

P0口的上拉电阻:
P0口作为I/O口输出的时候时 输出低电平为0 输出高电平为高组态(并非5V,相当于
悬空状态)。也就是说P0 口不能真正的输出高电平,给所接的负载提供电流,因此必须接上拉电阻(一电阻连接到VCC),由电源通过这个上拉电阻给负载提供电流。 由于P0口内部没有上拉电阻,是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。
1.一般51单片机的P0口在作为地址/数据复用时不接上拉电阻。
2.作为一般的I/O口时用时,由于内部没有上拉电阻,故要接上上拉电阻!!
3.当p0口用来驱动PNP管子的时候,就不需要上拉电阻,因为此时的低电平有效; 4.当P0口用来驱动NPN管子的时候,就需要上拉电阻的,因为此时只有当P0为1时候,才能够使后级端导通。

31脚EA/Vpp接电源:
STC89C51/52或其他51系列兼容单片机特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行,当接低电平时,复位后直接从外部ROM的0000H开始执行,这一点是初学者容易忽略的。

程序设计

include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "main.h"
#include "LCD1602.h"
#include "HX711.h"
#include "eeprom52.h"#define uchar unsigned char
#define uint  unsigned intunsigned 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 keycode;
unsigned char key_press_num=0;
uint GapValue,GapValue1;//定义标识
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;volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{SectorErase(0x1000);GapValue1=GapValue&0x00ff;byte_write(0x1000, GapValue1);GapValue1=(GapValue&0xff00)>>8;byte_write(0x1001, GapValue1);byte_write(0x1060, a_a);	
}/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{GapValue   = byte_read(0x1001);GapValue   = (GapValue<<8)|byte_read(0x1000);a_a      = byte_read(0x1060);
}/**************开机自检eeprom初始化*****************/
void init_eeprom() 
{read_eeprom();		//先读if(a_a != 1)		//新的单片机初始单片机内问eeprom{GapValue  = 3500;a_a = 1;write_eeprom();	   //保存数据}	
}//显示重量,单位kg,两位整数,三位小数
void Display_Weight()
{LCD1602_write_com(0x80+0x40+8);if(Weight_Shiwu/10000==0)LCD1602_write_data(' ');elseLCD1602_write_data(Weight_Shiwu/10000 + 0x30);LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);LCD1602_write_data('.');LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);LCD1602_write_data(Weight_Shiwu%10 + 0x30);
}//定时器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)   //去皮键{Delay_ms(5);if(ROW1==0){
//			Get_Maopi();if(qupi==0)qupi=Weight_Shiwu;elsequpi=0;Buzzer=0;Delay_ms(50);Buzzer=1;	while(ROW1==0);}}if(ROW2==0)	   //加{Delay_ms(5);if(ROW2==0){while(!ROW2){key_press_num++;if(key_press_num>=100){key_press_num=0;while(!ROW2){if(GapValue<10000)GapValue++;Buzzer=0;Delay_ms(10);Buzzer=1;Delay_ms(10);Get_Weight();}}Delay_ms(10);}if(key_press_num!=0){key_press_num=0;if(GapValue<10000)GapValue++;Buzzer=0;Delay_ms(50);Buzzer=1;}write_eeprom();		}}if(ROW3==0)  //减{Delay_ms(5);if(ROW3==0){while(!ROW3){key_press_num++;if(key_press_num>=100){key_press_num=0;while(!ROW3){if(GapValue>1)GapValue--;Buzzer=0;Delay_ms(10);Buzzer=1;Delay_ms(10);Get_Weight();}}Delay_ms(10);}if(key_press_num!=0){key_press_num=0;if(GapValue>1)GapValue--;Buzzer=0;Delay_ms(50);Buzzer=1;}write_eeprom();			   //保存数?}}
}
//****************************************************
//主函数
//****************************************************
void main()
{init_eeprom();  //开始初始化保存的数据Init_LCD1602();									//初始化LCD1602EA = 0;Timer0_Init();//初中始化完成,开断EA = 1;//	Get_Maopi();LCD1602_write_com(0x80);						//指针设置LCD1602_write_word(" Welcome To Use ");	//  LCD1602_write_com(0x80+0x40);						//指针设置LCD1602_write_word("Wlectronic Scale");
//   Delay_ms(2000);Get_Maopi();LCD1602_write_com(0x80);						//指针设置LCD1602_write_word("The Weight:     ");LCD1602_write_com(0x80+0x40);				//指针设置LCD1602_write_word("         0.000kg");
//	Get_Maopi();				//称毛皮重量while(1){
//每0.5秒称重一次if (FlagTest==1){Get_Weight();FlagTest = 0;}	 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 >= 11000)		//超重报警{Buzzer = !Buzzer;	LED=!LED;LCD1602_write_com(0x80+0x40+8);LCD1602_write_word("--.---");}else{if(Weight_Shiwu==0)LED=0;else if(Weight_Shiwu>0)LED=1; Buzzer = 1;Display_Weight();}
}//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi()
{unsigned char clear;
mm:	Weight_Maopi_0 = HX711_Read();for(clear=0;clear<10;clear++){Buzzer=1;LED=0;Delay_ms(100);LED=1;Delay_ms(100);	}Weight_Maopi = HX711_Read();if(Weight_Maopi/GapValue!=Weight_Maopi_0/GapValue)goto mm;Buzzer=0;Delay_ms(500);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++);
}

原文:http://www.jh-tec.cn/archives/5757


http://chatgpt.dhexx.cn/article/APFECmSE.shtml

相关文章

51单片机的步进电机控制系统(仿真+程序+报告+原理图)

1、主要功能 该系统由AT89C51单片机数码管模块步进电机模块按键模块构成。 可实现功能: 1、按键控制步进电机正反转、加减速、停止&#xff1b; 2、2个发光二极管显示正反转&#xff0c;1位7段LED数码管显示当前转速档位&#xff08;共9个档位&#xff09;&#xff1b; 3、4个红…

51单片机电路原理图_(51单片机)课设项目2-超声波测距(SRF04、LCD1602、蜂鸣器报警电路)...

简单复盘一下做小项目时遇到的问题,下载地址在最后,有需要可以下载(在CSDN上我设置的是0C币下载,我发现好几次 会自己变??) 超声波模块SRF04 引脚 VCC:电源端 ECHO:接收端(高电平持续时间为超声波发出到返回的时间) TR:触发控制端,信号输入 NC(OUT):开关量输出…

基于51单片机的简易数字电压表proteus仿真原理图程序设计

硬件电路设计 原理图&#xff1a; 仿真图&#xff1a; 单片机的时钟电路与复位电路设计 本系统采用STC系统列单片机&#xff0c;相比其他系列单片机具有很多优点。一般STC单片机资源比其他单片机要多&#xff0c;而且执行速度快&#xff1b;STC系列单片机使用串口对单片机进…

课设-基于51单片机+超声波模块的避障小车(源码+原理图+Protel仿真)

基于51单片机超声波模块的避障小车&#xff08;源码原理图Protel仿真&#xff09; 一、功能二、模块2.1、电机驱动模块2.2、超声波模块 三、程序代码四、PCB原理图 一、功能 设计一辆利用超声波传感器来实现避障功能的小车&#xff0c;使小车对其运动方向受到的阻碍作出各种躲…

基于51单片机的交通灯原理图加代码

花了一个星期制作的交通灯仿真程序原理图&#xff0c;通过数码管显示路口的时间&#xff0c;通过led显示红绿灯。[TOC] #include<reg51.H> // 对单片机的口进行了定义 #define uint unsigned int #define uchar unsigned char uchar code a[10]{0x40,0x79,0x24,0x30,0…

51单片机电路原理图_51单片机玩转物联网基础篇03-独立按键

前言 上一节,我们完成了51单片机控制LED灯,并实现流水灯效果,本节我们学习操作独立按键,并通过两个按键,分别打开和关闭所有LED灯,按键作为输入设备,在系统开发过程中十分常见,一般来说,按键可以设置系统参数、控制系统运行状态。 一、基础知识 1.按键简介 通常的按键…

单片机基础:MCS-51单片机的硬件结构(附硬件结构框图)

单片机硬件结构知识点非常琐碎&#xff0c;通过一次两次的学习是不太可能记住的。想要熟练掌握硬件结构&#xff0c;最好的方法是在实验中练习&#xff0c;通过编程多见多用才能牢固的掌握。 MCS-51单片机硬件结构 1.硬件系统框图2.单片机功能图3.单片机的主要部件4.CPU内部结…

基于51单片机的智能温控风扇(程序+仿真+原理图)

目录 基于51单片机的智能温控风扇1、主要功能2、实验结果3、仿真工程4、原理图5、程序源码6、资源获取 基于51单片机的智能温控风扇 1、主要功能 基于51单片机的智能温控风扇&#xff0c;通过DS180温度传感器采集温度&#xff0c;并通过数码管显示温度&#xff0c;当温度高于…

基于51单片机的温度监测控制系统仿真程序原理图设计

整体方案设计 3.1.1 系统概述 整个系统以STC89C52单片机为核心器件,配合电阻电容晶振等器件,构成单片机的最小系统。其它个模块围绕着单片机最小系统展开。其中包括,传感器采用DS18B20,负责采集温度数据后发给单片机。显示设备采用4位共阴数码管,显示检测到的温度值。按键…

51单片机电路原理图_51单片机AD转换电路设计实现

51单片机AD转换电路设计实现 关于AD转换的原理,大家在《数字电子技术》中已经学过,这里做过多的介绍,本文介绍一款经典的8位AD转换芯片ADC0804,基于51单片机设计AD转换电路,并完成测量值的转换。 1 芯片引脚介绍 CS:片选信号,低电平有效,即CS=0时候芯片才能正常工作,单…

51单片机电路原理图_HX711的电子秤称重系统设计详解,51单片机,含Proteus仿真、C代码、原理图、论文等...

设计要求 1.系统可实现电子秤基本的称重功能(称重范围为0~10Kg,重量误差不大于0.005Kg); 2.系统应具备键盘输入单价,显示重量,计算总价的功能; 3.单价和总价金额的单位为元,最大金额数值为999.99元,金额误差不大于0.01元; 4.系统超出最大测量范围10Kg时,具有报警指…

51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告)

本设计&#xff1a; 基于51单片机的简易计算器设计&#xff08;仿真程序原理图PCB设计报告&#xff09; 仿真&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 编号S0001 芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯…

51单片机计算机加原理图,MCS-51单片机最小系统的组成部分及电路图介绍

MCS-51单片机概述 MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到…

手把手教你看懂51单片机原理图

最近当了单片机课设的助教,又再次接触了51单片机。发现初学者还看不太原理图&#xff0c;不能理解单片机 led灯&#xff0c;蜂鸣器&#xff0c;数码管是怎么操作的。现在结合原理图讲解一下怎么操作这些外设模块&#xff01;我们就以一些初始化代码进行讲解。 注&#xff1a;这…

51单片机电路原理图_51单片机入门(第1篇):纯干货,单片机最小系统

当我们了解了什么是单片机,以及单片机有什么用之后,是否要考虑我们怎么去学习单片机呢?学习单片机其实很简单,需要的起步知识并不需要多少,接下来跟随我的步伐,一步一步的去了解单片机。本文将讲解单片机最小系统和仿真软件以及编程软件的选择。 0. 51单片机最小系统 先来…

理解51单片机最小系统的工作原理

51单片机最小应用系统 概述 要想使用单片机&#xff0c;第一个要搭建的电路就是单片机的最小系统&#xff0c;有了这个最小系统单片机就可以去正常的工作&#xff0c;即使没有其他的外围电路&#xff08;显示器啥的&#xff09;&#xff0c;也可以对单片机进行程序的编写&…

51单片机原理与设计方案(包含原理图与PCB)

一、单片机简介 单片机&#xff1a;在一片集成电路芯片上集成微处理器&#xff08;CPU&#xff09;、存储器&#xff08;ROM和RAM&#xff09;、I/O接口电路&#xff0c;从而构成了单芯片微型计算机&#xff0c;即单片机&#xff08;single chip Microcomputer&#xff09;也叫…

如何获得海量的RoboCode代码

原文地址&#xff1a;如何获得海量的RoboCode代码 作者&#xff1a;胡泊1982 很多对人工智能感兴趣的朋友受限于资金和场地的限制&#xff0c;只能转向虚拟平台发展。我们机器人天空网站也曾经做过专门的专题介绍了几种常见的虚拟机器人竞赛平台&#xff08;http://www.robotsk…

Robocode 参数大揭密

Robocode 参数大揭密 文档选项 将此页作为电子邮件发送 最新推荐 Java 应用开发源动力 &#xff0d; 下载免费软件&#xff0c;快速启动开发 级别: 初级 天翼.李Skyala.Li, 2002 年 12 月 02 日 下面天翼.李(Skyala.Li)就和大家一起来看看Robocode中重要的参数并分析分析…