基于51单片机DS18B20温度及电流检测-proteus仿真-源程序

图片

一、系统方案

本设计采用52单片机作为主控器,液晶1602显示,DS18B20检测温度,电流检测。

图片

二、硬件设计

原理图如下:

图片

三、单片机软件设计

1、首先是系统初始化

void lcd_init() //lcd 初始化设置子函数,不带参数 ,0x38 是显示模式设置 , 其余是显示开 / 关及光标设置,无顺序{delay1ms(15);wr_com(0x38); // 调用写控制指令子函数,并用实参 "0011 1000" 代替形参 com//0x38 表示设置为 16*2 显示,每个块为 5*7 点阵, 8 位数据接口delay1ms(5);wr_com(0x08); // 调用写控制指令子函数,并用实参 "0000 1000" 代替形参 com//0x08 表示设置为关显示、不显示光标、光标不闪烁delay1ms(5);wr_com(0x01); // 调用写控制指令子函数,并用实参 "0000 0001" 代替形参 com//0x01 表示显示数据清屏(数据指针清 0,所有显示清 0)delay1ms(5);wr_com(0x06);// 调用写控制指令子函数,并用实参 "0000 0110" 代替形参 com//0x06 表示当读或写一个字符后地址指针加 1,且光标加 1; 当写一个字符时,整屏显示不移动delay1ms(5);wr_com(0x0c);// 调用写控制指令子函数,并用实参 "0000 1100" 代替形参 com//0x0c 打开显示、不显示光标、光标不闪烁delay1ms(5);}

2、液晶显示程序

void wr_com(uchar com) //lcd 写控制指令子函数,形参为 com{delay1ms(1); // 调用延时子函数,并用实参 1 代替延时子函数中的形参 msRS=0; //RS=0 进入写命令状态,即一些 LCD设置命令RW=0; //RW=0 为写模式EN=0; //EN=0 时不能完成写操作P2=com; // 把要设置的指令码 com送给 P2 口delay1ms(1);EN=1; // 给 EN一个高脉冲,将数据送入液晶控制器,完成写操作delay1ms(1);EN=0; }//EN=0 时不能完成写操作/******************检测忙标志函数***************************/void check_busy(void){uchar dt;do{dt=0xff;EN=0;RS=0;RW=1;EN=1;dt=P2;}while(dt&0x80);EN=0;}//*****************写数据*******************************/void wr_dat(uchar dat) //lcd 写显示数据子函数,形参为 dat{/* check_busy();*/delay1ms(1);RS=1; //RS=1 进入写数据状态,即要显示的内容RW=0; //RW=0 为写模式EN=0; //EN=0 时不能完成写操作P2=dat; // 把要显示的数据 dat 送给 P2 口delay1ms(1);EN=1; // 给 EN一个高脉冲,将数据送入液晶控制器,完成写操作delay1ms(1);EN=0; //EN=0 时不能完成写操作}

3、DS18B20程序

