找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机温度采集系统整套完整资料下载 PCB 原理图 程序 适合新手学习

  [复制链接]
跳转到指定楼层
楼主
里面是一整套,系统由单片机STC89C52、液晶显示模块LCD1602、温度检测模块、按键模块、报警模块、加热模块、冷却模块所组成。系统能完成以下功能,系统采用DS18B20对温度进行检测,并且能在LCD1602上实时显示温度。用户可以通过按键设置上限和下限温度,当温度超过上限温度时,系统通过继电器使冷却器件导通工作,当温度低于下限温度时,系统通过继电器使加热器件工作。当温度在上限和下限之间时维持原状态。


PPT模板(非本设计仅供参考)
仿真(使用PROTEUS软件打开文件里面后缀为DSN的文件)
元件清单
原理图和PCB(使用PROTEL软件打开文件里面后缀为SCH和PCB的文件)
外文翻译
程序(使用KEIL软件打开文件里面后缀为uvproj的文件)
系统简介
芯片资料



仿真(使用PROTEUS软件打开文件里面后缀为DSN的文件)
1.双击图中间的单片机会出现以下界面


2.点击ProgramFile一栏的文件夹图标。找到跟仿真文件同一个文件夹里面的”仿真中需要加载的程序.hex”,并点击打开按键。


3点击下面第一个按钮便可运行成功。


  
题目名称
  
基于单片机的温度控制系统






  
一、选题的目的和意义:
  
温度控制无论是在工业生产过程中,还是在日常生活中都起着非常重要的作用,过低的温度或过高的温度都会使资源失去应有的作用,从而造成资源的巨大浪费。特别是在当前全球资源极度缺乏的情况下,我们更应该掌握好对温度的控制,把身边的资源好好地利用起来。
  
在计算机没有发明之前,这些控制都是我们难以想象的。而当今,随着电子行业的迅猛发展,计算机技术和传感器技术的不断改进,而且计算机和传感器的价格也日益降低,可靠性逐步提高,用信息技术来实现温度控制并提高控制的精确度不仅是可以达到的而且是可以实现的,用高新技术解决生活用电问题,实施对温度控制已经成为我们电子行业的任务,以此来加强工业化建设,提高人民的生活水平。
  
温度控制在实际生活中有一定的实际意义,在工业生产中有着较为广泛的应用,用单片机实现自适应控制,弥补了传统  PID控制结构在特定场合下性能下降的不足,设计了一套实用的温度测控系统,使它在不同时间常数下均可以达到技术指标。此外还有效减少了输出继电器的开关次数,适用于环境参数经常变化的小型温度控制系统。例如:在冶金工业、化工生产、电力工程、造纸行业、机械制造和食品加工等诸多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。虽然温度控制系统的制作方案有很多,但是经过对比各个方案的优劣,还是采用单片机更好,因为采用单片机来对温度进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大提高产品的质量和数量
  
  
二、研究概况及发展趋势综述
  
国内现状:
  
我国对于温度控制技术的研究较晚,始于20世纪80年代。我国工程技术人员在吸收发达国家温度控制技术的基础上,才掌握了温度室内微机控制技术,该技术仅限于对温度的单项环境因子的控制。温度控制设施计算机应用,在总体上正从消化吸收、简单应用阶段向实用化、综合性应用阶段过渡和发展。在技术上,以单片机控制的单参数单回路系统居多,尚无真正意义上的多参数综合控制系统,与发达国家相比,存在较大差距。我国温度控制控制现状还远远没有达到工厂化的程度,生产实际中仍然有许多问题困扰着我们,如软硬件资源不能共享和可靠性比较差。
  
国外现状:
  
国外对温度控制技术研究较早,始于20世纪70年代。先是采用模拟式的组合仪表,采集现场信息并进行指示、记录和控制。80年代末出现了分布式控制系统。目前正开发和研制计算机数据采集控制系统的多因子综合控制系统。现在世界各国的温度控制技术发展很快,一些国家在实现自动化的基础上正向着完全自动化、无人化的方向发展。
  
随着科学技术的飞速发展,带动社会生产的发展,自动控制系统在各个领域尤其是工业领域中有着及其广泛的应用,温度控制是控制系统中最为常见的控制类型之一。随着单片机技术的飞速发展,通过单片机对被控对象进行控制日益成为今后自动控制领域的一个重要发展方向,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数
  
  
三、研究目标、研究内容和拟解决的关键问题
  
研究目标
  
本设计主要采用MCS-51系列单片机作为主控芯片,能够实现温度控制,数据显示,参数设置等功能。
  
研究内容:
  
