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

news2025/9/15 9:35:09

图片

一、系统方案

本设计采用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 代替延时子函数中的形参 ms

RS=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); // 精确延时大于 480us

DQ = 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(); // 调用读数据子函数,并将所得数据给 a

b=ds18b20rd(); //

tvalue=b; // 把 b 的值给 tvalue

tvalue<<=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; // 正温度显示符号 :+

else

flagdat=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.coloradmin.cn/o/998245.html

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

相关文章

Matlab图像处理-边缘提取

基本概念 如果一个像素落在图像中某一个物体的边界上&#xff0c;那么它的邻域将成为一个灰度级变化的带。对这种变化最有用的两个特征是灰度的变化率和方向&#xff0c;它们分别以梯度向量的幅度和方向来表示。 边缘检测算子检查每一个像素的邻域并对灰度变化率进行量化&…

100天精通Python(可视化篇)——第100天:Pyecharts绘制多种炫酷漏斗图参数说明+代码实战

文章目录 专栏导读一、漏斗图介绍1. 说明2. 应用场景 二、漏斗图类说明1. 导包2. add函数 三、漏斗图实战1. 基础漏斗图2. 标签内漏斗图3. 百分比漏斗图4. 向上排序漏斗图5. 标准漏斗图 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到就业》&…

特殊矩阵的压缩存储(对称矩阵,三角矩阵和三对角矩阵)

目录 1.对阵矩阵 2.三角矩阵 3.三对角矩阵&#xff08;带状矩阵&#xff09; 均假设数组的下标从0开始 1.对阵矩阵 定义&#xff1a;若对一个n阶矩阵A中的任意一个元素 aᵢ,ⱼ 都有aᵢ,ⱼaⱼ,ᵢ &#xff08;1≤i,j≤n&#xff09;&#xff0c;则称其为对称矩阵。 存储策略…

Spring最佳实践: 构建高效可维护的Java应用程序

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

第7章_瑞萨MCU零基础入门系列教程之UART

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

编译国产openEuler 22.03 LTS系统OpenSSH 9.4的rpm安装包

目前OpenSSH版本已至9.4&#xff0c;其作为操作系统底层管理平台软件&#xff0c;需要保持更新以免遭受安全攻击&#xff0c;编译生成rpm包是生产环境中批量升级的最佳途径。本文在国产openEuler 22.03 LTS系统上完成OpenSSH 9.4的编译工作。 一、准备编译环境&#xff1a; 1…

【北大核心CSCD期刊】生物特征识别论文投稿经历

计算机工程与应用&#xff1a;半月刊、审稿快、比较简单。

iisfastchi漏洞复现

1.查看版本 2.在路径中写入 php脚本 发现使用不了 3.环境搭建 结局打开 把限制打开

PostgreSQL数据库事务系统——获取virtual transaction id

如果一个事务没有进行INSERT、UPDATE、DELETE操作&#xff0c;那么就步会分配事务ID&#xff0c;但事务仍然用一个虚拟事务ID代表自己。虚拟事务ID由两部分组成&#xff0c;第一部分是Backend ID&#xff0c;另一个是每个会话自己维护的本地事务ID计数器。通过两部分组合&#…

算法通关村第十九关——动态规划高频问题(白银)

算法通关村第十九关——动态规划高频问题&#xff08;白银&#xff09; 前言1 最少硬币数2 最长连续递增子序列3 最长递增子序列4 完全平方数5 跳跃游戏6 解码方法7 不同路径 II 前言 摘自&#xff1a;代码随想录 动态规划五部曲&#xff1a; 确定dp数组&#xff08;dp tabl…

Unicode:Codejock Suite Prov22.1.0 for ActiveX Crack

Codejock 荣获 2022 年 Visual Studio 杂志读者选择奖&#xff01;Visual Studio 杂志宣布了第 28 届年度读者选择奖的获奖者。今年是 Visual Studio 杂志的读者对其 Visual Studio 相关工具和服务进行投票的第 28 年&#xff0c;他们对 42 个类别的产品提供了意见&#xff0c;…

Windows开启linux子系统并迁移到非系统盘

windows用户如想使用linux有一个非常简单的方法&#xff0c;就是开启windows下的linux子系统&#xff0c;也叫做WSL(Windows Subsystem for Linux)&#xff0c;下面简述一下安装过程。 首先打开控制面板&#xff0c;程序功能下面的开启或关闭windows功能 然后再下面这个界面勾…

【C刷题】day1

一、选择题 1.正确的输出结果是 int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n"&#xff0c;x, y); return 0; } 【答案】&#xff1a; 3&#xff0c;8 【解析】&#xff1a; 考点&#xff1a; &#xff…

Redis使用原生命令搭建集群

1.Redis版本及下载 找到安装的redis版本&#xff0c;redis3.0以上版本才支持集群 下载对应的版本 2.安装redis集群 解压上传编译 [hadoophost152 opensource]$ tar -xvf redis-3.2.11.tar.gz [hadoophost152 opensource]$ cd redis-3.2.11/ [hadoophost152 redis-3.2.11]$ ma…

数据结构 每日一练:将带头结点的单链表就地逆置(视频讲解两种方法)

目录 方法一 算法视频分析 方法二 算法视频分析 Q&#xff1a;什么是“就地”捏&#xff1f; A&#xff1a;就是指辅助空间复杂度为O(1)&#xff0c;通俗一点来说就是不需要再开辟一块空间来实现算法。 特别说明&#xff1a; 笔者第一次录制视频&#xff0c;言语有些不顺&…

支持事务的分布式NoSQL——FoundationDB

【引子】周末阅读时光&#xff0c;一篇好的论文&#xff08;https://cacm.acm.org/magazines/2023/6/273229-foundationdb-a-distributed-key-value-store/fulltext&#xff09;&#xff0c;开阔了眼界&#xff0c;支持事务语义的NoSQL应该放到软件系统架构备选方案之中。 Foun…

Kotlin 协程 - 生命周期 Job

一、概念 对于每一个由协程构建器开启的协程&#xff0c;都会返回一个 Job 实例用来管理协程的生命周期。launch()直接返回 Job实现&#xff0c;async() 返回的 Deferred 实现了 Job接口。 Job public fun start(): Boolean public fun cancel(cause: CancellationException? …

java中HashMap如何根据value的值去获取key是多少

在Java中&#xff0c;HashMap是一种基于键值对存储数据的数据结构。HashMap并没有直接提供根据value获取key的方法。但你可以通过遍历HashMap的entrySet&#xff0c;找到对应的value&#xff0c;然后获取其对应的key。 以下是一个示例代码&#xff1a; public <K, V> K…

计算机图形学环境配置java3D

计算机图形学环境配置java3D JDK18&#xff08;或者一些版本都无法支持Applet类&#xff09;idea配置导入java3D的jar包测试代码&#xff1a;运行效果&#xff1a; java3Dwindows64位下载 这个是默认到下图路径中&#xff1a;&#xff08;记住这个路径&#xff0c;待会要导入ja…

2023Web前端开发面试手册

​​​​​​​​ HTML基础 1. HTML 文件中的 DOCTYPE 是什么作用&#xff1f; HTML超文本标记语言: 是一个标记语言, 就有对应的语法标准 DOCTYPE 即 Document Type&#xff0c;网页文件的文档类型标准。 主要作用是告诉浏览器的解析器要使用哪种 HTML规范 或 XHTML规范…