/********************************************************//********************ds18b20 程序 ***********************/void delay_18b20(uint i) // 延时 1 微秒{while(i--);}void ds18b20rst() //ds18b20 初始化子函数// 要求"数据线拉高 - 延时 - 数据线拉低 - 延时大于 480 微妙 -数据线拉高 - 延时等待 "{uchar x=0;DQ = 1; // 信号线 DQ复位delay_18b20(4); // 延时DQ = 0; //DQ 拉低delay_18b20(100); // 精确延时大于 480usDQ = 1; // 拉高delay_18b20(40);}void ds18b20wr(uchar wdata) /* 写数据子函数 , 无返回值,含参数 */{uchar i=0;for (i=8; i>0; i--)// 要写完一个字节,故需要重复 8 次以下操作{DQ = 0; // 数据线拉低DQ = wdata&0x01;//wdata 是一个形参,将其与 0000 0001 进行按位与// 按从低到高的顺序发送数据(一次发送一位 )delay_18b20(10);DQ = 1; // 最后将数据线拉高wdata>>=1; // 将 wdata 右移 1 位}}uchar ds18b20rd() // 读数据子函数 , 是有返回值 dat{uchar i=0;uchar dat = 0;for (i=8;i>0;i--)// 要读完一个字节,故需要重复 8 次以下操作{DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18b20(10);}return(dat); // 返回 dat}read_temp() // 读取温度值并转换的子函数,有返回值温度值 tvalue{uchar a,b;ds18b20rst(); // 调用 ds18b20 初始化子函数ds18b20wr(0xcc);// 调用写数据子函数,向 ds18b20 写命令 0xcc//ccH 表示跳过 ROM读序列号,适用于单机工作,直接向 18b20 发送温度变换命令ds18b20wr(0x44);// 调用写数据子函数,向 ds18b20 写命令 0x44//44H 表示启动 ds18b20 温度转换 , 结果自行存入 9 字节的 RAM中ds18b20rst(); // 调用 ds18b20 初始化子函数ds18b20wr(0xcc);// 同上ds18b20wr(0xbe);// 调用写数据子函数,向 ds18b20 写命令 0xbe//beH 表示读取 RAM中 9 字节的温度数据a=ds18b20rd(); // 调用读数据子函数,并将所得数据给 ab=ds18b20rd(); //tvalue=b; // 把 b 的值给 tvaluetvalue<<=8; //tvalue 左移 8 位tvalue=tvalue|a;//tvalue 与 a 进行按位或if(tvalue<0x0fff)//tflag=0; // 前五位为 0 时,读取的温度为正,标志位为 0,此时只要// 将测得数值乘以 0.0625 即可得到实际温度else // 前五位为 1 时,读取的温度为负,标志位为 1,此时需要{ // 将测得数值取反后再加 1,再乘以 0.0625 即可得到实际温度tflag=1; // 此时表示负温度tvalue=~tvalue+1;}tvalue=tvalue*(0.625);// 温度值扩大 10 倍,精确到 1 位小数return(tvalue); // 返回温度值}/**********************************************************//************************ 温度值显示 *********************/void ds18b20disp() // 温度值显示{uchar flagdat;disdata[0]=tvalue/1000+0x30; // 百位数disdata[1]=tvalue%1000/100+0x30;// 十位数disdata[2]=tvalue%100/10+0x30; // 个位数disdata[3]=tvalue%10+0x30; // 小数位if(tflag==0)flagdat=0x2b; // 正温度显示符号 :+elseflagdat=0x2d; // 负温度显示负号 :-if(disdata[0]==0x30){disdata[0]=0x20; // 如果百位为 0,不显示if(disdata[1]==0x30){disdata[1]=0x20; // 如果百位为 0,十位为 0 也不显示}}wr_com(0x80+0x46); // 定位数据指针的位置:第二行第五个字符处wr_dat(flagdat); // 显示符号位wr_com(0x80+0x47); // 定位数据指针的位置:第二行第六个字符处wr_dat(disdata[0]); // 显示百位wr_com(0x80+0x48); // 定位数据指针的位置:第二行第七个字符处wr_dat(disdata[1]); // 显示十位wr_com(0x80+0x49); // 定位数据指针的位置:第二行第八个字符处wr_dat(disdata[2]); // 显示个位wr_com(0x80+0x4A); // 定位数据指针的位置:第二行第九个字符处wr_dat(0x2e); // 显示小数点wr_com(0x80+0x4B); // 定位数据指针的位置:第二行第十个字符处wr_dat(disdata[3]); // 显示小数位/**********************显示摄氏度************************/wr_com(0x80+0x4C); // 定位数据指针的位置:第二行第十一个字符处wr_dat(0XDF);wr_com(0x80+0x4D); // 定位数据指针的位置:第二行第十二个字符处wr_dat(0X43);}

4、核心算法程序

