找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3451|回复: 7
收起左侧

单片机智能温度巡检仪设计(各通道单独设置上下限)源码与资料分享

[复制链接]
ID:317116 发表于 2018-4-26 22:37 | 显示全部楼层 |阅读模式
以前做过的一个课设,这是一个基于51单片机用DS18B20传感器进行4路通道的温度巡检,可以实现手动检查和自动检测,当然这个电路是基于Proteus电路进行仿真,可以对每个通道进行上下限设置,超限报警功能,同时将温度值显示到4位数码管,还可以在上位机进行显示。

显示效果.png

智能仪器综合设计实验——智能温度巡检仪的设计
一、实验目的
1.设计一个以51单片机为核心的智能温度巡检仪。
2.掌握智能仪器系统的软硬件设计方法
二、实验设备
计算机,proteus仿真软件,keil c51开发软件
三、实验任务
1.温度测量范围为-20~60摄氏度,温度分辨率0.1摄氏度。
2. 巡检通道最少4路。
3. 巡检显示时,要求各通道显示5s切换一次。
4. 显示通道可手动切换。
5. 独立式或矩阵式键盘,设置测量温度的上下限值,各通道可单独设置。
6. 测量超限时,进行声光报警,报警位置可定位。
7. 通过串口调试助手实现与上位机的通信,能将通道温度信息实时传送给上位机存储。
四、实验步骤
1.进入Keil uVision4软件编译环境,进行源程序编辑,保存。
2.对源程序进行编译、连接,如有错误必须对源程序进行修正并存盘,重复此步,直到编译无错误为止,生成扩展名为HEX的文件。
3.进入proteus仿真软件,进行电路原理图的绘制。
4.将第二步中生成的HEX文件加载入单片机,并运行,调节传感器输入温度值,观察仿真结果。
5.调试,若仿真结果有问题,则对系统进行调试,硬件问题回到第三步,软件问题回到第二步,反复进行修改,直到系统运行结果符合要求为止。
6.实验结果记录:实时记录温度值,并对数据进行分析。

五、预习与思考题
1.复习键盘显示控制电路和软件设计方法。
2.说明传感器选择的依据。
3.如果使用DS18B20数字温度传感器,说明数据输出的格式及处理方法。
4.如果使用模拟温度传感器,说明本系统如何实现标度变换,并说明选择何种A/D转换器及选择理由。
六、实验报告内容
题目,任务分析和方案设计,具体的软硬件设计,系统调试与分析,体会,附电路原理图和程序清单。电路原理图和程序清单可计算机打印,其余要求手写。

