找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12558|回复: 14
打印 上一主题 下一主题
收起左侧

DS18B20温度传感器protues仿真程序

  [复制链接]
跳转到指定楼层
楼主


  1. /*-------------------------------
  2. 作者:小新
  3. qq:405228062
  4. email:xuxing1261207@126.com
  5. --------------------------------*/
  6. #include <reg51.h>//用AT89C51时就用这个头文件
  7. //#include <reg52.h>
  8. #include <absacc.h>
  9. #include <ctype.h>
  10. #include <math.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <DS18B20.h>
  14. #include "LCD1602.h"                        ////液晶显示头文件
  15. sbit Key1=P1^0;
  16. sbit Key2=P1^1;
  17. sbit Up  =P1^2;
  18. sbit Down=P1^3;
  19. unsigned char t[2],*pt;                                //用来存放温度值,测温程序就是通过这个数组与主函数通信的
  20. unsigned char  TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};
  21.                                                                 //显示实时温度,上电时显示+125.00C
  22. unsigned char  TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
  23.                                                                 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};
  24.                                                                 //显示温度上下限,上电时显示TH:+125 TL:+124C                                                       
  25. unsigned char code dotcode[4]={0,25,50,75};
  26. /***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******
  27. 再将表值分离出十位和个位后送到十分位和百分位********************/


  28. void covert0( unsigned char TH, unsigned char TL)        //将温度上下限转换为LCD显示的数据
  29. {
  30.    if(TH>0x7F)                    //判断正负,如果为负温,将其转化为其绝对值
  31.    {
  32.     TempBuffer0[3]=0x2d;             //0x2d为"-"的ASCII码
  33.         TH=~TH;
  34.         TH++;
  35.    }
  36.    else TempBuffer0[3]=0x2b;        //0x2B为"+"的ASCII码

  37.    if(TL>0x7f)
  38.    {
  39.    TempBuffer0[11]=0x2d;             //0x2d为"-"的ASCII码
  40.    TL=~TL+1;
  41.    }
  42.    else TempBuffer0[11]=0x2b;        //0x2B为"+"的ASCII码

  43.   TempBuffer0[4]=TH/100+0x30;                             //分离出TH的百十个位
  44.   if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐
  45.   TempBuffer0[5]=(TH%100)/10+0x30;                                //分离出十位
  46.   TempBuffer0[6]=(TH%100)%10+0x30;                                 //分离出个位
  47.   TempBuffer0[12]=TL/100+0x30;                             //分离出TL的百十个位
  48.   if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐
  49.   TempBuffer0[13]=(TL%100)/10+0x30;                                //分离出十位
  50.   TempBuffer0[14]=(TL%100)%10+0x30;                                 //分离出个位
  51. }


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

  86. void delay(unsigned int i)
  87. {
  88.         while(i--);
  89. }

  90. main()
  91. {
  92. unsigned char TH=50,TL=10,temp=0;                                            //下一步扩展时可能通过这两个变量,调节上下限
  93.                                                                                 //测温函数返回这个数组的头地址
  94. Beep=0;Relay=0;
  95. while(1)
  96. {       
  97.     if(Key1==0)
  98.         {
  99.            while(!Key1);
  100.            TH++;
  101.         }
  102.         if(Key2==0)
  103.         {
  104.                 while(!Key2);
  105.                 TH--;
  106.         }
  107.        
  108.         if(Up==0)
  109.         {
  110.            while(!Up);
  111.            TL++;
  112.         }
  113.         if(Down==0)
  114.         {
  115.                 while(!Down);
  116.                 TL--;
  117.         }
  118.         pt=ReadTemperature(TH,TL,0x3f);                 //上限温度-22,下限-24,分辨率10位,也就是0.25C
  119.                                                                                  //读取温度,温度值存放在一个两个字节的数组
  120.    
  121.     if((t[1]>TH)|(t[1]<TL))
  122.         {
  123.             Beep=1;
  124.                 Relay=1;
  125.        
  126.         }
  127.         else
  128.         {
  129.             Beep=0;
  130.                 Relay=0;
  131.         }
  132.         delay(10000);
  133.         covert1();
  134.         covert0(TH,TL);
  135.         LCD_Initial();                                                        //第一个参数列号,第二个为行号,为0表示第一行
  136.                                                                                         //为1表示第二行,第三个参数为显示数据的首地址
  137.         LCD_Print(0,0,TempBuffer0);       
  138.         LCD_Print(0,1,TempBuffer1);                                
  139. }
  140. }

复制代码



DS18B20温度传感器.rar

110.04 KB, 下载次数: 455, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:4810 发表于 2017-2-19 10:42 | 只看该作者
学习学习
回复

使用道具 举报

板凳
ID:248620 发表于 2017-11-12 16:15 | 只看该作者
学习学习
回复

使用道具 举报

地板
ID:324052 发表于 2018-5-7 11:33 | 只看该作者
感谢                  
回复

使用道具 举报

5#
ID:295227 发表于 2018-5-15 11:47 | 只看该作者
谢谢分享~~~
回复

使用道具 举报

6#
ID:361418 发表于 2018-6-28 22:39 | 只看该作者
下载不了啊
回复

使用道具 举报

7#
ID:442582 发表于 2018-12-10 17:35 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
ID:230847 发表于 2018-12-14 13:54 | 只看该作者
正需要这个,自己写的程序读不出数据,不知道是哪里的问题,参考一下。谢谢
回复

使用道具 举报

9#
ID:449534 发表于 2018-12-19 08:45 | 只看该作者
学习一下
回复

使用道具 举报

10#
ID:302712 发表于 2019-6-25 21:13 | 只看该作者
这个不错哦
回复

使用道具 举报

11#
ID:152913 发表于 2020-4-3 15:38 | 只看该作者
[SPICE] TRAN:  Timestep too small; timestep = 1.73472e-018: trouble with node #00059.
报错这个怎么解决嘞
回复

使用道具 举报

12#
ID:742058 发表于 2020-5-2 00:04 | 只看该作者
太棒棒了
回复

使用道具 举报

13#
ID:785363 发表于 2020-6-21 19:32 | 只看该作者
太好了
回复

使用道具 举报

14#
ID:787318 发表于 2020-6-23 09:06 | 只看该作者
编译 显示 有 两个错误    应该是  没有。h  文件
回复

使用道具 举报

15#
ID:981034 发表于 2021-11-17 16:35 | 只看该作者
正需要这个,自己写的程序读不出数据,不知道是哪里的问题,参考一下。谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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