找回密码
 立即注册

QQ登录

只需一步,快速开始

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

温度检测系统设计报告(单片机+DS18B20)

[复制链接]
跳转到指定楼层
楼主
ID:328014 发表于 2018-7-1 03:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验任务温度检测系统设计DS18B20
  •          实训目的
熟悉用KeilC51、PROTEUS软件进行电路及控制系统的仿真。学会利用温度传感器DS18B20检测温度,利用单片机显示温度。
二、实训内容:
  1、实训任务:
1)任务描述:
设计一个数字式温度计,要求使用温度传感器(可以采用DS18B20测量温度,再经单片机处理后,LED数码管显示测量的温度值。测温范围为-10~85℃,精度误差在0.5℃以内。
2)任务分析:
如上图所示,系统以51单片机为控制核心,加上温度检测传感器DS18B20。利用DS18B20集成温度传感器检测温度,然后通过串口送到单片机中进行数据处理变换,最后将温度值显示在LED显示器上。
3)任务实施:
1PROTEUS软件中按图搭接好电路;
2)Keil软件中编辑程序,进行编译,得到.HEX格式文件;
3将所得的HEX格式文件在PROTEUS中指定到MCU芯片中;
4运行仿真,观察仿真结果;
5PROTEUS中结果正常后,用实际硬件搭接并调试电路,通过编程器将.HEX式文件下载到AT89C51中,通电验证实验结果。


    • 实训报告
