标题: 单片机最小系统+DS18B20进行温度测量试验 串口发送温度结果 [打印本页]

作者: dzdiy    时间: 2015-4-11 22:04
标题: 单片机最小系统+DS18B20进行温度测量试验 串口发送温度结果
       这个用单片机最小系统+DS18B20进行温度测量试验,所需要器材:一块单片机最小系统、一只DS18B20数字温度传感器,测试结果经串口发送到PC机,通过电脑串口调试软件显示测量结果,测量范围-55-125度,保留一位小数。关于单片机最小系统的制作,在本空间有详细介绍,本文就不作介绍,相关的原理图、PCB图、元件清单等内容有,这里就不作介绍了,需要制作的爱好者可参考本空间的手把手制作单片机最小系统。这里只给出单片机最小系统+DS18B20进行温度测量试验的具体程序的压缩包,需要的可以自己下载。需要说明的是,DS18B20的1脚接地、数据端口(2脚)是直接焊接在单片机最小系统板上的单片机P2.0口上、3脚接+5伏。DS18B20的2脚接正电源的4.7K的电阻可以省去,原因是单片机内部是自己带有上接电阻。下面是试验的相关图片。

       下载: 用单片机最小系统 DS18B20进行温度测量试验程序.rar (389.53 KB, 下载次数: 394)       
串口调试助手等单片机工具软件的下载地址:http://www.51hei.com/mcudown/


