基于單片機的溫度控制系統資料水溫控制系統
1.采用液晶顯示當前溫度值,溫度上限和溫度下限;
2.采用DS18B20溫度傳感器測溫;
3.按鍵可以設置報警值,當溫度超過設定的上限或低于下限(顯示比例:32%,雙擊查同時相應的繼電器吸合
4.加鍵和減鍵。可設置上下限溫度控制范圍;
5.溫度測量范圍0到99.9攝氏度,精度為0.1攝氏度;
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1UANP@5SI)Y@G]N$QYEVB96.png (70.2 KB, 下載次數: 120)
下載附件
2020-5-22 23:44 上傳
XFONMG4U(O_MET~BH~]WK`I.png (68.55 KB, 下載次數: 99)
下載附件
2020-5-22 23:43 上傳
G3]XN8@G@R0I63QYC4M%6$B.png (284.96 KB, 下載次數: 121)
下載附件
2020-5-22 23:44 上傳
$@07Z7T9}%PEWHDBFFGG]CP.png (240.93 KB, 下載次數: 85)
下載附件
2020-5-22 23:44 上傳
單片機源程序如下:
- #include<reg52.h>
- #include"1602.h"
- #include"ds18b20.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit speaker=P1^5; //定義蜂鳴器
- sbit red=P2^0; //定義報警燈
- //sbit green=P2^1;
- sbit key1=P3^0; //定義溫度按鍵
- sbit key2=P3^1; //定義時間按鍵
- uint tem; //定義采集溫度
- int htem,time; //定義溫度、時間
- int cnt1=1,cnt2=1; //定義計數變量
- int min,i;
- uchar mode=0; //定義模式變量
- uchar code t3[]={"high temp: C"};
- uchar code t4[]={"time: MIN"};
- //延時函數
- void delay1(uint i)
- {
- while(i--);
- }
- //顯示函數1
- void display(uint dat,uchar add)
- {
- uchar bai,shi ,ge;
- bai=dat/100;
- shi=dat%100/10;
- ge=dat%10;
- writelcd_cmd(add);
- writelcd_dat(bai+0x30);
- writelcd_dat(shi+0x30);
- writelcd_cmd(add+3);
- writelcd_dat(ge+0x30);
- }
- //顯示函數2
- void display2(uint dat,uchar add)
- {
- uchar bai,shi ;
- bai=dat/100;
- shi=dat%100/10;
- //ge=dat%10;
- writelcd_cmd(add);
- writelcd_dat(shi+0x30);
- writelcd_dat(bai+0x30);
- writelcd_cmd(add+3);
- //writelcd_dat(ge+0x30);
- }
- //顯示函數3
- void display3(uint dat,uchar add)
- {
- uchar ge;
- //bai=dat/100;
- //shi=dat%100/10;
- ge=dat%10;
- writelcd_cmd(add);
- //writelcd_dat(shi+0x30);
- //writelcd_dat(bai+0x30);
- //writelcd_cmd(add+3);
- writelcd_dat(ge+0x30);
- }
- //按鍵掃描函數
- void keyscan()
- { uchar i,j;
- writelcd_cmd(0x80);
- for(i=0;i<16;i++)
- {writelcd_dat(t3[i]);}
- writelcd_cmd(0xc0);
- for(j=0;j<16;j++)
- {writelcd_dat(t4[j]);}
-
-
- while(mode!=0)
- {
- display2(htem,0x8b);
- display3(time,0xca);
- while(mode!=0)
- {
- switch(mode)
- {
- case 1:writelcd_cmd(0xc0+10);writelcd_cmd(0x0f);break;
- case 2:writelcd_cmd(0x80+11);writelcd_cmd(0x0f);break;
- default:mode=0;break;
- }
- if(key1==0&&mode==1)
- {
-
- delay(50);
- if(key1==0)
- {
- cnt1++;
- while(key1==0);
- switch(cnt1%10)
- {
- case 1:time=1;min=1000;display3(time,0xca);writelcd_cmd(0xca+11);break; //1分鐘
- case 2:time=2;min=2000;display3(time,0xca);writelcd_cmd(0xca+11);break; //2分鐘
- case 3:time=3;min=3000;display3(time,0xca);writelcd_cmd(0xca+11);break; //3分鐘
- case 4:time=4;min=4000;display3(time,0xca);writelcd_cmd(0xca+11);break; //4分鐘
- case 5:time=5;min=5000;display3(time,0xca);writelcd_cmd(0xca+11);break; //5分鐘
- case 6:time=6;min=6000;display3(time,0xca);writelcd_cmd(0xca+11);break; //6分鐘
- case 7:time=7;min=7000;display3(time,0xca);writelcd_cmd(0xca+11);break; //7分鐘
- case 8:time=8;min=8000;display3(time,0xca);writelcd_cmd(0xca+11);break; //8分鐘
- case 9:time=9;min=9000;display3(time,0xca);writelcd_cmd(0xca+11);break; //9分鐘
-
- default:break;
- }
- }
- }
-
- if(key2==0&&mode==2)
- {
- delay(10);
- if(key2==0)
- {
- cnt2++;
- while(key2==0);
- switch(cnt2%4)
- {
- case 1:htem=20;display2(htem,0x8b);writelcd_cmd(0x80+11);break; //20攝氏度
- case 2:htem=50;display2(htem,0x8b);writelcd_cmd(0x80+11);break; //50攝氏度
- case 3:htem=80;display2(htem,0x8b);writelcd_cmd(0x80+11);break; //80攝氏度
- default:break;
- }
- }
- }
- }
- }
- lcd_init();
- }
- //中斷初始化函數
- void init()
- {
- lcd_init(); //lcd初始化
- speaker=1;
- red=0;
- mode=0;
- htem=20;
- time=1;
- EA=1; //總中斷開啟
- EX0=1; //外部中斷0允許
- ET0=1; //定時器0允許
- TMOD=0X01; //定時中斷0,模式1
- IT0=1; //下降沿觸發
- TH0=0Xee; //0.5us
- TL0=0X00;
- //TR0=0;
- }
- //主函數
- void main()
- {
- red=0;
- init(); //中斷初始化
- while(1)
- {
- if(mode!=0)
- {keyscan();}
- else if(mode==0)
- {
- delay(100);
- tmpchange();
- tem=tmp(); //溫度值獲取
- if(tem>=(htem*10)) //高于設定溫度
- {
- TR0=1; //中斷開啟
- red=1; //報警燈亮
- }
- else //低于設定溫度
- {
- TR0=0; //中斷關閉
- red=0; //報警燈滅
- }
-
- delay(10);
- display(tem,0xca);
- delay(100);
- TR0=0;
-
- }
- }
- }
- //外部中斷服務函數
- void exter()interrupt 0
- {
- delay(50); //按鍵消抖
- if(P3^2==0)
- mode++;
- mode=mode%4 ; //每按4次置0
- }
- //定時中斷服務函數
- void timer0()interrupt 1
- {
- TH0=0Xee; //重裝載
- TL0=0X00;
- min--;
- if(min<=0) //計時時間到
- {
- red=1; //報警燈閃爍
- delay(200);
- speaker=~speaker;delay1(1); //蜂鳴器報警
- TR0=0; //定時中斷關閉
- }
-
- }
復制代碼
所有資料51hei提供下載(求大神指點,如何加入pid啊):
PID溫度控制.zip
(126.37 KB, 下載次數: 297)
2020-5-22 23:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|