根据以上设计需要,系统拟采用以下技术方案,系统的结构框图如下图所示。

图1 系统结构框图
  
系统由单片机STC89C52、液晶显示模块LCD1602、温度检测模块、按键模块、报警模块、加热模块、冷却模块所组成。系统能完成以下功能,系统采用DS18B20对温度进行检测,并且能在LCD1602上实时显示温度。用户可以通过按键设置上限和下限温度,当温度超过上限温度时,系统通过继电器使冷却器件导通工作,当温度低于下限温度时,系统通过继电器使加热器件工作。当温度在上限和下限之间时维持原状态。
  
拟解决的关键问题:
  
1、完成键盘的设计,分配好各个按键输入对应单片机各口的控制信息;
  
2、完成LCD显示电路的设计,实现具体的控制、提示信息的显示;
  
3、完成温度检测电路的设计,使其能够准确温度值;
  
  
四、研究的基本思路和方法、技术路线、实验方案及可行性分析
  
研究的基本思路和方法:
  
1、确定硬件系统的设计方案:
  
(1)、根据系统的功能要求确定选用的元器件;
  
(2)、分配单片机各个P口地址,以连接对应的元器件,方便控制;
  
(3)、利用protel软件构建系统的硬件图;
  
2、确定软件部分的设计方案:
  
(1)、确定各部分模块对应要实现的功能,并根据连接图写出对应程序中对应的控制信息,便于软件编写;
  
(2)、用keil软件编写程序,对应各模块功能模块化编写,便于程序的检查和调试;
  
3、利用keil软件生成hex文件,用PROTEL软件绘制电路图
  
4、依照电路图,在电路板上焊接各元件,完成系统实物设计;
  
5、将焊好的电路板反复进行硬件调试和系统整体调试,直到实现系统要求的预定功能。
  
技术路线、实验方案及可行性分析:
  
1、设计用到的设备和软件:
  
主要设备:电脑、单片机烧写器
  
软件:Protel仿真软件、keil软件
  
2、利用学习过的模拟电子技术、数字电路技术、单片机原理与应用等知识,了解温度控制的原理,并选用合适的元器件和系统设计方案。
  
   
  

