找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3718|回复: 0
收起左侧

51单片机+DS18b20温度监测仪设计与调试生产实习报告

[复制链接]
ID:321584 发表于 2018-5-3 20:32 | 显示全部楼层 |阅读模式
分享一个基于51单片机的DS18b20温度测量系统,可以设置低阈值和高阈值
生产实习报告
学    院:测控技术与通信工程学院
专    业:物联网工程
班    级:14-1
学生姓名:赵*
学    号140*
指导教师:刘*
一、生产实习教学基本信息
实习名称
测控技术及仪器专业测控仪器生产与工业应用生产实习
英文名称
Syllabus of Measurement-Control Instrumentation Production and Application Practice for Specialty of Measurement-control Technology and Instrumentation
实习学期
6
实习周数
3
学分
3
场所
省外
二、生产实习目的、意义及要求
1、目的和意义:
生产实习是本科教学计划的一个重要组成部分,是培养学生理论联系实际能力的重要途径,通过生产实习可以达到以下目的:
(1)增加学生的感性认识。通过在生产工厂的参观,让学生最直观的了解测控技术如何转化为产品并在工程实际中应用,使学生明白如何将所学的理论知识运用到生产实际中,并主动适应社会的经济发展对高级专门人才的需要。
(2)注重学生工程综合能力的培养。通过对高新技术企业先进的管理模式、生产模式进行剖析,培养和提高学生的工程综合能力。
(3)提高学生理论联系实际的能力。通过和工程技术人员的现场交流,进一步提高学生理论联系实际的能力,加强学生对相关生产工艺和各种设备的实际操作能力,培养学生对测控仪器的设计与开发能力。
(4)培养学生的创新意识。通过对高新技术企业的参观和带队指导老师的正确引导,让学生了解并掌握测控技术在工程域中应领的新技术,注重学生创新意识的培养。
(5)通过学生对生产实际的观察、分析,建立大工程意识;通过对市场、质量、效益等关键因素的分析了解,培养学生的产品和品牌意识。
2、要求:
(1)生产实习的带队教师应具有中、高级职称,并具有2-3次指导生产实习经验,并且应是全面了解生产工艺过程的教师;
(2)指导教师要对每个学生生产实习的各个环节进行认真考核,并且给出考核成绩,要对学生的安全教育放在生产实习的整个过程中;
(3)生产实习的带队教师在生产实习结束后,对生产实习教学全过程进行总结,并报教务处实验教学科;
(4)要求学生遵守工厂的有关规章制度,注意安全,能时刻以大局出发,听从带队教师的安排;
(5)在实习过程中学生要有规范的生产实习记录,并在完成实习后写出全面的生产实习报告。

温度监测仪表设计与调试

功能概述:

实现温度测量和显示;实现上下限设置功能;设计超限报警方案

硬件设计:

温度监测仪表的硬件设计框架如下

MCU: 采用传统的51单片机开发板,此开发板功能强大,主要介绍如下
1. 1602 液晶屏/12864 液晶屏接口(接口引出)
2. 4×3 的矩阵键盘(用于按键扫描试验,接口引出)
3. 红外接收头与发射遥控器
4. 继电器输出
5. 8 位静态数码管显示(接口引出)
6. 1 位数码管动态显示(可以直接单片机驱动接口、也有74HC595 驱动接口,接口引出)
7. 步进马达驱动(接口引出,可选配步进马达)
8. 八个普通按钮输入(接口引出)
9. 8 个LED 显示(接口引出,可以做跑马灯、流水灯、花样彩灯、各种信号灯等试验)
10.蜂铃器(做单片机发声实验)
11.PCF8563 实时时钟(年、月、日、时、分、秒 NXP 芯片,时间准、精度高)
12.PCF8591T(工业级数模/模数转换芯片,其中有4 路模拟输入、1 路模拟输出,接口引
出)
13.A24C02 数据存储(可以保存机器中的各种参数)
14.DS18b20 温度传感器(检测温度)
15.74HC165 并入串出功能(输入锁存器)
16.74HC595 串入并出功能(输出锁存器)
17.LS138 译码器
18.ULN2003 达林顿驱动(输出电流可以达到1A 可以驱动步进马达)
19.MAX232 串口通信(可以直接用串口与电脑通信,也可以用USB 转串口线)
20.USB 接口(供电、烧程序、通信于一体的接口,无需电源线、DB9 串口通信线、USB
转串口线)
21.STC89 系列增强型C51 单片机(可以工作在6T 模式下,又快又稳。)
22.支持PS/2 电脑键盘接入(通过PS/2 通信协议把电脑键盘与单片机连接,可获得大
量的输入按钮)
23.ISP 功能电脑直接烧录程序,无需另外购买烧录器和仿真器。(省钱又方便试验)
24.Atmel 的ISP 接口(支持Atmel 89 系列系列和AVR AT90S8515、Atmega8515 型号的
程序烧录)
25.提供了实时时钟(PCF8563)的后备电源(掉电了时间也能正常走,有需求者可以安
装纽扣电池座和电池)
26.另配了外置5V 电源插座(方便用户用做别的用途。)
27. 所有单片机I/O 均引出,供用户自由安排与发挥自建电路等等。
测温模块:测温模块采用DS18b20