uint ReadADC_TLC1543(uchar ain){uchar t;uint adc_value = 0;ain <<= 4;CS_1543 = 0;for (t = 0; t < 10; t++)         // 将判断语句改为 temp<12{                                       // 程序可移殖至 TLC2543.adc_value <<= 1;ain <<= 1;ADDR_1543 = CY;if (DOUT_1543)   adc_value += 1;SCLK_1543 = 1;delayus(1);SCLK_1543 = 0;}CS_1543 = 1;return  adc_value;}

四、 proteus仿真设计

Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

图片

资料扣作者

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

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

相关文章

持安科技入选数说安全《2023中国网络安全市场年度报告》

近日&#xff0c;网络安全产业研究平台数说安全发布《2023中国网络安全市场年度报告》&#xff0c;报告共分为158页核心报告&#xff0c;及番外篇《网安融资新星及融资过亿企业介绍》&#xff0c;作为以甲方身份创业的零信任办公安全明星企业&#xff0c;持安科技以网安融资新星…

MATLAB R2023a完美激活版(附激活补丁)

MATLAB R2023a是一款面向科学和工程领域的高级数学计算和数据分析软件&#xff0c;它为Mac用户提供了强大的工具和功能&#xff0c;用于解决各种复杂的数学和科学问题。以下是MATLAB R2023a Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;MATLAB R2023a完美激活版 …

select多选回显问题 (取巧~)

要实现的效果&#xff1a; 实际上select选择框&#xff0c;我想要的是数组对象&#xff0c;但是后端返回来的是个字符串。 以下是解决方法&#xff1a; 以上是一种简单的解决方法~ 也可以自己处理数据或者让后端直接改成想要的格式。

Kafka3.0.0版本——消费者(手动提交offset)

目录 一、消费者&#xff08;手动提交 offset&#xff09;的概述1.1、手动提交offset的两种方式1.2、手动提交offset两种方式的区别1.3、手动提交offset的图解 二、消费者&#xff08;手动提交 offset&#xff09;的代码示例2.1、手动提交 offset&#xff08;采用同步提交的方式…

Python爬虫 教程:IP池的使用

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、简介 爬虫中为什么需要使用代理 一些网站会有相应的反爬虫措施&#xff0c;例如很多网站会检测某一段时间某个IP的访问次数&#xff0c;如果访问频率…

[SICTF 2023 #Round2] Crypto,PWN,Reverse

似乎很久没写了。 周五到周日&#xff0c;两天的这个比赛&#xff0c;有些东西还真是头回用&#xff0c;值得纪录一下。 Crypto 密码这块这届还是比较简单的&#xff0c;没有复杂的题&#xff0c;但量大分多。 【签到】古典大杂烩 给了一堆emoji的图 &#x1f429;&#x…

GCP Architect之VPN+Network

VPN 搜索结果共计:11 [单选]As part of implementing their disaster recovery plan, your company is trying to replicate their production MySQL database from their private data center to their GCP project using a Google Cloud VPN connection. They are experien…

OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合

目录 1.轮廓外接最大矩形boundingRect() 2.轮廓外接最小矩形minAreaRect() 3.轮廓外接多边形approxPolyDP() 1.轮廓外接最大矩形boundingRect() Rect cv::boundingRect ( InputArray array ) array:输入的灰度图像或者2D点集&#xff0c;数据类型为vector<Point>或者M…

Go语言的[GPM模型]

在go中,线程是运行Groutine的实体,调度器的功能是把可以运行的Groutine分配到工作线程上 GPM模型 M与P的数量没有绝对的数量关系,当一个M阻塞时,P就会创建一个或者切换到另一个M,所以即使设置了runtime.GOMAXPROCS(1) 也可能创建多个M出来; 当M发现给自己输送G协程的那个P队列为…

《AI一键生成抖音商品种草文案》让你秒变带货王!

在这个数字化的时代&#xff0c;我们的生活被各种应用所包围&#xff0c;其中&#xff0c;抖音作为一款短视频分享平台&#xff0c;已经成为了我们生活中不可或缺的一部分。然而&#xff0c;作为一名抖音创作者&#xff0c;你是否曾经遇到过这样的困扰&#xff1a;在创作商品种…

C#程序到底从哪里开始看,从Main函数开始,那么Main函数是什么?

视觉人机器视觉粉丝问我,拿到自己公司得架构,问我,C#程序到底从哪里看,从Main函数开始,那么Main函数是什么? Main()函数 Main()是C#应用程序的入口点,执行这个函数就是执行应用程序。也就是说,在执行过程开始时,会执行Main()函数,在Main()函数执行完毕时,执行过…

【JavaSpring】spring接口-beanfactory和applicationcontext与事件解耦

beanfactory 1.applicationcontext的父接口 2.是Spring的核心容器 功能 表面只有getBean&#xff0c;但实现类默默发挥了巨大作用 1.管理所有bean 2.控制反转 3.基本的依赖注入 applicationcontext 功能 1.继承了MessageSource&#xff0c;有了处理国际化资源的能力 …

[H5动画制作系列] Sprite及Text Demo

参考代码: sprite.js: var canvas, stage, container; canvas document.getElementById("mainView"); function init() {stage new createjs.Stage(canvas);createjs.Touch.enable(stage);var loader new createjs.LoadQueue(false);loader.addEventListener(&q…

云计算与虚拟化

一、概念 什么是云计算&#xff1f; 云计算&#xff08;cloud computing&#xff09;是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果…

SLAM论文详解(5) — Bundle_Adjustment_LM(BALM)论文详解

目录 1 摘要 2 相关工作 3 BA公式和导数 A. 直接BA公式 B. 导数 C. 二阶近似 4 自适应体素化 5. 将BALM结合进LOAM 6. 实验 7. 算法应用场景解析 1 摘要 Bundle Adjustment是一种用于同时估计三维结构和传感器运动运动的优化算法。在视觉SLAM&#xff0c;三维重建等…

爬虫逆向实战(30)-某查查股东关联公司(HmacSHA512)

一、数据接口分析 主页地址&#xff1a;某查查 1、抓包 通过抓包可以发现数据接口是api/people/getRelatCompany 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无 请求头是否加密&#xff1f; 通过查看“标头”可以发现&#xff0c;请求头中有一个key和value都是…

基于Sentinel的微服务保护

前言 Sentinel是Alibaba开源的一款微服务流控组件&#xff0c;用于解决分布式应用场景下服务的稳定性问题。Sentinel具有丰富的应用场景&#xff0c;它基于流量提供一系列的服务保护措施&#xff0c;例如多线程秒杀情况下的系统承载&#xff0c;并发访问下的流量控制&#xff…

9.8day59

503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 知识点&#xff1a;单调栈 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09;

Qt的窗口系统

代码仓库以及参考文件见文章底部 坐标体系 要想学好GUI,界面的坐标系首先要搞清楚 在Qt编程中,以左上角为原点,X向右增加,Y向下增加。 对于所有嵌套的窗口,其坐标是相对于父窗口来说的。 QWidget 所有窗口以及窗口控件都是从QWidget直接或者间接派生出来的。 对象模…

基于Fomantic UI Web构建 个人导航站点网站源码 网站技术导航源码

BYR-Navi-master好看有个性的网站技术导航源码 该网站基于Fomantic UI Web框架构建&#xff0c;整个项目的设计和构建具有高度的配置和定制灵活性。 整体风格比较适合个人导航站点使用 搜索框输入关键词后&#xff0c;点击上方搜索引擎图标可跳转打开对应搜索引擎搜索结果&am…