找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18630|回复: 32
收起左侧

基于单片机DS18B20温度控制系统 proteus仿真 代码

  [复制链接]
ID:200440 发表于 2017-5-17 13:43 | 显示全部楼层 |阅读模式
温度控制系统,DS18B20,仿真,源程序
DS18B20信真图.gif 0.png

单片机源程序代码如下:
  1. #include <at89x51.h>//用AT89C51时就用这个头文件
  2. //#include <reg52.h>//用华邦W78E58B时必须用这个头文件
  3. #include <absacc.h>
  4. #include <ctype.h>
  5. #include <math.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <DS18B20.h>
  9. #include "LCD1602.h"                        ////液晶显示头文件
  10. //sbit DQ = P3^4;                                        //定义DQ引脚为P3.4
  11. unsigned char t[2],*pt;                                //用来存放温度值,测温程序就是通过这个数组与主函数通信的
  12. unsigned char  TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};
  13.                                                                 //显示实时温度,上电时显示+125.00C
  14. unsigned char  TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
  15.                                                                 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};
  16.                                                                 //显示温度上下限,上电时显示TH:+125 TL:+124C                                                       
  17. unsigned char code dotcode[4]={0,25,50,75};
  18. /***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******
  19. 再将表值分离出十位和个位后送到十分位和百分位********************/


  20. void covert0( unsigned char TH, unsigned char TL)        //将温度上下限转换为LCD显示的数据
  21. {
  22.    if(TH>0x7F)                    //判断正负,如果为负温,将其转化为其绝对值
  23.    {
  24.     TempBuffer0[3]=0x2d;             //0x2d为"-"的ASCII码
  25.         TH=~TH;
  26.         TH++;
  27.    }
  28.    else TempBuffer0[3]=0x2b;        //0x2B为"+"的ASCII码

  29.    if(TL>0x7f)
  30.    {
  31.    TempBuffer0[11]=0x2d;             //0x2d为"-"的ASCII码
  32.    TL=~TL+1;
  33.    }
  34.    else TempBuffer0[11]=0x2b;        //0x2B为"+"的ASCII码

  35.   TempBuffer0[4]=TH/100+0x30;                             //分离出TH的百十个位
  36.   if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐
  37.   TempBuffer0[5]=(TH%100)/10+0x30;                                //分离出十位
  38.   TempBuffer0[6]=(TH%100)%10+0x30;                                 //分离出个位
  39.   TempBuffer0[12]=TL/100+0x30;                             //分离出TL的百十个位
  40.   if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐
  41.   TempBuffer0[13]=(TL%100)/10+0x30;                                //分离出十位
  42.   TempBuffer0[14]=(TL%100)%10+0x30;                                 //分离出个位
  43. }


  44. void covert1(void)        //将温度转换为LCD显示的数据
  45. {
  46.    unsigned char x=0x00,y=0x00;
  47.    t[0]=*pt;
  48.    pt++;
  49.    t[1]=*pt;
  50.    if(t[1]>0x07)                    //判断正负温度
  51.    {
  52.     TempBuffer1[0]=0x2d;             //0x2d为"-"的ASCII码
  53.         t[1]=~t[1];                         /*下面几句把负数的补码*/
  54.         t[0]=~t[0];                  /* 换算成绝对值*********/
  55.         x=t[0]+1;                                 /***********************/
  56.         t[0]=x;                                         /***********************/
  57.         if(x>255)                /**********************/
  58.         t[1]++;                                 /*********************/
  59.    }
  60.    else TempBuffer1[0]=0x2b;        //0xfe为变"+"的ASCII码
  61.   t[1]<<=4;                //将高字节左移4位
  62.   t[1]=t[1]&0x70;                //取出高字节的3个有效数字位
  63.   x=t[0];                                        //将t[0]暂存到X,因为取小数部分还要用到它
  64.   x>>=4;                                        //右移4位
  65.   x=x&0x0f;                                        //和前面两句就是取出t[0]的高四位       
  66.   t[1]=t[1]|x;                        //将高低字节的有效值的整数部分拼成一个字节
  67.   TempBuffer1[1]=t[1]/100+0x30;                             //+0x30 为变 0~9 ASCII码
  68.    if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐
  69.   TempBuffer1[2]=(t[1]%100)/10+0x30;                                //分离出十位
  70.   TempBuffer1[3]=(t[1]%100)%10+0x30;                                 //分离出个位
  71.   t[0]=t[0]&0x0c;                                                        //取有效的两位小数
  72.   t[0]>>=2;                                                                        //左移两位,以便查表
  73.   x=t[0];                                                                               
  74.   y=dotcode[x];                                                                        //查表换算成实际的小数
  75.   TempBuffer1[5]=y/10+0x30;                                                        //分离出十分位
  76.   TempBuffer1[6]=y%10+0x30;                                                        //分离出百分位
  77. }                       

  78. void delay(unsigned char i)
  79. {
  80.         while(i--);
  81. }

  82. main()
  83. {
  84. unsigned char TH=110,TL=-20;                                            //下一步扩展时可能通过这两个变量,调节上下限
  85.                                                                                 //测温函数返回这个数组的头地址
  86. while(1)
  87. {       
  88.     pt=ReadTemperature(TH,TL,0x3f);                 //上限温度-22,下限-24,分辨率10位,也就是0.25C
  89.                                                                                  //读取温度,温度值存放在一个两个字节的数组中,
  90. ……………………

  91. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
DS18B20温度控制电路(proteus仿真电路 C源程序).zip (406 KB, 下载次数: 800)

评分

参与人数 1黑币 +5 收起 理由
dingqinhong + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:268470 发表于 2017-12-28 17:56 | 显示全部楼层
大神可以的
回复

使用道具 举报

ID:328948 发表于 2018-5-14 10:08 | 显示全部楼层
文件1.c中不全啊,是要哪几个文件啊
回复

使用道具 举报

ID:330342 发表于 2018-5-15 13:06 | 显示全部楼层
看看程序
回复

使用道具 举报

ID:329293 发表于 2018-5-15 15:44 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:331270 发表于 2018-5-16 14:44 | 显示全部楼层
控制电路怎么实现啊    恒温控制电路
回复

使用道具 举报

ID:268143 发表于 2018-6-4 17:32 | 显示全部楼层
感想分享
回复

使用道具 举报

ID:335758 发表于 2018-6-5 15:13 | 显示全部楼层
请问一下为什么仿真的代码看不到,不知道是不是我的proteus的问题
回复

使用道具 举报

ID:345473 发表于 2018-6-6 10:01 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:120108 发表于 2018-6-25 22:14 | 显示全部楼层
楼主厉害 帮顶
回复

使用道具 举报

ID:359667 发表于 2018-6-27 08:27 | 显示全部楼层
感谢楼主,好人一生平安
回复

使用道具 举报

ID:410721 发表于 2018-10-17 11:38 | 显示全部楼层

感谢楼主,好人一生平安
回复

使用道具 举报

ID:417782 发表于 2018-10-30 10:23 | 显示全部楼层


感谢楼主
回复

使用道具 举报

ID:66287 发表于 2018-10-30 10:47 | 显示全部楼层
挺好的程序,谢谢分享!
回复

使用道具 举报

ID:438815 发表于 2018-12-13 09:07 | 显示全部楼层
晶振为什么这样连接
回复

使用道具 举报

ID:194625 发表于 2018-12-16 20:49 | 显示全部楼层
不错的东西,赞一个
回复

使用道具 举报

ID:380539 发表于 2019-1-3 20:15 | 显示全部楼层

看看程序
回复

使用道具 举报

ID:489872 发表于 2019-3-13 13:28 | 显示全部楼层
不错 赞一个
回复

使用道具 举报

ID:519456 发表于 2019-4-24 21:22 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:547542 发表于 2019-5-26 14:45 | 显示全部楼层
感谢 感谢
回复

使用道具 举报

ID:547542 发表于 2019-5-26 14:52 | 显示全部楼层
感谢 楼主
回复

使用道具 举报

ID:382874 发表于 2019-5-27 11:07 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:503018 发表于 2019-6-23 16:42 | 显示全部楼层
非常好
回复

使用道具 举报

ID:503018 发表于 2019-6-29 22:56 | 显示全部楼层
很好,,我非常感谢啊
回复

使用道具 举报

ID:620426 发表于 2019-10-8 11:24 | 显示全部楼层
不错,赞一个!
回复

使用道具 举报

ID:357631 发表于 2019-11-1 15:03 | 显示全部楼层
感谢楼主,好人一生平安
回复

使用道具 举报

ID:654133 发表于 2019-12-2 11:27 | 显示全部楼层
很好
回复

使用道具 举报

ID:594666 发表于 2020-1-3 18:20 来自手机 | 显示全部楼层
主函数文件不全,下载后解压的1.c文件与本贴重复,导致主函数后半部分缺失。请问后续代码如何得到?2394246663@qq.com我的邮箱,请楼主发一下,不胜感激!
回复

使用道具 举报

ID:681481 发表于 2020-1-5 12:25 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:729938 发表于 2020-4-16 12:27 | 显示全部楼层
可以成功吗
回复

使用道具 举报

ID:747067 发表于 2020-5-8 17:16 | 显示全部楼层
不错,真强
回复

使用道具 举报

ID:747067 发表于 2020-5-8 17:17 | 显示全部楼层
大神真强啊
回复

使用道具 举报

ID:758479 发表于 2020-5-22 16:41 | 显示全部楼层
很有帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表