温度是一种最基本的环境参数,日常生活和工农业生产中经常要检测温度。传统的方式是采用热电偶或热电阻,但是由于模拟温度传感器输出为模拟信号,必须经过A/D 转换环节获得数字信号后才能与单片机等微处理器接口,使得硬件电路结构复杂,制作成本较高。近年来,美国DALLAS 公司生产的DSl8B20 为代表的新型单总线数字式温度传感器以其突出优点广泛使用于仓储管理、工农业生产制造、气象观测、科学研究以及日常生活中。DSl8B20 集温度测量和A/D 转换于一体,直接输出数字量,传输距离远,可以很方便地实现多点测量,硬件电路结构简单,与单片机接口几乎不需要外围元件。

  在许多工业场合中都要进行温度检测和温度控制,常用方法是采用温度传感进行检测,配合单片机进行控制。DS18B20 是美国DALLAS 公司生产的“一线总线”接口的数字化传感器,他具有微型化、低功耗、抗干扰能力强、易与微处理器接口等优点,可直接将温度转化成串行数字信号供微处理器接收处理。利用这种温度传感器构成的温度测量系统电路非常简单、易于实现,并且适用于几乎所有类型的单片机。

S1820 温度传感器是一种单总线型温度测量器件,具有直接的数字信号,可采用总线供电,在同一根总线上可接多个传感器,构成多点测温网络,是温度场监控系统的理想选择。

美国DALLAS 半导体公司的DSl8B20 是世界上第一片支持“单总线”接口的数字式温度传感器,能够直接读取被测物的温度值。

如右图DS18B20采用3脚TO-92封装或8脚的SOIC封装,可以适应不同的环境需求。各引脚的功能:GND为电压地;DQ为单数据总线;VDD 为电源电压;NC 为空引脚。

其测量范围在-55~+125℃、-10℃~+85℃之内的测量精度可达± 0.5℃,稳定度为1%。通过编程可实现9、10、11、l2 位的分辨率读出温度数据,以上都包括一个符号位,因此对应的温度量化值分别为0.5℃、0.25℃、0.125℃、0.062 5℃,芯片出厂时默认为12 位的转换精度。读取或写入DS18B20仅需要一根总线,要求外接一个约4. 7k Ω的上拉电阻,当总线闲置时,其状态为高电平。 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温。此外DS18B20是温度- 电流传感器,对于提高系统抗干扰能力有很大的帮助。

显示模块:采用1602液晶显示屏

液晶(Liquid Crystal)是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示器上。

液晶显示器(Liquid Crystal Display, LCD)的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。为叙述简便,通常把各种液晶显示器都直接叫做液晶。

