25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

news2024/11/17 22:22:57

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60,电压阈值为100,如果超于阈值,则蜂鸣器报警。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include <REGX52.H>#include<intrins.h>#include<stdio.h>#include "Delay.h"#include "LCD1602.h"#define uchar unsigned char#define uint unsigned  intsbit beep = P2^5;			  //蜂鸣器引脚sbit DS=P2^4;                 //DS18B20温度传感器sbit DS1=P2^3;                 //DS18B20温度传感器sbit CS=P1^0;                 //adc0832引脚sbit CLK=P1^1;
sbit DIO=P1^2;
sbit CS1=P1^3;                 //adc0832引脚sbit CLK1=P1^4;
sbit DIO1=P1^5;
sbit CS2   =  P1^6;        //ADC0832引脚定义sbit CLK2  =  P1^7;
sbit DIO2  =  P2^6;unsigned char count;typedef unsigned char u8;typedef unsigned int  u16;static uint temp;static float ftemp = 0.0f;//温度转变uint temp;static uint temp1;static float ftemp1= 0.0f;//温度转变uint temp1;static unsigned char num;static int wdyz=40,dymax=100,dlmax=60;  //wd38static uchar u,U,R ,u1,U1,R1,u2,U2,R2;      //定义变量void tmpchange();uint tmp();void tmpchange1();uint tmp1();void beep\_warning();void Time0\_Init()          //定时器初始化{
TMOD = 0x01;           //定时器0工作在方式1    IE   = 0x82;
TH0  = 0xfe;
TL0  = 0x33;     //11.0592MZ晶振,0.5msTR0=1;                 //定时器开始EA=1;
}void Time0_Int() interrupt 1 //中断程序{
   TH0  = 0xfe;             //重新赋值
   TL0  = 0x33;
    num++;	if(num==200)
	{	    tmpchange();        //让18b20开始转换温度
	    temp = tmp();       //读取温度
	    ftemp = temp/10.0f; //转换温度
		
		  tmpchange1();        //让18b20开始转换温度
	    temp1 = tmp1();       //读取温度
	    ftemp1 = temp1/10.0f; //转换温度
		num=0;
	}
}uchar get\_AD\_Res()            //ADC0832启动读取函数 有害气体{
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	CLK=1;\_nop\_();
	
	CLK=0;DIO=0;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
	}
	CS=1;	
	return(data1 == data2)?data1:0;
}uchar get\_AD\_Res1()            //ADC0832启动读取函数 颗粒物{
	uchar i, data1=0, data2=0;
	CS1=0;
	
	CLK1=0;DIO1=1;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=0;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO1; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO1<<i;
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
	}
	CS1=1;	
	return(data1 == data2)?data1:0;
}uchar get\_AD\_Res2()            //ADC0832启动读取函数 有害气体{
	uchar i, data1=0, data2=0;
	CS2=0;
	
	CLK2=0;DIO2=1;\_nop\_();
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=1;\_nop\_(); 
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=0;\_nop\_();
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK2=1;\_nop\_();
		CLK2=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO2; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO2<<i;
		CLK2=1;\_nop\_();
		CLK2=0;\_nop\_();
	}
	CS2=1;	
	return(data1 == data2)?data1:0;
}void dsreset(void)            //发出命令{
  uint i;
  DS=0;		              
  i=103;				   //将总线拉低480us~960us

  while(i>0)i--;
  DS=1;					   //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低
  i=4;					   //15us~60us等待
  while(i>0)i--;  //while(DS);}bit tmpreadbit(void)          //读取数据{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;   return (dat);
}uchar tmpread(void)           //读取数据{
  uchar i,j,dat;
  dat=0;  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }  return(dat);
}void tmpwritebyte(uchar dat)  //传输数据给DS18B20{
  uint i;
  uchar j;
  bit testb;  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }
  }
}void tmpchange(void)          //DS18B20开始工作{  dsreset();  Delay(1);  tmpwritebyte(0xcc);  
  tmpwritebyte(0x44);  
}					  
uint tmp()                    //获得温度{  float tt;
  uchar a,b;  dsreset();  Delay(1);  tmpwritebyte(0xcc);  tmpwritebyte(0xbe);
  a=tmpread();//低八位
  b=tmpread();//高八位
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
  temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数
  return temp;
}void dsreset1(void)            //发出命令{
  uint i;
  DS1=0;		              
  i=103;				   //将总线拉低480us~960us

  while(i>0)i--;
  DS1=1;					   //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低
  i=4;					   //15us~60us等待
  while(i>0)i--;  //while(DS);}bit tmpreadbit1(void)          //读取数据{
   uint i;
   bit dat;
   DS1=0;i++;          //i++ for delay
   DS1=1;i++;i++;
   dat=DS1;
   i=8;while(i>0)i--;   return (dat);
}uchar tmpread1(void)           //读取数据{
  uchar i,j,dat;
  dat=0;  for(i=1;i<=8;i++)
  {
    j=tmpreadbit1();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }  return(dat);
}void tmpwritebyte1(uchar dat)  //传输数据给DS18B20{
  uint i;
  uchar j;
  bit testb;  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;    if(testb)     //write 1
    {
      DS1=0;
      i++;i++;
      DS1=1;
      i=8;while(i>0)i--;
    }    else
    {
      DS1=0;       //write 0
      i=8;while(i>0)i--;
      DS1=1;
      i++;i++;
    }
  }
}void tmpchange1(void)          //DS18B20开始工作{  dsreset1();  Delay(1);  tmpwritebyte1(0xcc);  
  tmpwritebyte1(0x44);  
}					  
uint tmp1()                    //获得温度{  float tt1;
  uchar a,b;  dsreset1();  Delay(1);  tmpwritebyte1(0xcc);  tmpwritebyte1(0xbe);
  a=tmpread1();//低八位
  b=tmpread1();//高八位
  temp1=b;
  temp1<<=8;             //two byte  compose a int variable
  temp1=temp1|a;
  tt1=temp1*0.0625; //算出来的是测到的温度,数值可到小数点后两位
  temp1=tt1*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数
  return temp1;
}void beep_warning() //温度传感器蜂鸣器警报并且电机转动{	if(ftemp>=wdyz)
	{
		beep=1;			 //蜂鸣器报警
	}	
	if(R>dymax)
	{
		beep=1;			 //蜂鸣器报警
	}	
	if(R1>dlmax)
	{
		beep=1;			 //蜂鸣器报警
	}	
	if(R2>40)
	{
		beep=1;			 //蜂鸣器报警
	}	
	if(R1>dlmax)
	{
		beep=1;			 //蜂鸣器报警
	}	
	if(ftemp1 >= 80)
	{
		beep=1;
	}	if(ftemp<wdyz && R<dymax && R1<dlmax && R2<40 && ftemp1<80)
	{
	 beep=0;					//蜂鸣器报警
	}
}void main()					  //主函数{	
	beep=0;			    //蜂鸣器关掉
	LCD_Init();         //显示屏初始化
	Time0\_Init();	LCD\_ShowString(1,1,"wendu:");	LCD\_ShowString(1,9,"scp:");	LCD\_ShowString(2,1,"dy:");	LCD_ShowString(2,7,"dl:");	while(1)
	{
		u=get\_AD\_Res();
		U=(250*u)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		R=200*U/250;	    //电压
	
	  u1=get\_AD\_Res1();
		U1=(250*u1)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		R1=200*U1/250;	   //电流
		
		u2=get\_AD\_Res2();
		U2=(250*u2)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		R2=200*U2/250;	   //气压
	
	
	  LCD_ShowNum(1,7,ftemp,2); //第一行显示温度
		LCD_ShowNum(1,13,ftemp1,2); //第一行显示温度
		LCD\_ShowNum(2,4,R,3);		LCD\_ShowNum(2,10,R1,3);		LCD\_ShowNum(2,14,R2,3);	  beep\_warning(); //温度、电压、电流超出报警
	}
}