单片机源程序:

  1. //-----------------------------------------------------------------------
  2. //功能说明:使用DS18B20测量室内温度,并将它显示在1602液晶上。 核心:AT89S52
  3. //连接框图:       ___________________

  4. #include <reg52.h>

  5. //端口及函数声明---------------------------------------------------------
  6. sbit   LCD_RS=P1^0;          //片选信号
  7. sbit   LCD_RW=P1^1;          //读写信号
  8. sbit   LCD_E=P1^2;           //使能信号
  9. sbit   DQ = P2^2;
  10. sbit   BEEP=P1^3;   //高电平亮灯,超过设定值
  11. sbit   RED = P2^0;
  12. sbit   GREEN = P2^1;
  13. sbit   Key_2 = P1^4;  //按一次出现H 30,可以进行上限温度设置 按两次出现L 20,可以进行下限温度设置  按第三次恢复温度显示
  14. sbit   Key_3 = P1^5;  //增加键,可以对上限温度或下限温度进行增大调整
  15. sbit   Key_4 = P1^6;  //减小键,可以对下限温度或下限温度进行减小调整

  16. #define LCD_DB        P0        //LCD1602数据信号
  17. #define LocationX  0                //横排的位置,即X得坐标值 取值范围0~15
  18. #define LocationY  1                //竖排的位置,即Y得坐标值 取值范围为 2,1

  19. unsigned char code dis_char[]={"Temperature is"};
  20. unsigned char code dis_char1[]={"Htemp=      C    "};
  21. unsigned char code dis_char2[]={"Ltemp=      C    "};

  22. //LCD1602函数定义
  23. void LCD_init(void);                                                   //LCD1602初始化函数   
  24. void LCD_write_command(unsigned char command);                         //LCD1602写指令函数         
  25. void LCD_write_data(unsigned char dat);                                //LCD1602写数据函数           
  26. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat); //在某个屏幕位置上显示一个字符,X(0-15),y(1-2)
  27. void delay_n40us(unsigned int n);                                      //延时函数         

  28. //DS18B20函数定义
  29. void delayms(unsigned int z);                    //延时(z)毫秒  
  30. void SetReset(void);                         //产生复位信号
  31. void CheckReply(void);                       //检测器件应答信号
  32. bit MainReadBit(void);                       //从总线读一个bit
  33. unsigned char MainReadByte(void);            //从总线读一个字节  
  34. void MainWriteByte(unsigned char dat);       //向总线写一个字节  
  35. void StartConvertTemperature(void);          //启动一次温度转换  
  36. unsigned long int  ReadTemperature(void);         //读取温度数据

  37. unsigned char H_temp = 50,L_temp = 20;
  38. unsigned char flag_h=0,flag_l=0,count_key2 = 0;


  39. unsigned char TempBuffer[5];
  40. unsigned char temp_value;
  41. //--------------------------------------------------------------------***


  42. //子函数-----------------------------------------------------------------

  43. //----------------------------------------
  44. //LCD1602 延时函数
  45. void delay_n40us(unsigned int n)                 
  46. {
  47.         unsigned int i;
  48.         unsigned char j;            
  49.         for(i=n;i>0;i--)
  50.         for(j=0;j<2;j++);         
  51. }
  52. //----------------------------------------                                       
  53. //LCD1602液晶初始化函数
  54. void LCD_init(void)         
  55. {
  56.         LCD_write_command(0x38);//设置8位格式,2行,5x7
  57.         LCD_write_command(0x38);//设置8位格式,2行,5x7
  58.         LCD_write_command(0x38);//设置8位格式,2行,5x7         切记要写三遍!!!!
  59.         LCD_write_command(0x0c);//整体显示,关光标,不闪烁
  60.         LCD_write_command(0x06);//设定输入方式,增量不移位
  61.         LCD_write_command(0x01);//清除屏幕显示         
  62.         delay_n40us(100);       //清屏延时
  63. }
  64. //----------------------------------------
  65. //LCD1602写命令函数
  66. void LCD_write_command(unsigned char dat)  
  67. {
  68.         LCD_DB=dat;
  69.         LCD_RS=0;//指令         
  70.         LCD_RW=0;//写入         
  71.         LCD_E=1; //使能         
  72.         LCD_E=0;
  73.         delay_n40us(1);//写命令延时   
  74. }         
  75. //----------------------------------------
  76. //LCD1602写数据函数
  77. void LCD_write_data(unsigned char dat)         
  78. {
  79.         LCD_DB=dat;
  80.         LCD_RS=1;//数据         
  81.         LCD_RW=0;//写入         
  82.         LCD_E=1;//使能  
  83.         LCD_E=0;
  84.         delay_n40us(1);         //写数据延时
  85. }
  86. //----------------------------------------
  87. //LCD1602显示一个字符  
  88. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)
  89. {
  90.         unsigned char address;
  91.         if(y==1)
  92.                  address=0x80+x;         //显示在第一排的时候的x的地址
  93.         else
  94.                  address=0xc0+x;         //显示在第二排的时候的x的地址
  95.         LCD_write_command(address);         //输入地址
  96.         LCD_write_data(dat);                 //输入数据
  97. }


  98. //*****************************************

  99. //----------------------------------------
  100. //毫秒延时函数
  101. void delayms(unsigned int z)
  102. {
  103.         unsigned int x,y;
  104.         for(x = z ; x>0 ; x--)
  105.                 for(y = 110; y>0 ; y--);
  106. }


  107. /***********ds18b20子程序*************************/

  108. /***********ds18b20延迟子函数(晶振12MHz )*******/

  109. void delay_18B20(unsigned int i)
  110. {
  111.         while(i--);
  112. }

  113. /**********ds18b20初始化函数**********************/

  114. void Init_DS18B20(void)
  115. {
  116.          unsigned char x=0;
  117.          DQ = 1;          //DQ复位
  118.          delay_18B20(8);  //稍做延时
  119.          DQ = 0;          //单片机将DQ拉低
  120.          delay_18B20(80); //精确延时 大于 480us
  121.          DQ = 1;          //拉高总线
  122.          delay_18B20(14);
  123.          x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  124.          delay_18B20(20);
  125. }

  126. /***********ds18b20读一个字节**************/  

  127. unsigned char ReadOneChar(void)
  128. {
  129.         unsigned char i=0;
  130.         unsigned char dat = 0;
  131.         for (i=8;i>0;i--)
  132.          {
  133.                   DQ = 0; // 给脉冲信号
  134.                   dat>>=1;
  135.                   DQ = 1; // 给脉冲信号
  136.                   if(DQ)
  137.                   dat|=0x80;
  138.                   delay_18B20(4);
  139.          }
  140.          return(dat);
  141. }

  142. /*************ds18b20写一个字节****************/  

  143. void WriteOneChar(unsigned char dat)
  144. {
  145.          unsigned char i=0;
  146.          for (i=8; i>0; i--)
  147.          {
  148.                   DQ = 0;
  149.                  DQ = dat&0x01;
  150.             delay_18B20(5);
  151.                  DQ = 1;
  152.             dat>>=1;
  153. }
  154. }

  155. /**************读取ds18b20当前温度************/

  156. void ReadTemp(void)
  157. {
  158.         unsigned char a=0;
  159.         unsigned char b=0;
  160.         unsigned char t=0;

  161.         Init_DS18B20();
  162.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  163.         WriteOneChar(0x44);         // 启动温度转换

  164.         delay_18B20(100);       // this message is wery important

  165.         Init_DS18B20();
  166.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  167.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

  168.         delay_18B20(100);

  169.         a=ReadOneChar();            //读取温度值低位
  170.         b=ReadOneChar();                   //读取温度值高位
  171.         temp_value=b<<4;
  172.         temp_value+=(a&0xf0)>>4;               
  173. }
  174. void temp_to_str()   //温度数据转换成液晶字符显示
  175. {
  176.   TempBuffer[0]=temp_value/10+'0';  //十位
  177.   TempBuffer[1]=temp_value%10+'0';  //个位
  178.   TempBuffer[2]=0xdf;   //温度符号
  179.   TempBuffer[3]='C';
  180.   TempBuffer[4]='\0';
  181. }

  182. void display_1(void)
  183. {
  184.         unsigned char j =0,ge=0,shi=0,bai=0;
  185.         unsigned long int last = 0;
  186.         int temp=0;
  187.         for(j=0;j<14;j++)
  188.         {
  189.                 LCD_disp_char(j,1,dis_char[j]);
  190.         }        
  191.         ReadTemp();                    //开启温度采集程序
  192.     temp_to_str();                 //温度数据转换成液晶字符
  193. //  LCDDispString(0,1,TempBuffer);
  194.         temp = (TempBuffer[0]-'0')*10+(TempBuffer[1]-'0');
  195.         LCD_disp_char(5,2,(temp/10+48));
  196.         LCD_disp_char(6,2,(temp%10+48));

  197.         LCD_disp_char(8,2,0xdf);
  198.         LCD_disp_char(9,2,'C');

  199.         
  200.         if(temp >H_temp)
  201.         {
  202.                 BEEP = 0;
  203.                 RED=1;
  204.                 GREEN=0;
  205.         }
  206.         else if        ( temp < L_temp)
  207.         {
  208.                 BEEP=0;
  209.                 GREEN=1;
  210.                 RED=0;
  211.         }
  212.         else
  213.         {
  214.                 BEEP = 1;RED=1;
  215.                 GREEN=1;
  216.         }
  217. }

  218. void display_2(void)
  219. {
  220.           unsigned char j =0;unsigned char ge=0,shi=0;
  221.         for(j=0;j<16;j++)
  222.         {
  223.                 LCD_disp_char(j,1,dis_char1[j]);
  224.                 LCD_disp_char(j,2,dis_char2[j]);
  225.         }
  226.         LCD_disp_char(11,1,0xdf); LCD_disp_char(11,2,0xdf);
  227.         ge = H_temp%10;
  228.         shi = H_temp/10;
  229.     LCD_disp_char(7,1,(shi+48));  LCD_disp_char(8,1,(ge+48));

  230.         ge = L_temp%10;
  231.         shi = L_temp/10;
  232.     LCD_disp_char(7,2,(shi+48));  LCD_disp_char(8,2,(ge+48));

  233. }

  234. void key_scan(void)
  235. {
  236.         unsigned char ge=0,shi=0;
  237.         P1 |= 0x80;                                   //每次扫描前,先将接键盘的引脚口拉高
  238.         if(Key_2 == 0)                           //同上,判断第二个按键情况
  239.         {
  240.                 delayms(10);
  241.                 if(Key_2 == 0)
  242.                 {
  243.                 //        display_2();
  244.                         count_key2++;
  245.                         if(count_key2 == 1)
  246.                         {
  247.                                 display_2();
  248.                                 flag_h = 1;
  249.                                 flag_l = 0;
  250.                                 LCD_disp_char(15,1,35);
  251.                         }
  252.                         else if(count_key2 == 2)
  253.                         {
  254.                                 display_2();
  255.                                 flag_l = 1;
  256.                                 flag_h = 0;
  257.                                 LCD_disp_char(15,2,35);        
  258.                         }
  259.                         else if(count_key2 == 3)
  260.                         {
  261.                                 flag_l = 0;
  262.                                 flag_h = 0;
  263.                                 LCD_init();
  264.                                 display_1();
  265.                                 count_key2=0;
  266.                         }
  267.                         while(!Key_2);
  268.                 }
  269.         }
  270.         if(Key_3 == 0)                           //增加键
  271.         {
  272.                 delayms(10);
  273.                 if(Key_3 == 0)
  274.                 {
  275.                         if(flag_h ==1)
  276.                         {
  277.                             H_temp++;
  278.                                 ge = H_temp%10;
  279.                                 shi = H_temp/10;
  280.                                 LCD_disp_char(7,1,(shi+48));
  281.                                 LCD_disp_char(8,1,(ge+48));
  282.                         }        
  283.                         else if(flag_l == 1)
  284.                         {
  285.                             L_temp++;
  286.                             ge = L_temp%10;
  287.                                 shi = L_temp/10;
  288.                                 LCD_disp_char(7,2,(shi+48));
  289.                                 LCD_disp_char(8,2,(ge+48));
  290.                         }
  291.                                 
  292.                         while(!Key_3);
  293.                 }
  294.         }
  295.         if(Key_4 == 0)                           //减少键
  296.         {
  297.                 delayms(10);
  298.                 if(Key_4 == 0)
  299.                 {
  300.                         if(flag_h ==1)
  301.                         {
  302.                                 H_temp--;
  303.                                   ge = H_temp%10;
  304.                                 shi = H_temp/10;
  305.                                 LCD_disp_char(7,1,(shi+48));
  306.                                 LCD_disp_char(8,1,(ge+48));
  307.                         }        
  308.                         else if(flag_l == 1)
  309.                         {
  310.                             L_temp--;
  311.                                 ge = L_temp%10;
  312.                                 shi = L_temp/10;
  313.                                 LCD_disp_char(7,2,(shi+48));
  314.                                 LCD_disp_char(8,2,(ge+48));
  315.                         }
  316.                                 
  317.                         while(!Key_4);
  318.                 }
  319.         }        
  320. }
  321. //--------------------------------------------------------------------***


  322. //主函数-----------------------------------------------------------------
  323. void main(void)
  324. {
  325.         unsigned int ge=0,shi=0,bai=0;
  326.         LCD_init();



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

所有资料打包下载:
11基于单片机的温度控制系统.rar (3.88 MB, 下载次数: 245)


评分

参与人数 1黑币 +5 收起 理由
cddcad + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-5-9 18:32 | 只看该作者
好资料,51黑有你更精彩。
回复

使用道具 举报

板凳
ID:64138 发表于 2017-5-10 15:22 | 只看该作者
正在学习中。正在学习中
回复

使用道具 举报

地板
ID:195280 发表于 2017-5-27 13:48 | 只看该作者
看起来不错的样子,学习一下
回复

使用道具 举报

5#
ID:193061 发表于 2017-5-27 14:38 | 只看该作者
看着不错的样子,可惜下不到
回复

使用道具 举报

6#
ID:193423 发表于 2017-5-28 15:48 | 只看该作者
适合新手学习
回复

使用道具 举报

7#
ID:235869 发表于 2017-11-11 11:16 | 只看该作者
看起来不错的样子,学习一下看起来不错的样子,学习一下
回复

使用道具 举报

8#
ID:248359 发表于 2017-11-15 12:05 | 只看该作者
楼主,我打开仿真软件加入程序,运行以后,直接蜂鸣器一直响
回复

使用道具 举报

9#
ID:358464 发表于 2018-9-21 13:44 | 只看该作者
十分详细啊!
回复

使用道具 举报

10#
ID:399426 发表于 2018-9-27 13:09 | 只看该作者
资料很全面,点赞~
回复

使用道具 举报

11#
ID:322481 发表于 2018-10-29 07:41 | 只看该作者
写的好
回复

使用道具 举报

12#
ID:448755 发表于 2018-12-18 11:37 | 只看该作者
感谢发帖
回复

使用道具 举报

13#
ID:486635 发表于 2019-3-8 03:10 | 只看该作者
很好,可以学习下
回复

使用道具 举报

14#
ID:486635 发表于 2019-3-8 03:14 | 只看该作者
学习下
回复

使用道具 举报

15#
ID:609834 发表于 2019-9-17 09:01 | 只看该作者
有帮助
回复

使用道具 举报

16#
ID:630884 发表于 2019-10-27 14:21 | 只看该作者
还可以,目前正在学习这个
回复

使用道具 举报

17#
ID:1110110 发表于 2024-1-25 19:14 | 只看该作者
请教一下怎么将8路温度一起显示在屏幕上
回复

使用道具 举报

18#
ID:92810 发表于 2024-1-27 20:22 | 只看该作者
资料很全面,点赞~
回复

使用道具 举报

19#
ID:907553 发表于 2024-1-30 17:25 | 只看该作者
好资料,51黑有你更精彩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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