各种型号的液晶通常是按照显示字符的行数或液晶点阵的行、列数来命名的。比如:1602的意思是每行显示16个字符,一共可以显示两行;类似的命名还有0801, 0802, 1601等,这类液晶通常都是字符型液晶,即只能显示ASCII码字符,如数字、大小写字母、各种符号等。12232液晶属于图形型液晶,她的意思是液晶由122列、32行组成,即共有122 X 32个点来显示各种图形,我们可以通过程序控制这122 X 32个点中的任一个点显示或不显示。类似的命名还有12864, 19264, 192128, 320240等,根据客户需要,厂家可以设计出任意数组合的点阵液晶。

现在来看LCD1602 的操作时序:

在此,我们不需要读出它的数据的状态或者数据本身。所以只需要看两个写时序:

① 当我们要写指令字,设置LCD1602 的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

② 当我们要写入数据字,在1602 上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E 引脚一个高脉冲将数据写入。发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。一下是LCD1602的时序图:

下面是时序参数表:

LDC1602的原理图表示:
输入模块:采用独立键盘输入

图为一个典型的接触式按键

按键常常遇到的问题—抖动问题。

按键未按下之前,图四按键左端的导线因为连在VCC 上而显示高电平,右端显示低电平,按键按下后,按键闭合,整个导线都显示低电平,然后按键松开,又回到按键按下之前的点评状态。如果只考察按键左端的电平变化,应该是上图中所显示的一个负脉冲波形。但是,实际上,正确的波形应该是下图。相比于上图,在高低电平直接有一段锯齿一样的波形,这就是所谓的按键抖动。

按键抖动的原因是,接触式按键是靠机械的接触来实现开关作用的。这种接触方式就注定了它要经历一个“接触不稳定——正在稳定中——彻底稳定”的一种过程。就好比你用手抓紧一颗石头,即使你一开始就很用力的握紧,也不可能马上就达到最紧的状态,也要经历一个从握住到最紧握的过程。那么在这个过程里,接触式按键就处于一种徘徊在“闭合”与“断开”两者之间的状态。体现在电路中,就是在一小段时间内有非常多的“按下——抬起”动作。而这段抖动的时间,大概是10~20 毫秒,依不同的环境条件而定。

解决这个问题常见的方法有软件去抖动和硬件去抖动。

独立按键一共8个,分别连接在单片机的P3.0。去抖动的方式,我们采用软件延时的方法。过程如下:

  • 先设置IO口为高电平(一般上电默认就为高)
  • 读取IO口电平确认是否有按键按下
  • 如有IO电平为低电平后,延时几个ms
  • 再读取该IO电平,如果任然为低电平,说明对应按键按下
  • 执行相应按键的程序
软件设计:
  由于温度监测仪表的代码重复率高,所以我采用了多个功能模块分别编写.c和对应.h文件,对应文件具体代码将在附录中体现
软件功能描述:
   开机键界面如图,显示“please input low”等输入下限值。下限值和上限值各设置4各档位。分别是10摄氏度,20摄氏度,30摄氏度,40摄氏度。
当下限值输入完成后,接着会显示“please input hih”。表示等待输入上限值
当上限值输入完成后,会显示当前的温度值
若两次输入的值相同,会显示“wrong”
另外,设计上也有容错的设计,即使输入的下限值比上限值大,也会按照小值为下限值大值为上限值的区间进行温度判断和报警。
四、实习收获与总结
1.通过第一周的参观实习,我们参观了几家业内小有名气的企业,从中我们看到了企业文化,企业管理等方方面面。但是作为一个工科生,我最关心的企业生产设备让我产生了极大的兴趣,我认识到我们学习中的不足,他们的自动化水平是我们在学校里见不到的。
  另外我也认识到了我们国家的高精端科学技术水平不高,许多看似简单的高精度温度湿度控制箱基本都是国外进口的,而且价格不菲,很是痛心啊。我觉得不是我们做不出来这种设备,而是我们的浮躁的心态,我们应该静下心来做事,踏踏实实做事,不要虚的。