四、实现现象

具体动态效果看B站演示视频:

基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

全部资料(源程序、仿真文件、安装包、演示视频):
链接:https://pan.baidu.com/s/1AUrubgakYaqnGDA-KKIVqA?pwd=w4w9 
提取码:w4w9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModelScan:一款大模型序列化安全扫描工具

ModelScan是由AI初创公司ProtectAI提供的一个开源项目&#xff0c;旨在扫描机器学习模型以确定它们是否包含不安全的代码。它是首个支持多种模型格式的扫描工具&#xff0c;目前支持H5、Pickle和SavedModel格式。这个工具用于保护使用PyTorch、TensorFlow、Keras、Sklearn、XGB…

代码随想录 -- 回溯 -- 非递减子序列

491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;重点是去重 收集结果&#xff1a;每次进入递归先判断path中的元素数量&#xff0c;如果大于1了&#xff0c;就将path收集到result中。 递归参数&#xff1a;nums&#xff0c;index&#xff0c;pa…

王炸!二合一商业落地系统搞钱教程(StableDiffusion+Midjourney)AIGC零基础入门到商业实战教程!

刚接触Ai绘画时&#xff0c;身边就有大佬告诉我&#xff0c;这是个随随便便能月入过W的副业&#xff01;当时我就立志必须拿下。 很多人还在问什么是Ai绘画&#xff1f; 简单来说就是通过应用Ai工具&#xff0c;譬如是MJ&#xff0c;SD等工具&#xff0c;轻松生产出ai图片内容…

