51單片機(jī)檢測水箱內(nèi)溫度,ph值;
使用pid算法控制溫度到設(shè)置值;
普通控制ph值到設(shè)定值 溫度低,啟動加熱;PH值過高,啟動進(jìn)水;PH值過低,啟動進(jìn)料。
水位過高,啟動放水。
Altium Designer畫的原理圖如下:(51hei附件中可下載工程文件)
14Z~K}HE)VB}O{}[_R~_})X.png (194.16 KB, 下載次數(shù): 61)
下載附件
2022-1-18 18:22 上傳
元件清單:
元件 型號 數(shù)量
單片機(jī) AT89C51 1
電容 10uf 1
電容 30pf 2
晶振 12MHZ 1
電阻 10k 1
按鈕 7
溫度傳感器 DS18B20 1
模數(shù)芯片 ADC0832 1
電位器 1k 2
電阻 1k 4
三極管 PNP 4
繼電器 5V 4
顯示器 LCD1602 1
排阻 10k 1
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (24.67 KB, 下載次數(shù): 54)
下載附件
2022-1-18 23:10 上傳
51hei截圖20210730034221.png (86.21 KB, 下載次數(shù): 46)
下載附件
2022-1-18 16:12 上傳
51hei截圖20210730034250.png (160.03 KB, 下載次數(shù): 41)
下載附件
2022-1-18 16:12 上傳
51hei截圖20210730034314.png (158.14 KB, 下載次數(shù): 55)
下載附件
2022-1-18 16:12 上傳
51hei截圖20210730034318.png (158.05 KB, 下載次數(shù): 60)
下載附件
2022-1-18 16:12 上傳
51hei截圖20210730034323.png (158.04 KB, 下載次數(shù): 54)
下載附件
2022-1-18 16:12 上傳
單片機(jī)源程序如下: - #include "reg51.h"
- #include "lcd1602.h"
- #include "Ds18b20.h"
- #include "ADC0832.h"
- #include"pid_pwm.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P3^2;//按鈕
- sbit k2=P3^3;
- sbit k3=P3^4;
- sbit k4=P3^5;
- sbit k5=P3^6;
- sbit k6=P3^7;
- sbit out1=P2^4;//輸出控制
- sbit out2=P2^5;
- sbit out3=P2^6;
- sbit out4=P2^7;
- uchar time=0,mode=0;//系統(tǒng)變量
- uchar wendu=0,ph=0,water=0;//溫度,pH值,水位
- uchar lim1=25,lim2=7,lim3=100;//閥值
- uchar disp1[]="T:000 P:00 H:000";
- uchar disp2[]=" 000 00 000";
- uchar pwm=0;
- //主函數(shù)
- void main()
- {
- uchar i=0;
- init_1602();
- TMOD|=0X01;
- TH0=0X3C;
- TL0=0XB0;
- ET0=1;//打開定時器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時器
- while(1)
- {
- //PWM輸出
- if(i<99)
- i++;
- else
- i=0;
- if(i<pwm)
- out4=0;
- else
- out4=1;
- //按鍵檢測
- if(!k1)
- {
- if(lim1<120)
- lim1++;
- while(!k1);
- }
- if(!k2)
- {
- if(lim1>0)
- lim1--;
- while(!k2);
- }
- if(!k3)
- {
- if(lim2<14)
- lim2++;
- while(!k3);
- }
- if(!k4)
- {
- if(lim2>0)
- lim2--;
- while(!k4);
- }
- if(!k5)
- {
- if(lim3<127)
- lim3++;
- while(!k5);
- }
- if(!k6)
- {
- if(lim3>0)
- lim3--;
- while(!k6);
- }
- }
- }
- //定時器中斷
- void Timer0() interrupt 1
- {
- uint i=0;
- if(time<10)//0.5s
- time++;
- else
- {
- time=0;
- Ds18b20ReadTemp();//測溫
- wendu=ds18b20_temp;
- ph=ADC(1);//PH
- i=ph;
- ph=i*14/127;
- water=ADC(2);//水位
- //顯示
- disp1[2]=wendu/100+0x30;
- disp1[3]=wendu%100/10+0x30;
- disp1[4]=wendu%10+0x30;
- disp1[8]=ph/10+0x30;
- disp1[9]=ph%10+0x30;
- disp1[13]=water/100+0x30;
- disp1[14]=water%100/10+0x30;
- disp1[15]=water%10+0x30;
- write_string(1,0,disp1);
- disp2[2]=lim1/100+0x30;
- disp2[3]=lim1%100/10+0x30;
- disp2[4]=lim1%10+0x30;
- disp2[8]=lim2/10+0x30;
- disp2[9]=lim2%10+0x30;
- disp2[13]=lim3/100+0x30;
- disp2[14]=lim3%100/10+0x30;
- disp2[15]=lim3%10+0x30;
- write_string(2,0,disp2);
- //PID控制
- pwm=PID(lim1,wendu);
- //PH值控制
- if(ph>lim2)
- out1=0;
- else
- out1=1;
- if(ph<lim2)
- out3=0;
- else
- out3=1;
- //水位控制
- if(water>lim3)
- out2=0;
- else
- out2=1;
- }
- TH0=0X3C;
- TL0=0XB0;
- }
復(fù)制代碼
51hei.png (4.14 KB, 下載次數(shù): 63)
下載附件
2022-1-18 23:11 上傳
所有資料51hei附件下載:
水箱控制(溫度,PH值,水位).rar
(1016.95 KB, 下載次數(shù): 153)
2022-1-18 18:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|