找回密码
 注册

QQ登录

只需一步,快速开始

搜索

ds18b20多点监控+温度报警+上下限温度设定及存储 仿真程序

[复制链接]
eng 发表于 2021-7-6 16:49:16 | 显示全部楼层 |阅读模式
51单片机ds18b20多点监控+温度报警+上下限温度设定及存储 仿真程序
//功能:1.可轮流检测6个区域的温度,实现5秒钟自动切换功能,和手动切换
//                        2.可显示时间及调节时间
//                        3.温度高于上限或低于上限报警
//                        4.可调整温度上限及下限,并且带掉电保护
//      5.可对-20摄氏度——60摄氏度温度测量,温度过高或者过低显示error

所谓多点温度巡检仪主要针对环境和设备内温度的集中检测和管理,可以无人值守24小时不间断检测温度,可实现高低温报警和自动切换显示区域。克服了管理人员手动测量和手工计算温度的误差,又提高了检测速度和精度,省了大量的人力和物力。

自行设计并制作多点温度巡检仪 (以下简称巡检仪 )。巡检仪可以对6个以上的监测点的温度进行轮流检测,检测周期不能超过0.3分钟。检测温度范围-200C--600C,检测的误差不能超过0.3%。

二、要求
巡检仪可以对6个以上的监测点的温度进行轮流检测,检测周期不能超过0.3分钟。检测温度范围-200C--600C,检测的误差不能超过0.3%。

1. 基本要求
第(1)项 分别轮流检测6个点的温度,并显示出来;
第(2)项 每5秒钟自动切换一个温度点,同时显示日期和时间;
第(3)项 要求能通过按键切换当前显示的温度点;

2. 发挥部分
(1)温度高于上限则报警,温度低于下限则报警 ;计分5
(2)可以设置上限温度的报警值和下限温度的报警值,计分10;。
(3)系统关闭电源,报警的设定值不会丢失 ,  计分15 。

三、说明
1. 显示部分可以用液晶,也可以用数码管显示

2. 可用键盘设置目标报警点和时间日期调整

