自动控制鱼缸电路图

  • 格式:doc
  • 大小:621.50 KB
  • 文档页数:20

附录1.电路图2.程序代码#include <reg52.h>#include "delay.h"#include "ds18b20.h" #include "LCD1602.h" #include "ds1302.h"sfr T2MOD = 0xC9;sbit Heat = P0^4;sbit IN1=P0^3;sbit IN2=P3^5;sbit IN3=P3^6;sbit IN4=P3^7;sbit LED1=P3^2;sbit LED2=P3^3;//水温控制相关参量int tempval = 0;float tmp_new=0;float tmp_old=0;uchar tmp_set1 = 30;uchar tmp_set2 = 35;float tmp_set = 50;float Ctrl_P = 0.8;float PWM = 0;float cnt=0;//喂食、光照、氧循环相关参量uint FeedInterval=30;//喂食间隔时间uint FeedTime=10;//喂食时间uint OxygenInterval=30;uint OxygenTime=10;uint LightInterval=30;uint LightTime=10;uint FeedInterval_cnt;uint FeedTime_cnt;uint OxygenInterval_cnt;uint OxygenTime_cnt;uint LightInterval_cnt;uint LightTime_cnt;uchar Time_cnt=0;//设定参数相关变量uchar SetTimeFlg=0;uchar SetTempFlg=0;uchar SetFeedFlg=0;uchar SetOxygenFlg=0;uchar SetLightFlg=0;uchar FeedFlg=0;uchar OxygenFlg=0;uchar LightFlg=0;uchar data_zancun=0;uchar TestNum=0;void Init_timer(void){RCAP2H=(65536-38400)/256;RCAP2L=(65536-38400)%256;TH2=RCAP2H;TL2=RCAP2L;T2CON=0;T2MOD=0;ET2=1;TR2=1;EA=1;}void Zhengzhuan(void){uchar i;for(i=0;i<128;i++){IN1=0;IN2=1;IN3=1;IN4=1;delay1ms(1);IN1=0;IN2=0;IN3=1;IN4=1;delay1ms(1);IN1=1;IN2=0;IN3=1;IN4=1;delay1ms(1);IN1=1;IN2=0;IN3=0;IN4=1;delay1ms(1);IN1=1;IN2=1;IN3=0;IN4=1;delay1ms(1);IN1=1;IN2=1;IN3=0;IN4=0;delay1ms(1);IN1=1;IN2=1;IN3=1;IN4=0;delay1ms(1);IN1=0;IN2=1;IN3=1;IN4=0;delay1ms(1);}}void Fanzhuan(void){uchar i;for(i=0;i<128;i++){IN1=0;IN2=1;IN3=1;IN4=0;delay1ms(1);IN1=1;IN2=1;IN3=1;IN4=0;delay1ms(1);IN1=1;IN2=1;IN3=0;IN4=0;delay1ms(1);IN1=1;IN2=1;IN3=0;IN4=1;delay1ms(1);IN1=1;IN2=0;IN3=0;IN4=1;delay1ms(1);IN1=1;IN2=0;IN3=1;IN4=1;delay1ms(1);IN1=0;IN2=0;IN3=1;IN4=1;delay1ms(1);IN1=0;IN2=1;IN3=1;IN4=1;delay1ms(1);}}void PageClear(void){uchar i;write_com(0x80);for(i=0;i<16;i++)write_data(' ');write_com(0xc0);for(i=0;i<16;i++)write_data(' ');}void KeyScan(void){uchar temp;P2 = 0xfe;temp = P2;temp = temp&0xf0;if(temp != 0xf0){delay1ms(10);temp = P2;temp = temp&0xf0;if(temp != 0xf0){switch(temp){case 0xe0:{//TestNum=0;data_zancun=0;PageClear();SetLightFlg=0;SetFeedFlg=0;SetTempFlg=0;SetOxygenFlg=0;SetTimeFlg++;if(SetTimeFlg==7)SetTimeFlg=1;}break;//时间case 0xd0:{TestNum=7;data_zancun++;if(data_zancun==3)data_zancun=1;}break;//数字键7case 0xb0:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=4;}break;//数字键4case 0x70:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=1;}break;//数字键1 }while(temp != 0xf0){temp = P2;temp = temp&0xf0;}}}P2 = 0xfd;temp = P2;temp = temp&0xf0;if(temp != 0xf0){delay1ms(10);temp = P2;temp = temp&0xf0;if(temp != 0xf0){switch(temp){case 0xe0:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=0;}break;//数字键0case 0xd0:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=8;}break;//数字键8case 0xb0:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=5;}break;//数字键5case 0x70:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=2;}break;//数字键2 }while(temp != 0xf0){temp = P2;temp = temp&0xf0;}}}P2 = 0xfb;temp = P2;temp = temp&0xf0;if(temp != 0xf0){delay1ms(10);temp = P2;temp = temp&0xf0;if(temp != 0xf0){switch(temp){case 0xe0:{//TestNum=8;PageClear();SetTempFlg=0;SetLightFlg=0;SetOxygenFlg=0;SetFeedFlg=0;if(SetTimeFlg!=0){ds1302set();SetTimeFlg=0;}data_zancun=0;}break;//确定键case 0xd0:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=9;}break;//数字键9case 0xb0:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=6;}break;//数字键6case 0x70:{data_zancun++;if(data_zancun==3)data_zancun=1;TestNum=3;}break;//数字键3 }while(temp != 0xf0){temp = P2;temp = temp&0xf0;}}}P2 = 0xf7;temp = P2;temp = temp&0xf0;if(temp != 0xf0){delay1ms(10);temp = P2;temp = temp&0xf0;if(temp != 0xf0){switch(temp){case 0xe0:{//TestNum=12;data_zancun=0;PageClear();SetLightFlg=0;SetFeedFlg=0;SetTempFlg=0;SetTimeFlg=0;SetOxygenFlg++;if(SetOxygenFlg==3)SetOxygenFlg=1;}break;//氧气case 0xd0:{//TestNum=13;data_zancun=0;PageClear();SetFeedFlg=0;SetTempFlg=0;SetTimeFlg=0;SetOxygenFlg=0;SetLightFlg++;if(SetLightFlg==3)SetLightFlg=1;}break; //照明case 0xb0:{//TestNum=14;data_zancun=0;PageClear();SetLightFlg=0;SetTempFlg=0;SetTimeFlg=0;SetOxygenFlg=0;SetFeedFlg++;if(SetFeedFlg==3)SetFeedFlg=1;}break; //喂食case 0x70:{data_zancun=0;PageClear();SetLightFlg=0;SetFeedFlg=0;SetTimeFlg=0;SetOxygenFlg=0;SetTempFlg++;if(SetTempFlg==3)SetTempFlg=1;}break;//温度}while(temp != 0xf0){temp = P2;temp = temp&0xf0;}}}if(SetTimeFlg){switch(SetTimeFlg){case 1:{if(data_zancun==1){time_date[6]&=0x0f;time_date[6]|=TestNum<<4; }else if(data_zancun==2){time_date[6]&=0xf0;time_date[6]|=TestNum;} }break;case 2:{if(data_zancun==1){time_date[4]&=0x0f;time_date[4]|=TestNum<<4; }else if(data_zancun==2){time_date[4]&=0xf0;time_date[4]|=TestNum;} }break;case 3:{if(data_zancun==1){time_date[3]&=0x0f;time_date[3]|=TestNum<<4; }else if(data_zancun==2){time_date[3]&=0xf0;time_date[3]|=TestNum;} }break;case 4:{if(data_zancun==1){time_date[2]&=0x0f;time_date[2]|=TestNum<<4; }else if(data_zancun==2){time_date[2]&=0xf0;time_date[2]|=TestNum;} }break;case 5:{if(data_zancun==1){time_date[1]&=0x0f;time_date[1]|=TestNum<<4;}else if(data_zancun==2){time_date[1]&=0xf0;time_date[1]|=TestNum;} }break;case 6:{if(data_zancun==1){time_date[0]&=0x0f;time_date[0]|=TestNum<<4;}else if(data_zancun==2){time_date[0]&=0xf0;time_date[0]|=TestNum;} }break;}}else if(SetTempFlg){switch(SetTempFlg){case 1:{if(data_zancun==1){tmp_set2=TestNum*10+tmp_set2%10;}else if(data_zancun==2){tmp_set2=TestNum+10*(tmp_set2/10);} }break;case 2:{if(data_zancun==1){tmp_set1=TestNum*10+tmp_set1%10;else if(data_zancun==2){tmp_set1=TestNum+10*(tmp_set1/10);} }break;}}else if(SetFeedFlg){switch(SetFeedFlg){case 1:{if(data_zancun==1){FeedInterval=TestNum*10+FeedInterval%10;}else if(data_zancun==2){FeedInterval=TestNum+10*(FeedInterval/10);} }break;case 2:{if(data_zancun==1){FeedTime=TestNum*10+FeedTime%10;}else if(data_zancun==2){FeedTime=TestNum+10*(FeedTime/10);} }break;}}else if(SetLightFlg){switch(SetLightFlg){case 1:{if(data_zancun==1){LightInterval=TestNum*10+LightInterval%10;}else if(data_zancun==2){LightInterval=TestNum+10*(LightInterval/10);case 2:{if(data_zancun==1){LightTime=TestNum*10+LightTime%10;}else if(data_zancun==2){LightTime=TestNum+10*(LightTime/10);} }break;}}else if(SetOxygenFlg){switch(SetOxygenFlg){case 1:{if(data_zancun==1){OxygenInterval=TestNum*10+OxygenInterval%10;}else if(data_zancun==2){OxygenInterval=TestNum+10*(OxygenInterval/10);} }break;case 2:{if(data_zancun==1){OxygenTime=TestNum*10+OxygenTime%10;}else if(data_zancun==2){OxygenTime=TestNum+10*(OxygenTime/10);} }break;}}}void MainPage(void)//主界面{uchar i;tmp_set = (float)(tmp_set1+tmp_set2)/2.0;tmp_set += 1.0;TR0=0;tempval = 0;ds1302get();//读取当前时间TR2=0;for(i=0;i<5;i++){sendChangeCmd();tempval += getTmpValue()/5.0;}TR2=1;tmp_new = (float)tempval/100.0;if(tmp_new-tmp_old>0.1)Ctrl_P = 0.5;else Ctrl_P = 0.65;if(tmp_set-tmp_new>=3){PWM = 1;}else if(tmp_set>tmp_new){PWM = Ctrl_P*(tmp_set-tmp_new)/3.0;}else PWM = 0;tmp_old = tmp_new;TR0=1;write_com(0x8b);write_data(tempval/1000+'0');write_data(tempval%1000/100+'0');write_data('.');write_data(tempval%100/10+'0');write_data(tempval%10+'0');write_com(0xc0);write_data('0'+((time_date[2]&0xf0)>>4)); //显示时write_data('0'+(time_date[2]&0x0f));write_data(':');write_data('0'+((time_date[1]&0xf0)>>4)); //显示分write_data('0'+(time_date[1]&0x0f));write_data(':');write_data('0'+((time_date[0]>>4)&0x0f)); //显示秒write_data('0'+((time_date[0]&0x0f)));write_data(' ');if(LightFlg)write_string("ON ");elsewrite_string("OFF");write_data(' ');if(OxygenFlg)write_string("ON ");elsewrite_string("OFF");write_com(0x80);write_data(0x32);write_data(0x30);write_data('0'+((time_date[6]>>4)&0x0f)); //显示年write_data('0'+((time_date[6]&0x0f)));write_data('/');write_data('0'+((time_date[4]>>4)&0x0f)); //显示月write_data('0'+((time_date[4]&0x0f)));write_data('/');write_data('0'+((time_date[3]>>4)&0x0f)); //显示日write_data('0'+((time_date[3]&0x0f)));}void TimePage(void)//时间界面{write_com(0xc0);write_data('0'+((time_date[2]&0xf0)>>4)); //显示时write_data('0'+(time_date[2]&0x0f));write_data(':');write_data('0'+((time_date[1]&0xf0)>>4)); //显示分write_data('0'+(time_date[1]&0x0f));write_data(':');write_data('0'+((time_date[0]>>4)&0x0f)); //显示秒write_data('0'+((time_date[0]&0x0f)));//write_data(' ');//if()write_com(0x80);write_data(0x32);write_data(0x30);write_data('0'+((time_date[6]>>4)&0x0f)); //显示年write_data('0'+((time_date[6]&0x0f)));write_data('/');write_data('0'+((time_date[4]>>4)&0x0f)); //显示月write_data('0'+((time_date[4]&0x0f)));write_data('/');write_data('0'+((time_date[3]>>4)&0x0f)); //显示日write_data('0'+((time_date[3]&0x0f)));}void TempPage(void)//温度界面{write_com(0x80);write_string("TempHigh:");write_data(tmp_set2/10+'0');write_data(tmp_set2%10+'0');write_com(0xc0);write_string("TempLow:");write_data(tmp_set1/10+'0');write_data(tmp_set1%10+'0');}void LightPage(void)//照明界面{write_com(0x80);write_string("Time lag:");write_data(LightInterval/10+'0');write_data(LightInterval%10+'0');write_com(0xc0);write_string("Time:");write_data(LightTime/10+'0');write_data(LightTime%10+'0');}void OxygenPage(void)//氧循环界面{write_com(0x80);write_string("Time lag:");write_data(OxygenInterval/10+'0');write_data(OxygenInterval%10+'0');write_com(0xc0);write_string("Time:");write_data(OxygenTime/10+'0');write_data(OxygenTime%10+'0');}void FeedPage(void)//喂食界面{write_com(0x80);write_string("Time lag:");write_data(FeedInterval/10+'0');write_data(FeedInterval%10+'0');write_com(0xc0);write_string("Time:");write_data(FeedTime/10+'0');write_data(FeedTime%10+'0');}void main(void){LCD_init();ds1302init();ds1302set();Init_timer();Heat=0;while(1){KeyScan();if((SetTimeFlg||SetTempFlg||SetFeedFlg||SetOxygenFlg||SetLightFlg)==0){MainPage();EA=1;}else if(SetTimeFlg){TimePage();EA=0;Heat=0;}else if(SetTempFlg){TempPage();EA=0;Heat=0;}else if(SetFeedFlg){FeedPage();EA=0;Heat=0;}else if(SetOxygenFlg)OxygenPage();EA=0;Heat=0;}else if(SetLightFlg){LightPage();EA=0;Heat=0;}// write_com(0xce);// write_data(TestNum/10+'0');// write_data(TestNum%10+'0');}}void timer2(void) interrupt 5{TF2=0;EA=0;Time_cnt++;if(Time_cnt==20){if(FeedInterval_cnt==FeedInterval){if(!FeedTime_cnt){Zhengzhuan();FeedFlg=1;}FeedTime_cnt++;if(FeedTime_cnt==FeedTime){FeedTime_cnt=0;Fanzhuan();FeedFlg=0;FeedInterval_cnt=0;}}else{FeedInterval_cnt++;if(LightInterval_cnt==LightInterval){if(!LightTime_cnt){LED1=0;LightFlg=1;}LightTime_cnt++;if(LightTime_cnt==LightTime){LightTime_cnt=0;LED1=1;LightFlg=0;LightInterval_cnt=0;}}else{LightInterval_cnt++;}if(OxygenInterval_cnt==OxygenInterval){if(!OxygenTime_cnt){LED2=0;OxygenFlg=1;}OxygenTime_cnt++;if(OxygenTime_cnt==OxygenTime){OxygenTime_cnt=0;LED2=1;OxygenFlg=0;OxygenInterval_cnt=0;}}else{OxygenInterval_cnt++;}Time_cnt=0;}cnt=cnt+1;;if(cnt>=250)cnt=0;else if(cnt<(PWM*250))Heat=1;elseHeat=0;EA=1;}。