汇编程序如下所示:(C程序请参考教材)

  1. #include <reg52.h>
  2. //#include <intrins.h>
  3. sbit IO_18B20 =P2^0;
  4. unsigned char wei[]={0x1,0x2,0x4,0x8};
  5. char temp_data,temp_data1;
  6. unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
  7. unsigned char disp[]={5,0,0,0};
  8. //void delayx10us(unsigned char t);
  9. void delay_ms( int x);
  10. void write18b20(unsigned char dat);
  11. void tempchange(void);
  12. void display();
  13. void display1();
  14. bit read_bit();
  15. bit Init_Ds18b20();
  16. unsigned char read18b20();
  17. int get18b20temp();

  18. void main()
  19. {
  20.         P0=0Xff;
  21.         P3=0Xff;
  22.         while(1)
  23.         {
  24.    tempchange();
  25.          temp_data=get18b20temp()/16;       // 取整数部分
  26.                 if(temp_data<0&&temp_data>=(-10)) //如果读取到的值大于负10小于 0,显示负号且将值转换为正数
  27.                 {
  28.      disp[0]= 16;
  29.                  temp_data=0-temp_data;         //将负数转换为正数
  30.                 }
  31.           else
  32.                 {disp[0]=temp_data/100;}
  33.                 temp_data1=temp_data%100;
  34.                 disp[1]=temp_data1/10;
  35.                 disp[2]=temp_data1%10;
  36.                 disp[3]=12;                                //显示温度单位C
  37.                 if((temp_data>=(-10))&&(temp_data<=(85))) //如果读取到的数值的范围在-10~85之间,就显示出来
  38.                 {
  39.                   display();
  40.                 }
  41.         }
  42. }

  43. bit Init_Ds18b20() //初始化DS18B20
  44. {
  45.         unsigned int i;
  46.          bit ack;
  47.          IO_18B20=0;
  48.          for(i=0;i<100;i++);
  49.          IO_18B20=1;
  50.          for(i=0;i<4;i++);
  51.          for(i=0;i<20;i++)
  52.          {ack=IO_18B20;if(ack==1)break;}
  53.    for(i=0;i<80;i++);
  54.          return (ack);
  55. }

  56. //bit Init_Ds18b20()
  57. //{
  58. //                bit ack;
  59. //                IO_18B20 = 0;
  60. //                delayx10us(50);
  61. //                IO_18B20 = 1;
  62. //                delayx10us(6);
  63. //                ack = IO_18B20;
  64. //                while(!IO_18B20);
  65. //                return ack;
  66. //}


  67. void write18b20(unsigned char dat)  //向DS18B20写一个字节,dat为待写入字节
  68. {
  69.         unsigned int i;
  70.         unsigned char j;
  71.         bit test;
  72.          for(j=0;j<8;j++)
  73.         {
  74.                 test=dat&0x01;
  75.                 dat=dat>>1;
  76.                 if(test)
  77.                 {
  78.                 IO_18B20=0;
  79.                 i++;i++;
  80.                 IO_18B20=1;
  81.                 for(i=0;i<8;i++);        
  82.                 }
  83.           else
  84.           {
  85.           IO_18B20=0;
  86.           for(i=0;i<8;i++);        
  87.                  IO_18B20=1;
  88.                 i++;i++;        
  89.           }
  90.         }   
  91. }
  92. //void write18b20(unsigned char dat)  //向DS18B20写一个字节,dat为待写入字节
  93. //{
  94. //    unsigned char i;
  95. //    for(i=0;i<8;i++)
  96. //    {
  97. //        IO_18B20 = 0;           
  98. //        _nop_();
  99. //        _nop_();         
  100. //        IO_18B20 = 1;           
  101. //        _nop_();
  102. //        _nop_();        
  103. //        IO_18B20 = dat & 0x01;
  104. //        delayx10us(6);     
  105. //        IO_18B20 = 1;         
  106. //        dat >>= 1;      
  107. //    }
  108. //}

  109. bit read_bit() //从DS18B20读取一位数据
  110. {
  111.   unsigned int i;
  112.         bit dat;
  113.         IO_18B20=0;
  114.         i++;
  115.         IO_18B20=1;
  116.         i++;i++;
  117.         dat=IO_18B20;
  118.         for(i=0;i<8;i++);
  119.         return (dat);
  120. }

  121. unsigned char read18b20() //从DS18B20读取一个字节,dat为读到的字节
  122. {
  123.          unsigned char j,h,dat;
  124.          dat=0;        
  125.          for(h=0;h<8;h++)
  126.          {
  127.                 j=read_bit();
  128.                 dat=(j<<7)|(dat>>1);        
  129.          }
  130.          return (dat);
  131. }
  132. //unsigned char read18b20() //从DS18B20读取一个字节,dat为读到的字节
  133. //{
  134. //    unsigned char i;
  135. //    unsigned char dat=0;        
  136. //    for(i=0 ; i<8 ; i++)
  137. //    {
  138. //        IO_18B20 = 0;        
  139. //        _nop_();
  140. //        _nop_();      
  141. //        IO_18B20 = 1;      
  142. //        dat >>= 1;   
  143. //        if(!IO_18B20)         
  144. //        dat |= 0x80;  
  145. //        delayx10us(6);  
  146. //        IO_18B20 = 1;        
  147. //        _nop_();
  148. //                }
  149. //                return dat;
  150. //}

  151. int get18b20temp() //读取DS18B20转换的温度值
  152. {
  153.   int temp;
  154.         unsigned char a,b;
  155.         Init_Ds18b20();
  156.         delay_ms(1);
  157.         write18b20(0xcc);
  158.         write18b20(0xbe);  //写读温度命令
  159.   a=read18b20();
  160.   b=read18b20();        
  161.         temp=b;
  162.         temp<<=8;
  163.         temp=temp|a;
  164.         return temp;
  165. }

  166. void tempchange(void) //向DS18B20发送转换指令
  167. {
  168.   Init_Ds18b20();
  169.         delay_ms(1);
  170.         write18b20(0xcc); //跳过ROM
  171.         write18b20(0x44); //启动温度转换
  172. }

  173. void display()      //显示函数
  174. {

  175.         P3=wei[0];
  176.         P0=duan[disp[0]];
  177.         delay_ms(1);
  178.         P3=wei[1];
  179.         P0=duan[disp[1]];
  180.         delay_ms(1);         
  181.         P3=wei[2];
  182.         P0=duan[disp[2]]&0X7F;   //第三位显示小数点
  183.         delay_ms(1);
  184.         P3=wei[3];
  185.         P0=duan[disp[3]];
  186.         delay_ms(1);
  187. ……………………

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

全部资料51hei下载地址:
温度检测系统设计(DS18B20)(10).rar (132.01 KB, 下载次数: 134)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:562084 发表于 2019-6-13 20:31 | 只看该作者
感谢大佬
回复

使用道具 举报

板凳
ID:607288 发表于 2020-3-23 15:12 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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