2.通过第二周的实习,我们了解到嵌入式技术在物联网中的应用,也大概了解到安卓系统的框架。
3.通过第三周的实习,我们切切实实用开发板做了一个温度仪器监测系统。在设计软件和调试的过程中,遇到了许多麻烦也走了许多弯路。但是也学到许多有用的东西,比如,让重复的功能放在头文件中,会让程序更简洁。还有以前在写程序的时候不会理会警告信息,但是这次我特意把所有的警告全都修复了,很大的成就感啊!虽然大概功能实现了,但是存在的不足很多,要想成为一个产品的差距非常大。这让我想起了第一周四十九所解说员说的,“现在国产的功能都能实现,与国外的差距是可靠性和工匠精神”所以我们在以后有机会参加产品制作和的时候,一定要以工匠精神来对待。

单片机源程序如下:
  1. /*******************************************************************/
  2. main.c
  3. /*******************************************************************/
  4. #include<reg51.h>
  5. #include"lcd.h"
  6. #include"temp.h"
  7. #include"input.h"
  8. unsigned char PuZh_low[]="please input low";
  9. unsigned char PuZh_hih[]="please input hih";
  10. unsigned char PuZh_wrong[]="wrong";
  11. sbit beeb=P1^5;
  12. void LcdDisplay(int);
  13. float temp_true;
  14. void main()
  15. {
  16.               int i,j;
  17.               KEY1=1;
  18.               KEY2=1;
  19.               KEY3=1;
  20.               KEY4=1;
  21.               KEY5=1;
  22.               KEY6=1;
  23.               KEY7=1;
  24.               KEY8=1;
  25.               beeb=1;
  26.                             P2=1;
  27.               while(1)
  28.               {
  29.                             LcdInit();
  30.               for(j=0;j<16;j++)
  31.               {
  32.                             LcdWriteData(PuZh_low[j]);            
  33.               }
  34.                               if(KEY1==0)
  35.                             {
  36.                                           Delayinput10ms();            
  37.                                           if(KEY1==0)
  38.                                           {
  39.                                                         while(1)
  40.               {
  41.                                           LcdInit();
  42.               for(j=0;j<16;j++)
  43.               {
  44.                             LcdWriteData(PuZh_hih[j]);            
  45.               }
  46.                             if(KEY5==0)
  47.                             {
  48.                                           Delayinput10ms();            
  49.                                           if(KEY5==0)
  50.                                           {
  51.                             while(1)
  52.               {
  53.                             LcdInit();
  54.                             for(j=0;j<5;j++)
  55.               {
  56.                             LcdWriteData(PuZh_wrong[j]);            
  57.               }
  58.               }
  59.                                                       
  60.                                                         while((i<50)&&(KEY5==0))
  61.                                           {
  62.                                                         Delayinput10ms();
  63.                                                         i++;
  64.                                           }
  65.                                           i=0;
  66.                                           }
  67.                             }                           
  68.                                           if(KEY6==0)
  69.                             {
  70.                                           Delayinput10ms();
  71.                                           if(KEY6==0)
  72.                                           {
  73.                                                                                     while(1)
  74.               {
  75.                             Ds18b20ChangTemp();
  76.                             LcdDisplay(Ds18b20ReadTemp());
  77.                             temp_true=Ds18b20ReadTemp()*0.0625*100+0.5;
  78.                             if(temp_true<10||temp_true>20)
  79.                             {
  80.                                           beeb=0;
  81.                                           Delay1ms(100);
  82.                             }
  83.                             beeb=1;
  84.               }
  85.                                                         while((i<50)&&(KEY6==0))
  86.                                           {
  87.                                                         Delayinput10ms();
  88.                                                         i++;
  89.                                           }
  90.                                           i=0;
  91.                                           }
  92.                             }            
  93.                                           if(KEY7==0)
  94.                             {
  95.                                           Delayinput10ms();
  96.                                           if(KEY7==0)
  97.                                           {
  98.                                                                                     while(1)
  99.               {
  100.                             Ds18b20ChangTemp();
  101.                             LcdDisplay(Ds18b20ReadTemp());
  102.                             temp_true=Ds18b20ReadTemp()*0.0625*100+0.5;
  103.                             if(temp_true<10||temp_true>30)
  104.                             {
  105.                                           beeb=0;
  106.                                           Delay1ms(100);
  107.                             }
  108.                             beeb=1;
  109.               }
  110.                                                         while((i<50)&&(KEY7==0))
  111.                                           {
  112.                                                         Delayinput10ms();
  113.                                                         i++;
  114.                                           }
  115.                                           i=0;
  116.                                           }
  117.                             }            
  118.                                          
  119.                                           if(KEY8==0)
  120.                             {
  121.                                           Delayinput10ms();
  122.                                           if(KEY8==0)
  123.                                           {
  124.                                                                                                                               while(1)
  125.               {
  126.                             Ds18b20ChangTemp();
  127.                             LcdDisplay(Ds18b20ReadTemp());
  128.                             temp_true=Ds18b20ReadTemp()*0.0625*100+0.5;            
  129.               }
  130.                                                         while((i<50)&&(KEY8==0))
  131.                                           {
  132.                                                         Delayinput10ms();
  133.                                                         i++;
  134.                                           }
  135.                                           i=0;
  136.                                           }

  137.                             }            
  138.               }
  139.               }                                         
  140.                                                         while((i<50)&&(KEY1==0))
  141.                                           {
  142.                                                         Delayinput10ms();
  143.                                                         i++;
  144.                                           }
  145.                                           i=0;
  146.                                           }
  147.                             ////////////////////////////////////////////////////////////////////////
  148.                                                                         if(KEY2==0)                           
  149.                             {
  150.                                           Delayinput10ms();            
  151.                                           if(KEY2==0)
  152.                                           {
  153.                                                         while(1)
  154.               {
  155.                                           LcdInit();
  156.               for(j=0;j<16;j++)
  157.               {
  158.                             LcdWriteData(PuZh_hih[j]);            
  159.               }
  160.                             if(KEY5==0)
  161.                             {
  162.                                           Delayinput10ms();
  163.                                           if(KEY5==0)
  164.                                           {
  165.                             while(1)
  166.               {
  167.                             Ds18b20ChangTemp();
  168.                             LcdDisplay(Ds18b20ReadTemp());
  169.                             temp_true=Ds18b20ReadTemp()*0.0625*100+0.5;
  170.                             if(temp_true>20||temp_true<10)
  171.                             {
  172.                                           beeb=0;
  173.                                           Delay1ms(100);
  174.                             }
  175.                             beeb=1;
  176.               }
  177.                                                         while((i<50)&&(KEY5==0))
  178.                                           {
  179.                                                         Delayinput10ms();
  180.                                                         i++;
  181.                                           }
  182.                                           i=0;
  183.                                           }
  184.                             }                           
  185.                                           if(KEY6==0)
  186.                             {
  187.                                           Delayinput10ms();
  188.                                           if(KEY6==0)
  189.                                           {
  190.                                                                                     while(1)
  191.               {
  192.                             LcdInit();
  193.                             for(j=0;j<5;j++)
  194.               {
  195.                             LcdWriteData(PuZh_wrong[j]);            
  196.               }
  197.               }
  198.                                                         while((i<50)&&(KEY6==0))
  199.                                           {
  200.                                                         Delayinput10ms();
  201.                                                         i++;
  202.                                           }
  203.                                           i=0;
  204.                                           }                           
  205.                             }            
  206.                                           if(KEY7==0)
  207.                             {
  208.                                           Delayinput10ms();
  209.                                           if(KEY7==0)
  210.                                           {
  211.                                                                                     while(1)
  212.               {
  213.                            
  214.                             Ds18b20ChangTemp();
  215.                             LcdDisplay(Ds18b20ReadTemp());
  216.                             temp_true=Ds18b20ReadTemp()*0.0625*100+0.5;
  217.                             if(temp_true<20||temp_true>30)
  218.                             {
  219.                                           beeb=0;
  220.                                           Delay1ms(100);
  221.                             }                           
  222.                             beeb=1;                           
  223.               }
  224.                                                         while((i<50)&&(KEY7==0))
  225.                                           {
  226.                                                         Delayinput10ms();
  227.                                                         i++;
  228.                                           }
  229.                                           i=0;
  230.                                           }
  231.                             }            
  232.                                          
  233. ……………………

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


完整的Word格式文档51黑下载地址:
实习报告.rar (2.47 MB, 下载次数: 16)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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