硬件设计

(文末附资料)

单片机最小系统
对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

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

  1. 131、基于51单片机智能电子秤HX711仿真设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 一.硬件电路组成 二.功能 三.电脑开发环境 四.Protues仿真 五.程序 六.原理图 七.PCB图 八.资料包括 一.硬件电路组成 本系统采用 ...

  2. 用单片机c51电子秤的c语言,基于51单片机的电子秤系统设计

    微机原理论文第八篇:基于51单片机的电子秤系统设计 摘要:本文主要分析51单片机下的数字电子秤.在设计过程中,这种电子秤具体包括电源.传感器.蓝牙.转换器.单片机.键盘.开关.显示器等组成部分,在实践 ...

  3. 51单片机小车的立项书_毕业论文:基于51单片机智能避障小车的设计报告(范文1)...

    <毕业论文:基于51单片机智能避障小车的设计报告.doc>由会员分享,可免费在线阅读全文,更多与<毕业论文:基于51单片机智能避障小车的设计报告>相关文档资源请在帮帮文库(ww ...

  4. 基于51单片机智能浇花自动浇水灌溉

    基于51单片机智能浇花自动浇水灌溉(源程序+原理图+论文+实物图) 资料编号:004 功能介绍: 51单片机控制的自动浇水系统,实现室内盆花浇水的自动化系统. 该系统可对土壤的湿度进行监控,并对作物进 ...

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

    本设计仅供学习参考 基于51单片机的电子秤proteus仿真设计(仿真+程序+原理图+报告+讲解) 原理图:Altium Designer 仿真图proteus 7.8 程序编译器:keil 4/ke ...

  6. 毕业设计 基于51单片机智能停车场管理车位引导系统设计

    基于51单片机智能停车场管理车位引导系统设计 0.毕业设计选题原则说明(重点) 1.项目简介 1.1 系统构成 1.2 系统功能 2.部分电路设计 2.1 STC89C52单片机核心系统电路设计 2. ...

  7. 基于51单片机的电子秤

    基于51单片机的电子秤 前言 电子秤是将检测与转换技术.计算机技术.信息处理.数字技术等技术综合一体的现代新型称重仪器.它与我们日常生活紧密结合息息相关.电子称主要以单片机作为中心控制单元,通过称重传 ...

  8. 基于51单片机智能家居电路控制仿真

    [毕设课设]基于51单片机智能家居电路控制仿真 ​效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: ​效果图 更多内容请关注@WENJIE电子科技 ​ 基于51单片机pro ...

  9. 基于51单片机智能小车循迹功能的实现

    基于51单片机智能小车循迹功能的实现 目录 基于51单片机智能小车循迹功能的实现 一.思路(仅供参考) 二.部分硬件模块介绍 1.L298n电机驱动模块 2.两路红外循迹模块 三.实现 1.代码 2. ...

最新文章

  1. 一句话给你的亲戚解释清楚你专业是做什么的!
  2. redis批量删除key
  3. Linq 实现 DataTable 行转列
  4. windows下配置mysql主从复制_Windows下MySQL主从复制的配置方法
  5. html查看ie版本,jquery怎么判断浏览器是否是ie
  6. 回旋加速器和同步加速器的区别
  7. HiveSQL正则表达式的应用
  8. 用C语言实现PID控制代码
  9. 网络安全商业模式分析
  10. 开发者头条(一):导航页
  11. 【入门】统计字符的个数
  12. java微博模拟登陆_java 模拟登录新浪微博(通过cookie)
  13. 伽罗瓦2^8域下模多项式求逆python(查表)实现
  14. 2020中央财经大学901c语言大纲,2017年中央财经大学信息学院901C语言程序设计考研导师圈点必考题汇编...
  15. 如何阻止iCloud照片库使用手机数据
  16. i510400f和i59400f差距 i5 10400f和i5 9400f哪个好
  17. DAMA认证|数据治理和数字化的12项原则
  18. iqooneo3 如何不用vivo账号下载外部应用_1分钟教你学会vivo旧手机数据如何迁移到新手机...
  19. 2023年网络安全竞赛B模块专项练习题(ALL)
  20. w3shool css study note

热门文章

  1. unity查找物体的几种方式
  2. NB-IoT信息收集
  3. 手把手教你 MySQL 入门,太全啦!!
  4. Java基础学习第九节——继承、重写
  5. Python一维列矩阵转换成行矩阵
  6. Java基础(数组)对象数组通过下标找出对象的最大值
  7. Android系统启动(上篇)
  8. 苹果自动驾驶项目大裁员;抖音再度回应微信无法登录;蔚来CEO李斌转让5000万股私人股份 | 雷锋早报...
  9. Three.js - 使用 bumpMap 凹凸贴图创建皱纹
  10. 【精】【PDF链接转图片】- Java用pdfbox将PDF的URL转换并压缩成图片,解决“口口口”乱码问题