标题: DS18B20温度传感器protues仿真程序 [打印本页]

作者: 51黑电子迷    时间: 2017-2-19 00:56
标题: 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, 下载次数: 456, 下载积分: 黑币 -5


作者: dalide    时间: 2017-2-19 10:42
学习学习
作者: 是非得失1    时间: 2017-11-12 16:15
学习学习
作者: nzr786    时间: 2018-5-7 11:33
感谢                  
作者: tikelu    时间: 2018-5-15 11:47
谢谢分享~~~
作者: wanghuihao    时间: 2018-6-28 22:39
下载不了啊
作者: 布莱爱庆    时间: 2018-12-10 17:35
谢谢分享
作者: 一束光的旅程    时间: 2018-12-14 13:54
正需要这个,自己写的程序读不出数据,不知道是哪里的问题,参考一下。谢谢
作者: 826191469    时间: 2018-12-19 08:45
学习一下
作者: dragonman    时间: 2019-6-25 21:13
这个不错哦
作者: 兰小方    时间: 2020-4-3 15:38
[SPICE] TRAN:  Timestep too small; timestep = 1.73472e-018: trouble with node #00059.
报错这个怎么解决嘞
作者: 胖狗    时间: 2020-5-2 00:04
太棒棒了
作者: 1790375255    时间: 2020-6-21 19:32
太好了
作者: w1104837613    时间: 2020-6-23 09:06
编译 显示 有 两个错误    应该是  没有。h  文件
作者: HAPPY3    时间: 2021-11-17 16:35
正需要这个,自己写的程序读不出数据,不知道是哪里的问题,参考一下。谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1