3.  测试要求与说明

  • 温度显示
  • 当前时间显示
  • 温度显示的手动切换
  • 报警设置测试
  • 报警输出测试`


2. 方案选择:

根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如图所示:

127.001.jpg
2.1时钟模块:
127.002.jpg
2.2 报警装置:

127.003.jpg

2.3 温度传感器:

127.004.jpg


2.4 LCD1602显示装置:
127.005.jpg
2.5 LED指示灯:
127.006.jpg
2.6 按键模块:
127.007.jpg
3. 程序框图:

单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如图所示。

127.008.jpg

4.系统的具体设计与实现:4.1时钟模块:
精准显示年,月,日,时,分,秒,自带备用电源,能掉电自动走时,功耗低,避免了每一次上电手动校时。
4.2 报警装置:

当温度超过设定上限/下限,警报系统就会发出报警信号,让人们知道哪个区域温度高于或低于设置的温度上限/下限


4.3 温度传感器:

六个温度传感器采用的是18B20,可以并联,并且六个温度传感器只占用一个I/O口,既节省成本,也节省不必要的能耗

4.4 LCD1602显示装置:
采用LCD1602显示装置,功耗低,显示清晰
4.5 LED指示灯:
调整日期和时间的提示,D1亮调分D2亮调时D3亮调日D4调月D5亮调年
4.6 按键模块:
七个按键调时间和报警温度,既省节省成本也 方便操作

5.最小系统图:

    该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统图如所示:

127.009.jpg
  1. #include <REG52.H>
  2. #include "lcd_1602.h"
  3. #include "ds18b20.h"
  4. #include "DS1302.h"

  5. #define uchar unsigned char
  6. #define uint unsigned int
  7.         unsigned char code table[]="0123456789+-.";
  8. unsigned char code table1[]="eroABCDEF";//error
  9. unsigned char table3[16]="00:00:00a 00000";
  10. unsigned char table4[16]="11-11-111+11100";


  11. //sbit SCLK = P1^1; // DS1302时钟信号7脚
  12. //sbit DIO= P1^2; // DS1302数据信号6脚
  13. //sbit CE = P1^0; // DS1302片选5脚

  14. sbit LED1=P1^3;
  15. sbit LED2=P1^4;
  16. sbit LED3=P1^5;
  17. sbit LED4=P1^6;
  18. sbit LED5=P1^7;

  19. //sbit RW_LCD=P2^1;
  20. //sbit RS_LCD=P2^0;
  21. //sbit E_LCD=P2^2;

  22. sbit TM_BUT1=P2^3;
  23. sbit TM_BUT2=P2^4;
  24. sbit TM_BUT3=P2^5;

  25. sbit bee=P2^6;

  26. //sbit DS18B20_DQ=P3^0;
  27. sbit TEMP_BUT1=P3^2;

  28. sbit TEMP_BUT2=P3^3;
  29. sbit TEMP_BUT3=P3^4;
  30. sbit TEMP_BUT4=P3^5;
  31. sbit TEMP_BUT5=P3^6;

  32. void xianshi_ds18b20_lcd1602()//温度显示
  33. {
  34.         uint ee;
  35.         DS18B20_init();
  36.         R_temp_DS18B20();
  37.         ee=R_temp_DS18B20();
  38.         table3[8]=table1[DS18b20_cs+3];


  39.         ee=ee*6.25;
  40.         if(fu_flag==1)
  41.         {
  42.                         if(ee>2000)
  43.                 {
  44.                         table3[10]=table1[0];
  45.                         table3[11]=table1[1];
  46.                         table3[12]=table1[1];
  47.                         table3[13]=table1[2];
  48.                         table3[14]=table1[1];
  49.                         table3[15]=1;
  50.                 }
  51.                 else
  52.                 {

  53.                         table3[10]=table[11];
  54.                         table3[11]=table[ee/1000];
  55.                         table3[12]=table[ee/100%10];
  56.                         table3[13]=table[12];
  57.                         table3[14]=table[ee/10%10];
  58.                         table3[15]=3;
  59.                 }

  60.         }
  61.         
  62.                 if(fu_flag==0)
  63.         {
  64.                         if(ee>6000)
  65.                 {

  66.                         table3[10]=table1[0];
  67.                         table3[11]=table1[1];
  68.                         table3[12]=table1[1];
  69.                         table3[13]=table1[2];
  70.                         table3[14]=table1[1];
  71.                         table3[15]=2;
  72.                 }
  73.                
  74.                 else
  75.                 {
  76.                         table3[10]=table[10];
  77.                         table3[11]=table[ee/1000];
  78.                         table3[12]=table[ee/100%10];
  79.                         table3[13]=table[12];
  80.                         table3[14]=table[ee/10%10];
  81.                         table3[15]=3;
  82.                 }
  83.         }
  84. }

  85. void t0_init()//初始化定时器t0
  86. {
  87.         TMOD=0X01;
  88.   TH0 = 0x3C;
  89.         TL0 = 0x0B0;
  90.         EA=1;
  91.         ET0=1;
  92.         TR0=1;
  93. }
  94. void ds18b20_qiehuan()//按键切换区域温度
  95. {
  96.         if(TEMP_BUT1==0)
  97.         {
  98.                 delay_ms(20);
  99.                 if(TEMP_BUT1==0)
  100.                 {
  101.                         DS18b20_cs++;
  102.                 }
  103.                 while(TEMP_BUT1!=1);
  104.         }
  105.         
  106. }

  107. void xianshi_DS1302_lcd1602()//用1602显示时间
  108. {
  109.         freshtime();

  110.         table3[0]=table[hour_1];
  111.         table3[1]=table[hour_0];
  112.         table3[3]=table[minute_1];
  113.         table3[4]=table[miunte_0];
  114.         table3[6]=table[second_1];
  115.         table3[7]=table[second_0];        
  116.         
  117.         table4[0]=table[year_1];
  118.         table4[1]=table[year_0];
  119.         table4[3]=table[month_1];
  120.         table4[4]=table[month_0];
  121.         table4[6]=table[date_1];
  122.         table4[7]=table[date_0];
  123.         table4[8]=2;
  124.         table4[12]=1;
  125. }

  126. void BUT_ds1302()//ds1302按键调时间
  127. {
  128.         uchar temp,mun;
  129.         freshtime();
  130.         if(TM_BUT1==0)
  131.         {
  132.                 delay_ms(10);
  133.                 if(TM_BUT1==0)
  134.                 {
  135.                         temp++;
  136.                 }
  137.                 while(TM_BUT1!=1);
  138.         }
  139.         switch(temp)
  140.         {
  141.                 case 1:        LED1=0;LED2=1;LED3=1;LED4=1;LED5=1;
  142.                                                 if(TM_BUT2==0){delay_ms(10);if(TM_BUT2==0){
  143.                                                                 mun=tab[0];mun++;
  144.                                                 if((mun&0x0f)>9)mun+=6;
  145.                                                 if(mun>0x59){mun=0;}Write1302 (WRITE_MINUTE,mun);while(TM_BUT2!=1);
  146.                                                 }}
  147.                                                 if(TM_BUT3==0){delay_ms(10);if(TM_BUT3==0){
  148.                                                                 mun=tab[0];mun--;
  149.                                                 if((mun&0x0f)>9)mun-=6;
  150.                                                 if(mun>0x59){mun=0x59;}Write1302 (WRITE_MINUTE,mun);while(TM_BUT3!=1);
  151.                                                 }}break;
  152.                                                 
  153.                         case 2:        LED1=1;LED2=0;LED3=1;LED4=1;LED5=1;
  154.                                                         if(TM_BUT2==0){delay_ms(10);if(TM_BUT2==0){
  155.                                                                 mun=tab[1];mun++;
  156.                                                 if((mun&0x0f)>9)mun+=6;
  157.                                                 if(mun>0x23){mun=0;}Write1302 (WRITE_HOUR,mun);while(TM_BUT2!=1);
  158.                                                 }}
  159.                                                 if(TM_BUT3==0){delay_ms(10);if(TM_BUT3==0){
  160.                                                                 mun=tab[1];mun--;
  161.                                                 if((mun&0x0f)>9)mun-=6;
  162.                                                 if(mun>0x23){mun=0x23;}Write1302 (WRITE_HOUR,mun);while(TM_BUT3!=1);
  163.                                                 }}break;
  164.                                                 
  165.                         case 3:        LED1=1;LED2=1;LED3=0;LED4=1;LED5=1;
  166.                                                         if(TM_BUT2==0){delay_ms(10);if(TM_BUT2==0){
  167.                                                                 mun=tab[2];mun++;
  168.                                                 if((mun&0x0f)>9)mun+=6;
  169.                                                 if(mun>0x31){mun=1;}Write1302 (WRITE_DATE,mun);while(TM_BUT2!=1);
  170.                                                 }}
  171.                                                 if(TM_BUT3==0){delay_ms(10);if(TM_BUT3==0){
  172.                                                                 mun=tab[2];mun--;
  173.                                                 if((mun&0x0f)>9)mun-=6;
  174.                                                 if(mun<0x01){mun=0x31;}Write1302 (WRITE_DATE,mun);while(TM_BUT3!=1);
  175.                                                 }}break;
  176.                                                 
  177.                         case 4:        LED1=1;LED2=1;LED3=1;LED4=0;LED5=1;
  178.                                                         if(TM_BUT2==0){delay_ms(10);if(TM_BUT2==0){
  179.                                                                 mun=tab[3];mun++;
  180.                                                 if((mun&0x0f)>9)mun+=6;
  181.                                                 if(mun>0x12){mun=1;}Write1302 (WRITE_MONTH,mun);while(TM_BUT2!=1);
  182.                                                 }}
  183.                                                 if(TM_BUT3==0){delay_ms(10);if(TM_BUT3==0){
  184.                                                                 mun=tab[3];mun--;
  185.                                                 if((mun&0x0f)>9)mun-=6;
  186.                                                 if(mun<0x01){mun=0x12;}Write1302 (WRITE_MONTH,mun);while(TM_BUT3!=1);
  187.                                                 }}break;
  188.                                                 
  189.                         case 5:        LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;
  190.                                                         if(TM_BUT2==0){delay_ms(10);if(TM_BUT2==0){
  191.                                                                 mun=tab[4];mun++;
  192.                                                 if((mun&0x0f)>9)mun+=6;
  193.                                                 if(mun>0x99){mun=0;}Write1302 (WRITE_YEAR,mun);while(TM_BUT2!=1);
  194.                                                 }}
  195.                                                 if(TM_BUT3==0){delay_ms(10);if(TM_BUT3==0){
  196.                                                                 mun=tab[4];mun--;
  197.                                                 if((mun&0x0f)>9)mun-=6;
  198.                                                 if(mun>0x99){mun=0x99;}Write1302 (WRITE_YEAR,mun);while(TM_BUT3!=1);
  199.                                                 }}break;
  200.                         case 6: temp=0;LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;break;
  201.         }
  202. }

  203. void ds18b20_baojing()//温度上下限报警
  204. {
  205.         if(DS18b20_dat[2]>DS18b20_dat[0]|DS18b20_dat[2]<DS18b20_dat[1])
  206.         {
  207.                 bee=0;               
  208.         }
  209.         else        bee=1;
  210. }
  211. void ds18b20_display_hl()//显示上下限报警温度
  212. {

  213.         table4[10]=table[DS18b20_dat[0]/10];
  214.         table4[11]=table[DS18b20_dat[0]%10];
  215.         if((DS18b20_dat[1]&0x80)==0x80)
  216.         {
  217.                 table4[13]=table[11];
  218.                 table4[14]=table[(~DS18b20_dat[1]+1)/10];
  219.                 table4[15]=table[(~DS18b20_dat[1]+1)%10];

  220.         }
  221.         else
  222.         {
  223.                 table4[13]=table[10];
  224.                 table4[14]=table[DS18b20_dat[1]/10];
  225.                 table4[15]=table[DS18b20_dat[1]%10];
  226.         }
  227. }
  228. void ds18b20_but_hl()//设置报警上下限
  229. {
  230.         char temp;
  231.         if(TEMP_BUT2==0)
  232.                 {
  233.                         delay_ms(10);
  234.                         if(TEMP_BUT2==0)
  235.                                 {
  236.                                         temp=DS18b20_dat[0];
  237.                                         temp++;
  238.                                         if(temp>0x3c)temp=0;
  239.                                         DS18b20_dat[0]=temp;
  240.                                 }
  241.                                 while(TEMP_BUT2!=1);
  242.                         }
  243.                         if(TEMP_BUT3==0){delay_ms(10);if(TEMP_BUT3==0){
  244.                         temp=DS18b20_dat[0];temp--;if((temp&0x80)==0x80)temp=60;DS18b20_dat[0]=temp;}
  245.                         while(TEMP_BUT3!=1);}
  246.                         
  247.                         if(TEMP_BUT4==0)
  248.                 {
  249.                         delay_ms(10);
  250.                         if(TEMP_BUT4==0)
  251.                                 {
  252.                                         temp=DS18b20_dat[1];
  253.                                         temp++;
  254.                                         DS18b20_dat[1]=temp;
  255.                                 }
  256.                                 while(TEMP_BUT4!=1);
  257.                         }
  258.                
  259.                         if(TEMP_BUT5==0){delay_ms(10);if(TEMP_BUT5==0){
  260.                         temp=DS18b20_dat[1];temp--;if(temp<-20)temp=0;DS18b20_dat[1]=temp;}
  261.                         while(TEMP_BUT5!=1);}

  262.         }
  263. void main()
  264. {        
  265.         LCD_1602_init();
  266.         DS1302_init();
  267.         t0_init();        
  268.         read_t();
  269.         while(1)
  270.         {                        
  271.                 xianshi_DS1302_lcd1602();
  272.                 ds18b20_display_hl();
  273.                 xianshi_ds18b20_lcd1602();
  274.                 printf(table3,1,1);
  275.                 printf(table4,1,2);
  276.                 store_t();
  277.         }
  278. }


  279. void t1zd()interrupt 1
  280. {
  281.                 uchar i;
  282.     TH0 = 0x3C;
  283.     TL0 = 0x0B0;
  284.                 i++;
  285.                 BUT_ds1302();        
  286.                 ds18b20_qiehuan();
  287.                 ds18b20_baojing();
  288.                 ds18b20_but_hl();
  289.                 if(i==90)
  290.                 {
  291.                         DS18b20_cs++;
  292.                         i=0;
  293.                 }
  294.                 if(DS18b20_cs>=6)
  295.                 {
  296.                         DS18b20_cs=0;
  297.                 }        
  298.         
  299. }
复制代码

192734pifxixtbhyub736o.png 源码和仿真文件及完整文档.zip (409.83 KB, 售价: 2 E币)


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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-19 02:46

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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