使用tar包下载安装mysql

1.官网下载mysql MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 2.上传到服务器解压 解压tar包 tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 将解压后的包改名为mysql&#xff0c;这样更加简易…

SpringCloud源码:客户端分析(一)- SpringBootApplication注解类加载流程

总结一句话 用EnableDiscoveryClient注解客户端-启动类&#xff0c;配合springbootapplication&#xff0c;完成两个步骤&#xff1a; 自动读取spring-factories文件的全限定类名内容通过selectImport对这些类进行初始化 背景 spring.factories作用 在maven依赖&#xff1a; sp…

学Python再学C++是走弯路?

随着编程教育的普及&#xff0c;越来越多的家长和学生开始选择学习编程语言。Python作为一种简洁易学、应用广泛的编程语言&#xff0c;成为许多编程初学者的首选。然而&#xff0c;随着学习的深入&#xff0c;很多人会考虑转向更复杂、更底层的语言&#xff0c;如C。这就引发了…

golang qq邮件发送验证码

验证码的使用场景 注册/登录&#xff1a;使用验证码可以有效减少垃圾账号注册和恶意登录&#xff1b;短信接口保护&#xff1a;高效减少防止短信接口被刷情况&#xff1b;提交/投票&#xff1a;有效减少恶意刷单、恶意提交、恶意投票等情况&#xff1b;密码找回&#xff1a;用…

JVS-Logic逻辑引擎:为外包项目需求变更提供80%的成本节约方案

在这个数字化时代&#xff0c;在当今数字化时代&#xff0c;业务逻辑在处理复杂性和多样性的应用程序和系统中都非常重要。逻辑引擎作为一种高效、灵活的工具&#xff0c;通过可视化编排和原子服务&#xff0c;实现了业务规则的自动化处理&#xff0c;极大地缩短了开发、部署和…

react crash course 2024(7) react router dom