单片机源程序如下:
  1. /*******************************************************************************************************************
  2. * 实验名                :智能温度巡检仪设计显示实验
  3. * 使用的IO            :P0,P1,P2,P3
  4. * 实验效果      :LED数码管显示温度4个通道的温度值,按键用于设置温度的上下限值以及模式设置,蜂鸣器和LED灯用于声光报警
  5.   多位数码管动态显示程序要掌握几个要点:
  6. 1.显示1轮的周期不大于15ms,不小于1ms,否则大于15ms会闪烁,小于1ms会暗淡并产生鬼影。每一位的显示时间1~3ms为宜。
  7. 2.各位显示时间应相同,否则各位亮度不均匀。
  8. 3.显示过程不能被其他程序干扰,会产生闪烁。避免使用软件延时delay占用MCU时间,会影响其他程序运行。
  9. 4.这里的delay(),不是刷新延时,只是相邻两个数码管交替显示的间隔时间,所以刷新时间是定时器的溢出时间。
  10. 5.最好是在定时器溢出时只显示一个数码管,等下次溢出时再显示下一个数码管,这样只有一个时间需要调整,容易做一些,
  11.   现在的做法实际上是有两个时间,一个是定时器,一个是delay(),两个时间的协调会比较麻烦
  12.   总而言之,用中断法或时间片轮询法处理多位数码管动态显示效果较好。
  13. ******************************姓名:李仕刚 ************************************
  14. ******************************班级:1434070102 ********************************
  15. ******************************学号:143407010214 ******************************
  16. ********************************************************************************************************************/
  17. /***************************************************实验现象********************************************************
  18. 1.按下S5按键进入自动巡检模式,每隔5S会切换到下一个通道进行检测,并将检测结果进行显示,有超过限值会发光发声报警。
  19. 2.按下S6按键进入手动巡检模式,每次按下相应通道(S1S2S3S4)会切换到相应通道进行检测,并将检测结果进行显示,有超过限值
  20.   会发光发声报警。再次按下S6退出手动巡检模式。
  21. 3.按下(S1S2S3S4)对相应通道的上下限值进行设置,按下S5是对上限值进行加,S6对下限值进行减。设置完毕后,按下(S1S2S3S4)
  22.   对应通道按键退出相应通道的温度设置。
  23. 4.
  24. ********************************************************************************************************************/
  25. #include<reg51.h>
  26. #include"temperture.h"
  27. #include"led_beep.h"
  28. #include"keyscan.h"
  29. #include"display.h"
  30. #include<stdio.h>
  31. //int MAX_temperture=50;//温度上限值
  32. //int MIN_temperture=10;//温度下限值
  33. uint count=0;
  34. uchar SIGNAL1_Timer_5S=0;//传感器1定时5S标志
  35. uchar SIGNAL2_Timer_5S=0;//传感器2定时5S标志
  36. uchar SIGNAL3_Timer_5S=0;//传感器3定时5S标志
  37. uchar SIGNAL4_Timer_5S=0;//传感器4定时5S标志
  38. //uchar Usart_shi=0;Usart_ge=0;Usart=20;
  39. void UsartConfiguration();
  40. void Timer0Configuration();
  41. /*******************************************************************************
  42. * 函数名          : main主函数  【【-----------当局者迷,旁观者清------------】】
  43. *******************************************************************************/
  44. void main()
  45. {        
  46. //        uchar sendData=0;
  47.         uchar i=0;
  48.         P2=0x0F;
  49.         GPIO_DIG=0xFF; //消隐,数码管全部点亮,显示8.8.8.8.
  50. //        Delay1ms(1000);//延时1S等待做出按键选择,如果不按下按键,则默认进入自动巡检模式
  51.         UsartConfiguration();
  52.         Timer0Configuration();
  53.         while(1)
  54.         {
  55.                 Keyscan();                 //安检扫描函数
  56.                 if(SIGNAL1_Timer_5S)
  57.                 {
  58.                         LEDDisplay(SIGNAL1_Ds18b20ReadTemp());
  59.                         Auto_WD_Display();
  60.                         Usart_shi=Final_WD/10+0x30;
  61.                         Usart_ge=Final_WD%10+0x30;
  62.                         if(i==0)
  63.                         {
  64.                                 send_wd('\r');
  65.                         }
  66.                         send_wd(Usart_shi);//发送温度数据
  67.                         send_wd(Usart_ge);
  68.                         send_wd(' ');
  69.                         i++;
  70.                         if(i==8)
  71.                         {
  72.                                 i=0;
  73.                                 send_wd('\r');
  74.                         }
  75.                         SIGNAL1_Led_Beep(Final_WD);
  76.                 }
  77.                 if(SIGNAL2_Timer_5S)
  78.                 {
  79.                         LEDDisplay(SIGNAL2_Ds18b20ReadTemp());
  80.                         Auto_WD_Display();
  81.                         Usart_shi=Final_WD/10+0x30;
  82.                         Usart_ge=Final_WD%10+0x30;
  83.                         if(i==0)
  84.                         {
  85.                                 send_wd('\r');
  86.                         }
  87.                         send_wd(Usart_shi);//发送温度数据
  88.                         send_wd(Usart_ge);
  89.                         send_wd(' ');
  90.                         i++;
  91.                         if(i==8)
  92.                         {
  93.                                 i=0;
  94.                                 send_wd('\r');
  95.                         }
  96.                         SIGNAL2_Led_Beep(Final_WD);
  97.                 }
  98.                 if(SIGNAL3_Timer_5S)
  99.                 {
  100.                         LEDDisplay(SIGNAL3_Ds18b20ReadTemp());
  101.                         Auto_WD_Display();
  102.                         Usart_shi=Final_WD/10+0x30;
  103.                         Usart_ge=Final_WD%10+0x30;
  104.                         if(i==0)
  105.                         {
  106.                                 send_wd('\r');
  107.                         }
  108.                         send_wd(Usart_shi);//发送温度数据
  109.                         send_wd(Usart_ge);
  110.                         send_wd(' ');
  111.                         i++;
  112.                         if(i==8)
  113.                         {
  114.                                 i=0;
  115.                                 send_wd('\r');
  116.                         }
  117.                         SIGNAL3_Led_Beep(Final_WD);
  118.                 }
  119.                 if(SIGNAL4_Timer_5S)
  120.                 {
  121.                         LEDDisplay(SIGNAL4_Ds18b20ReadTemp());
  122.                         Auto_WD_Display();
  123.                         Usart_shi=Final_WD/10+0x30;
  124.                         Usart_ge=Final_WD%10+0x30;
  125.                         if(i==0)
  126.                         {
  127.                                 send_wd('\r');
  128.                         }
  129.                         send_wd(Usart_shi);//发送温度数据
  130.                         send_wd(Usart_ge);
  131.                         send_wd(' ');
  132.                         i++;
  133.                         if(i==8)
  134.                         {
  135.                                 i=0;
  136.                                 send_wd('\r');
  137.                         }
  138.                         SIGNAL4_Led_Beep(Final_WD);
  139.                 }
  140. //                if(usart_key==0)
  141. //                {
  142. //                         while(!usart_key);
  143. //                        Usart_shi=Final_WD/10+0x30;
  144. //                        Usart_ge=Final_WD%10+0x30;
  145. //                        send_wd(Usart_shi);//发送温度数据
  146. //                        send_wd(Usart_ge);
  147. //                        send_wd('\r');
  148. //                }               
  149.         }
  150. }
  151. /*******************************************************************************
  152. * 函 数 名         :UsartConfiguration()
  153. * 函数功能                   :设置串口
  154. *******************************************************************************/
  155. void UsartConfiguration()
  156. {
  157.         SCON=0X40;                        //设置为工作方式1 SM0 SM1 SM2 REN TB8 RB8 TI RI
  158. //        TMOD=0X20;                        //设置计数器工作方式2
  159.         PCON=0X00;                        //波特率加倍           fosc=12MHZ
  160.         TH1=0XFD;                    //计数器初始值设置,注意波特率是9600的
  161.         TL1=0XFD;                        //B=(2^SMODXfosc)/(32X12X(2^n-X))=9600     X=256-6.5=250=FA
  162.         TR1=1;                                //打开计数器
  163.         ES=1;                                //打开串口中断
  164. }
  165. void UsartConfiguration_DATA() interrupt 4
  166. {
  167. //        ES=0;
  168. //        TI=0;
  169. //        ES=1;
  170.         if(TI) //发送完一字节数据
  171.         {
  172.           TI=0;
  173.           send=0;  //清正在发送标志
  174.         }
  175. }

  176. /*******************************************************************************
  177. * 函数名         : Timer0Configuration()
  178. * 函数功能                 : 设置计时器
  179. *******************************************************************************/
  180. void Timer0Configuration()
  181. {
  182.         TMOD=0x21;//选择为定时器模式,工作方式1,仅用TRX打开启动。T1工作方式2
  183.         TH0=0xD8;//给定时器赋初值,定时10ms        定时50ms初值X=2^16-(定时时间T/1MHZ)=65536-50000=15536=3CB0        
  184.         TL0=0xF0;//定时初值X=2^16-(定时时间T/1MHZ)=65536-10000=55536=D8F0
  185. //        TH0=0x3C;
  186. //        TL0=0xB0;        
  187.         ET0=1;//打开定时器0中断允许
  188.         EA=1;//打开总中断
  189.         TF0=0;
  190. //        TR0=1;//关闭定时器0               
  191. }
  192. /*******************************************************************************
  193. * 函数名         : DigDisplay() interrupt 1
  194. * 函数功能                 : 中断数码管显示
  195. *******************************************************************************/
  196. void DigDisplay() interrupt 1
  197. {        
  198.         TR0=0;
  199.         TF0=0;        
  200.         TH0=0xD8;//给定时器赋初值,定时10ms
  201.         TL0=0xF0;//定时初值X=2^16-(定时时间T/1MHZ)=65536-10000=55536=D8F0        
  202. //        TH0=0x3C;
  203. //        TL0=0xB0;
  204.         if(count==0)
  205.         {
  206.                 SIGNAL1_Timer_5S=1;//进入中断后先显示传感器1通道的温度值
  207.         }
  208.         count++;
  209.         if(count==200)   //定时时间达到5S
  210.         {               
  211.                 SIGNAL1_Timer_5S=0;
  212.                 SIGNAL2_Timer_5S=1;                                                
  213.         }
  214.         if(count==400)//定时时间达到10S
  215.         {        
  216.                 SIGNAL2_Timer_5S=0;
  217.                 SIGNAL3_Timer_5S=1;
  218.         }
  219.         if(count==600)//定时时间达到15S
  220.         {               
  221.                 SIGNAL3_Timer_5S=0;
  222.                 SIGNAL4_Timer_5S=1;                                                
  223.         }
  224.         if(count==800)//定时时间达到20S

  225. ……………………

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

0.png
所有资料51hei提供下载:
智能仪器.zip (286.81 KB, 下载次数: 70)
回复

使用道具 举报

ID:1 发表于 2018-4-27 03:12 | 显示全部楼层
好资料,51黑有你更精彩!!!楼主能分享下仿真工程吗?
回复

使用道具 举报

ID:317116 发表于 2018-4-27 10:04 | 显示全部楼层
admin 发表于 2018-4-27 03:12
好资料,51黑有你更精彩!!!楼主能分享下仿真工程吗?

昨晚发的,睡太早了,压缩包里只有代码,忘记添加仿真电路了,实在抱歉!马上添加上!
回复

使用道具 举报

ID:317116 发表于 2018-4-27 10:10 | 显示全部楼层
实在抱歉忘记把仿真电路放里边了,下次不再犯这种错误了,对了,我的仿真用的是Proteus8.1版本,有的低版本打不开的,所以需要的注意了,请勿说仿真打不开的问题!
回复

使用道具 举报

ID:317116 发表于 2018-4-27 11:22 | 显示全部楼层
附上仿真电路

温度巡检仿真电路.zip

82.62 KB, 下载次数: 35, 下载积分: 黑币 -5

仿真电路

回复

使用道具 举报

ID:652296 发表于 2019-11-29 14:07 来自手机 | 显示全部楼层
新视野 发表于 2018-4-27 11:22
附上仿真电路

楼主在吗
回复

使用道具 举报

ID:316613 发表于 2020-9-15 10:45 | 显示全部楼层
这仿真里面不对啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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