基于51单片机的多点温度检测网络,DS18B20传感器,代码,仿真,原理图等资料
<div class=\"vditor-preview__action\"></div><div class=\"vditor-reset\"><p><strong>设计概述</strong><br>基于DS18B20的多点温度测量监控系统设计,以AT89C52单片机作为主控制器,不断循环读取4组DS18B20(T1、T2、T3和T4)温度数据,同时使用LCD1602液晶循环显示4组测取的温度值以及每组设定的温度上下限值,通过按键可设置每组温度报警上下限和液晶显示的模式(循环显示模式和手动切换显示模式)。</p>
<p>当前组的温度值若不在设定范围内,则蜂鸣器报警,对应的LED灯点亮;具体过程为:温度高于上限值,红色LED灯点亮;温度低于下限值,蓝色LED灯亮。</p>
<p><strong>多点测温</strong><br>
由于每个DS18B20内部均有一个独立的64位序列号,单片机通过序列号可以对一条总线上的多支DS18B20进行控制,读取他们的温度。</p>
<p>单总线本身也可以向所挂接的多个DS18B20供电,而无需额外电源。4组温度传感器的连接网络如下。</p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAL6eAL3DFAACS5j8-NSc685.jpg\" alt=\"传感器网络.jpg\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAL6-APHztAADik0r4soU679.jpg\" alt=\"系统框架.jpg\"></p>
<p><strong>Proteus仿真电路</strong></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAL8uAb6unAAGXmBrTGr0733.jpg\" alt=\"完整电路图.jpg\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAMlqAUPyEAAHczSWR-lo931.jpg\" alt=\"多点温度操作说明.jpg\"></p>
<p>**原理图 **</p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAMoaAY6AIAAHfMtQCons870.jpg\" alt=\"原理图.jpg\"></p>
<p><strong>仿真结果分析</strong></p>
<p>把在KEIL里编译、调试生成的Multi_temp的hex文件导入到Proteus中的AT89C52里进行仿真,整体结果如下:</p>
<p>(1)开机LCD显示界面。</p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAMp6ADV5KAAANP0NObag149.png\" alt=\"开机.png\"></p>
<p>(2)系统正常状态下,循环显示4组DS18B20的温度值以及各组设定的温度上下限值。</p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAMqqAfdWZAAAMjW6sGdI079.png\" alt=\"t1.png\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAMq2AQuxaAAANFMLJ_co021.png\" alt=\"t2.png\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAMrCAHx5BAAAMrOlRI_c206.png\" alt=\"t3.png\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAMrOAAQutAAAMoqgy6HY716.png\" alt=\"t4.png\"></p>
<p>(3)由上图可以看出T1的温度值,低于设定的温度下限值,蜂鸣器报警,且相应的LED指示灯点亮。</p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAMsWAY14qAAAaqCShb3A539.png\" alt=\"报警.png\"></p>
<p>(4)用户可通过按键设置每组温度传感器的上下限值,以及从循环显示切换为手动显示。</p>
<p><strong>C代码</strong></p>
<pre><code class=\"hljs typescript vditor-linenumber\"><span class=\"hljs-built_in\">void</span> <span class=\"hljs-function\"><span class=\"hljs-title\">tmpchange2</span>(<span class=\"hljs-params\"><span class=\"hljs-built_in\">void</span></span>)</span>
{ uchar j;
dsreset2();<span class=\"hljs-comment\">//初始化 DS18B20 </span>
delay_DS(<span class=\"hljs-number\">1</span>);<span class=\"hljs-comment\">//延时 </span>
tmpwritebyte2(<span class=\"hljs-number\">0x55</span>);
<span class=\"hljs-keyword\">for</span>(j=<span class=\"hljs-number\">0</span>;j<<span class=\"hljs-number\">8</span>;j++)
{ tmpwritebyte2(str3); }
tmpwritebyte2(<span class=\"hljs-number\">0x44</span>); <span class=\"hljs-comment\">//发送温度转换命令 </span>
}
<span class=\"hljs-built_in\">void</span> <span class=\"hljs-function\"><span class=\"hljs-title\">tmpchange3</span>(<span class=\"hljs-params\"><span class=\"hljs-built_in\">void</span></span>)</span>
{ uchar j;
dsreset3();<span class=\"hljs-comment\">//初始化 DS18B20 </span>
delay_DS(<span class=\"hljs-number\">1</span>); <span class=\"hljs-comment\">//延时 </span>
tmpwritebyte3(<span class=\"hljs-number\">0x55</span>);
<span class=\"hljs-keyword\">for</span>(j=<span class=\"hljs-number\">0</span>;j<<span class=\"hljs-number\">8</span>;j++)
{ tmpwritebyte3(str4); }
tmpwritebyte3(<span class=\"hljs-number\">0x44</span>);<span class=\"hljs-comment\">//发送温度转换命令 </span>
}
<span class=\"hljs-comment\">//get the temperature获得温度</span>
uint <span class=\"hljs-function\"><span class=\"hljs-title\">tmp0</span>(<span class=\"hljs-params\"></span>)</span>
{
float tt;
uchar a,b,j;
dsreset0();
delay_DS(<span class=\"hljs-number\">1</span>);
<span class=\"hljs-comment\">//发送读取数据命令</span>
tmpwritebyte0(<span class=\"hljs-number\">0x55</span>);
<span class=\"hljs-keyword\">for</span>(j=<span class=\"hljs-number\">0</span>;j<<span class=\"hljs-number\">8</span>;j++)
{ tmpwritebyte0(str1); }
tmpwritebyte0(<span class=\"hljs-number\">0xbe</span>);
<span class=\"hljs-comment\">//连续读两个字节数据 </span>
a=tmpread0();
b=tmpread0();
<span class=\"hljs-comment\">//two byte compose a int variable </span>
<span class=\"hljs-comment\">//两字节合成一个整型变量。</span>
temp_DS=b;
temp_DS<<=<span class=\"hljs-number\">8</span>;
temp_DS=temp_DS|a;
<span class=\"hljs-keyword\">if</span>(temp_DS&<span class=\"hljs-number\">0xf800</span>)
{
ZF1=<span class=\"hljs-number\">1</span>;
temp_DS=~temp_DS+<span class=\"hljs-number\">1</span>;
}
<span class=\"hljs-keyword\">else</span>
ZF1=<span class=\"hljs-number\">0</span>;
<span class=\"hljs-comment\">//得到真实十进制温度值,因为 DS18B20 </span>
tt=temp_DS*<span class=\"hljs-number\">0.0625</span>;
<span class=\"hljs-comment\">//可以精确到 0.0625 度,所以读回数据的最低位代表的是 </span>
<span class=\"hljs-comment\">//0.0625 度。</span>
<span class=\"hljs-comment\">//设计获取,蒋宇智QQ(2327603104)</span>
<span class=\"hljs-comment\">//放大十倍,这样做的目的将小数点后第一位 </span>
temp_DS=tt*<span class=\"hljs-number\">10</span>+<span class=\"hljs-number\">0.5</span>;
<span class=\"hljs-comment\">//也转换为可显示数字,同时进行一个四舍五入操作。 </span>
<span class=\"hljs-comment\">//返回温度值</span>
<span class=\"hljs-keyword\">return</span> temp_DS;
}
uint <span class=\"hljs-function\"><span class=\"hljs-title\">tmp1</span>(<span class=\"hljs-params\"></span>)</span>
{
float tt;
uchar a,b,j;
dsreset1();
delay_DS(<span class=\"hljs-number\">1</span>);
tmpwritebyte1(<span class=\"hljs-number\">0x55</span>);
<span class=\"hljs-keyword\">for</span>(j=<span class=\"hljs-number\">0</span>;j<<span class=\"hljs-number\">8</span>;j++)
{ tmpwritebyte1(str2); }
tmpwritebyte1(<span class=\"hljs-number\">0xbe</span>);
<span class=\"hljs-comment\">//连续读两个字节数据 </span>
a=tmpread1();
b=tmpread1();
<span class=\"hljs-comment\">//two byte compose a int variable </span>
<span class=\"hljs-comment\">//两字节合成一个整型变量。</span>
temp_DS=b;
temp_DS<<=<span class=\"hljs-number\">8</span>;
<span class=\"vditor-linenumber__rows\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
<p><strong>资源内容</strong></p>
<p>(1)基于DS18B20的多点温度测量监控系统设计论文完整版;</p>
<p>(2)Proteus仿真文件;</p>
<p>(3)C程序;</p>
<p>(4)原理图;</p>
<p>(5)Visio流程图文件;</p>
<p>(6)元器件清单;</p>
<p>(7)参考资料;</p>
<p><strong>资源截图</strong></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAMt6ARqaGAAAhDZGDdMw525.jpg\" alt=\"资料1.jpg\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAMuKARSLtAAAZNK4IPdE585.jpg\" alt=\"资料2.jpg\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAMuWAEpmpAAAfkRcsCnc407.jpg\" alt=\"资料3.jpg\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAMuiAX60YAABF2Z--EbI438.jpg\" alt=\"资料4.jpg\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C5/96/wKgZomYAMuyARZ7yAAAqYTa3pOY514.jpg\" alt=\"资料5.jpg\"></p>
<p><img src=\"//file1.elecfans.com/web2/M00/C6/80/wKgaomYAMu-AUDPCAABHwC-kwEY467.jpg\" alt=\"资料6.jpg\"></p>
</div>
页:
[1]