安装 npm i react-router-dom 引入 import {Route,createBrowserRouter,createRoutesFromElements,RouterProvider} from react-router-dom 在app.jsx const router createBrowserRouter(createRoutesFromElements(<Route index element {<h1>My App</h1>…

客户文章|DAP-seq助力揭示GhSBI1调控棉花果枝节间伸长的分子机制

2024年7月26日&#xff0c;中国农业科学院棉花研究所张永山研究员团队在Plant Biotechnology Journal&#xff08;影响因子10.1&#xff09;杂志上发表了题为“GhSBI1, a CUP-SHAPED COTYLEDON 2 homologue, modulates branch internode elongation in cotton”的文章&#xff…

PMP与CMMI:两种管理方法的对比

PMP与CMMI&#xff1a;两种管理方法的对比 PMP&#xff1a;专注于项目管理CMMI&#xff1a;组织过程改进的框架总结&#xff1a;互补而非替代 在现代企业管理中&#xff0c;项目管理和组织能力成熟度模型集成&#xff08;CMMI&#xff09;是两个经常被提及的概念。虽然它们都是…

如何提升JavaScript安全性,保护应用程序免受威胁

JavaScript作为Web开发的主要开发语言&#xff0c;在前端应用开发中发挥着绝对主导的作用&#xff0c;保护我们的应用免受常见的安全威胁是每个前端开发人员应该掌握的基础知识。本文介绍了JavaScript基础的安全实践&#xff0c;了解如何防止XSS、CSRF等常见漏洞&#xff0c;实…

多人音视频房间 SDK

多人音视频房间 SDK 是音视频终端 SDK&#xff08;腾讯云视立方&#xff09;的子产品之一&#xff0c;基于企业培训、在线会议、网络研讨会等多人音视频会话场景定制&#xff0c;提供房间管理、成员管理、屏幕分享等会控功能&#xff0c;提供含 UI 快速集成方案&#xff0c;仅需…

【CSS】变换

空间概念translate ( 平移 )rotate ( 旋转 )scale ( 缩放 )skew ( 倾斜 )案例&#xff08; 六面骰子、旋转照片&#xff09; 空间概念 三维空间坐标 ( X&#xff0c;Y&#xff0c;Z ) 透视 ( perspective) 距离 ( 视距 ) d&#xff0c;近大远小&#xff0c;观众面向组件的距离 …

MATLAB案例 | Copula的密度函数和分布函数图

本文介绍各种类型&#xff08;Gaussian、t、Gumbel、Clayton、Frank&#xff09;Copula的密度函数和分布函数图的绘制 完整代码 clc close all clear%% ********************计算Copula的密度函数和分布函数图************************ [Udata,Vdata] meshgrid(linspace(0,1…

到时间没回家又不接电话?如何迅速确定孩子的位置?

当孩子未按时回家且无法通过电话联系时&#xff0c;家长往往会感到焦虑。此时&#xff0c;如何迅速确定孩子的位置成为许多家长迫切需要解决的问题。 利用智能手机定位技术是最常见的方法之一。大多数智能手机都内置GPS定位功能&#xff0c;通过“查找设备”应用&#xff0c;家…

你了解文档透明加密系统吗?介绍7款顶尖文档透明加密软件,热门推荐!

你了解文档透明加密系统吗&#xff1f; 文档透明加密系统&#xff0c;这一神奇的技术利器&#xff0c;正悄然守护着企业的核心机密。 它如同一位隐形的守护者&#xff0c;在你毫无察觉的情况下&#xff0c;对文档进行加密处理&#xff0c;确保数据在存储、传输及使用的全过程…

本地电脑基于nginx的https单向认证和双向认证(自制证书+nginx配置)保姆级

目录 1、背景 2、运行环境 3、工具下载 3.1、OpenSSL下载 3.2、nginx下载 4、制作https证书&#xff1a; 4.1、CA与自签名&#xff1a; 4.2、制作CA根证书&#xff08;公钥&#xff09; 4.3、制作服务端证书&#xff1a; 4.4、制作客户端证书&#xff1a; 4.5、制作…

openEuler 20.03,22.03,24.03一键部署Oracle23ai rpm

Oracle23ai前言 Oracle Database 23ai Free 让您可以充分体验 Oracle Database 的能力,世界各地的企业都依赖它来处理关键任务工作负载。 Oracle Database Free 的资源限制为 2 个 CPU(前台进程)、2 GB 的 RAM 和 12 GB 的磁盘用户数据。该软件包不仅易于使用,还可轻松下载…

智慧体育馆可视化:实时监控与智能管理

利用图扑可视化技术实现对体育馆的实时监控和数据分析&#xff0c;提升运营效率、观众体验和安全管理水平&#xff0c;打造智能化场馆环境。