源代码:
  1. //单片机使用AT89C51晶振11.0592MHz
  2. //读取DS18B20上的数据,发送至电脑
  3. //数据格式:符号、十位、个位、小数、换行符
  4. //分别发送。  串口:(9600,N,8,1)
  5. #include<at89x51.h>

  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. #define DQ P2_0                          //定义P0.0口为单总线数据口

  9. uchar code st[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数部分转换
  10. bit stop=1;
  11. uchar pe=0;                                        //发送指针
  12. uchar t=0;                                        //延时计数
  13. uchar rad;                                        //温度数值
  14. uchar disply[]={'0','0','0','.','0','\n'};//温度极性,十位,个位,小数

  15. void temp(uchar aa);
  16. void rest(void);
  17. void write(uchar da);
  18. void read(void);
  19. void hand(void);
  20. void disp(void);
  21. void timer(void);

  22. void temp(uchar aa)
  23. {
  24.         while(--aa);                        //每执行一次2uS
  25. }

  26. void rest(void)                                //返回"1"时表示有设备应答,复位成功
  27. {
  28.         DQ=1;
  29.         DQ=0;
  30.           temp(225);                                //大于480us低电平产生复位
  31.           DQ=1;
  32.           temp(150);
  33. }

  34. void write(uchar da)
  35. {
  36.         uchar wb=0x01,t;
  37.         for(t=0;t<8;t++)
  38.           {
  39.             if(da&wb)
  40.                  {
  41.                          DQ=0;
  42.                          temp(1);
  43.                          DQ=1;
  44.                          temp(17);
  45.                  }
  46.                  else
  47.                  {
  48.                          DQ=0;
  49.                          temp(12);
  50.                          DQ=1;
  51.                          temp(6);
  52.                  }
  53.                   wb=wb<<1;
  54.           }
  55. }

  56. void read(void)
  57. {
  58.         uchar sb=0x01,s,tes;
  59.         bit pdt;
  60.         rad=0;
  61.         for(s=0;s<8;s++)
  62.         {
  63.                 DQ=0;
  64.                 DQ=1;
  65.                 temp(2);
  66.                 pdt=DQ;
  67.                 temp(18);
  68.                   if(pdt)
  69.                   {
  70.                           rad=rad|sb;
  71.                   }
  72.                 sb=sb<<1;
  73.                 tes=rad;
  74.         }
  75. }

  76. void hand(void)
  77. {
  78.         uchar et,lcm,hcm;
  79.         uint cm;
  80.         rest();
  81.         write(0xcc);                        //跳过
  82.         write(0x44);                        //启动转换
  83.         timer();                                //延时500ms
  84.         rest();
  85.         write(0xcc);                        //跳过
  86.         write(0xbe);                        //读取命令
  87.         read();
  88.         lcm=rad;
  89.         read();
  90.         hcm=rad;
  91.         cm=hcm;
  92.         cm=cm<<8;
  93.         cm=cm|lcm;
  94.           if(cm&0xf000)
  95.           {
  96.                   cm=~cm;
  97.                   cm++;
  98.                   disply[0]='-';
  99.           }
  100.           else
  101.           {
  102.                   disply[0]=' ';
  103.           }
  104.         et=cm&0x000f;
  105.         disply[4]=st[et]|0x30;        //截取后四位,查表转换后,填入显示缓冲区
  106.         et=cm>>4;
  107.           if(et>99)
  108.           {
  109.                   disply[0]='1';
  110.                   et=et-100;
  111.           }
  112.         disply[1]=(et/10)|0x30;        //取温度整数
  113.         disply[2]=(et%10)|0x30;
  114.         stop=0;
  115. }

  116. void pc(void) interrupt 4         //串口中断
  117. {
  118.           if(TI)
  119.           {
  120.             if(pe>5)                        //发送完成
  121.                  {
  122.                          pe=0;
  123.                          stop=1;
  124.                  }
  125.                  else                                //继续发送剩余部分
  126.                  {
  127.                          ACC=disply[pe];
  128.                          SBUF=ACC;
  129.                          pe++;
  130.                  }
  131.                   TI=0;
  132.           }
  133. }

  134. void disp(void)
  135. {
  136.         stop=0;
  137.         ACC=disply[0];
  138.         SBUF=ACC;
  139.         pe++;
  140. }

  141. void tep(void) interrupt 1         //定时器0中断
  142. {
  143.         TH0=0x4c;
  144.         TL0=0x00;
  145.         t++;
  146. }

  147. void timer(void)                        //延时500ms
  148. {
  149.         TR0=1;
  150.           while(t<50);                        //启动定时器,等待10次中断
  151.         TR0=0;
  152.         t=0;
  153.         TH0=0x4c;
  154.         TL0=0x00;
  155. }

  156. void main(void)
  157. {
  158.         TMOD=0x21;                                //定时器1模式2;定时器0模式1
  159. //        TH1=0xfd;
  160. //        TL1=0xfd;                                //波特率9600,11.0592MHz晶振

  161.         TH1=0xE6;
  162.         TL1=0xE6;                                //波特率1200,12MHz晶振


  163.         TH0=0x4c;
  164.         TL0=0x00;                                //定时器初值,50ms
  165.         SCON=0x50;                                //串口模式1,允许接受,单机通讯0x90
  166.         PCON=0;
  167.         IE=0x92;                                //开所有中断,开串口中断,开T0中断
  168.         TR1=1;                                        //启动T1,波特率发生器
  169.         TR0=0;                                        //暂停T0
  170.         disp();
  171.           while(1)
  172.           {
  173.             while(!stop);
  174.                   hand();
  175.                   disp();
  176.         }
  177. }
复制代码




作者: 18629701    时间: 2015-9-30 09:50
下载看看
作者: zy6666    时间: 2015-11-29 23:01
正好需要呢,下来参考下,感谢楼主
作者: zy6666    时间: 2015-11-30 23:20
楼主的程序,温度转换,为什么不乘以0.0625呢

作者: 蕃茄将    时间: 2016-6-24 11:32
PC端如何拿到10禁止数据可以详细点嘛
作者: fengluyao    时间: 2017-3-11 19:40
谢谢,很不错,真好
作者: luoxi123    时间: 2017-5-17 16:30
谢,很不错,真好
作者: wbacsn    时间: 2017-6-19 22:49
我用ds1820b 开串口中断后读出温度不准,应该是串口中断扰乱了ds1820b的时序,这个怎么解决
作者: 骡子的蹄    时间: 2017-12-15 00:26
要是双机通信的话,接收方的程序该怎么样呢?
作者: 邵椋深    时间: 2017-12-29 11:43
你好,这个程序我为什么接收不到温度呢,不准确,一直是-0.01是怎么回事,能帮我看看吗?1397195833,谢谢啦
作者: 持勤补拙    时间: 2017-12-31 14:38
感谢楼主,学习了
作者: 撼地神牛雨    时间: 2018-1-1 23:02
学习一下,参考
作者: lvhm    时间: 2018-11-7 00:24
学习一下,参考
作者: 飞将军    时间: 2018-11-7 12:37
我的学生做过温湿度计,不过不怎么精细
作者: 铃恋仙    时间: 2018-11-8 16:36
新手前来学习
作者: 51单片机1234    时间: 2018-12-29 14:44
很不错,谢谢楼主的分享了
作者: hyyzzby    时间: 2019-5-6 18:11
thank you mvery much

作者: tkcster    时间: 2019-10-5 18:04
下来看看,谢谢了
作者: lubenweiniubi    时间: 2020-5-19 11:27
谢谢参考
作者: nongxin117    时间: 2021-1-23 12:44
谢谢分享,共同进步




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