|
基于單片機的溫度控制系統(tǒng)資料水溫控制系統(tǒng)
1.采用液晶顯示當(dāng)前溫度值,溫度上限和溫度下限;
2.采用DS18B20溫度傳感器測溫;
3.按鍵可以設(shè)置報警值,當(dāng)溫度超過設(shè)定的上限或低于下限(顯示比例:32%,雙擊查同時相應(yīng)的繼電器吸合
4.加鍵和減鍵?稍O(shè)置上下限溫度控制范圍;
5.溫度測量范圍0到99.9攝氏度,精度為0.1攝氏度;
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #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; //定義計數(shù)變量
- int min,i;
- uchar mode=0; //定義模式變量
- uchar code t3[]={"high temp: C"};
- uchar code t4[]={"time: MIN"};
- //延時函數(shù)
- void delay1(uint i)
- {
- while(i--);
- }
- //顯示函數(shù)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);
- }
- //顯示函數(shù)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);
- }
- //顯示函數(shù)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);
- }
- //按鍵掃描函數(shù)
- 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();
- }
- //中斷初始化函數(shù)
- 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; //下降沿觸發(fā)
- TH0=0Xee; //0.5us
- TL0=0X00;
- //TR0=0;
- }
- //主函數(shù)
- void main()
- {
- red=0;
- init(); //中斷初始化
- while(1)
- {
- if(mode!=0)
- {keyscan();}
- else if(mode==0)
- {
- delay(100);
- tmpchange();
- tem=tmp(); //溫度值獲取
- if(tem>=(htem*10)) //高于設(shè)定溫度
- {
- TR0=1; //中斷開啟
- red=1; //報警燈亮
- }
- else //低于設(shè)定溫度
- {
- TR0=0; //中斷關(guān)閉
- red=0; //報警燈滅
- }
-
- delay(10);
- display(tem,0xca);
- delay(100);
- TR0=0;
-
- }
- }
- }
- //外部中斷服務(wù)函數(shù)
- void exter()interrupt 0
- {
- delay(50); //按鍵消抖
- if(P3^2==0)
- mode++;
- mode=mode%4 ; //每按4次置0
- }
- //定時中斷服務(wù)函數(shù)
- void timer0()interrupt 1
- {
- TH0=0Xee; //重裝載
- TL0=0X00;
- min--;
- if(min<=0) //計時時間到
- {
- red=1; //報警燈閃爍
- delay(200);
- speaker=~speaker;delay1(1); //蜂鳴器報警
- TR0=0; //定時中斷關(guān)閉
- }
-
- }
復(fù)制代碼
所有資料51hei提供下載(求大神指點,如何加入pid啊):
PID溫度控制.zip
(126.37 KB, 下載次數(shù): 297)
2020-5-22 23:44 上傳
點擊文件名下載附件
|
|