32基于单片机和DS18B20的空调温控系统设计(硬件)
32基于单片机和DS18B20的空调温控系统设计(硬件),32,基于,单片机,以及,ds18b20,空调,温控,系统,设计,硬件
附录一 程序表/*/*卢涛的毕业设计 */*基于单片机和 DS1820 的空调温控系统设计程序 */ /*目标器件:AT89S51 */*晶振:11.0592MHZ */*编译环境:Keil 7.50A */*/*包含头文件*/#include #define uchar unsigned char#define uint unsigned int /*端口定义*/sbit DQ=P33; /数据传输线接单片机的相应的引脚sbit lcdrw = P21;sbit lcdep = P22;sbit right = P26;sbit lcdrs=P23;sbit lt=P15;sbit ut=P16;sbit sz=P17;/*定义全局变量*/uchar tempL=0; /临时变量低位uchar tempH=0; /临时变量高位float temperature; /温度值uchar code table=*TEMP*;uchar code table1= 00 C;uchar code table2=*SET TEMP*;int th,tl,num,a,set,k,sth,stl,ssth,sstl;int stemp,I,Pmax, Pmin;float deltaPn,delta,Pi,PsumCopy,PID1,PID2;float Kp,Kd,E_12,E_22,E_0,Emax;/*函数功能:延时子程序入口参数:k出口参数:*/void delay(unsigned int k) unsigned int n; n=0; while(n 480ms)DQ=1; /拉高数据线delay(14); /等待(1560ms) /*函数功能:向 DS18B20 读一字节数据入口参数:出口参数:dat*/ReadOneChar(void) unsigned char i=0; unsigned char dat=0;for (i=8;i0;i-) DQ=1;delay(1);DQ=0; dat=1;DQ=1;if(DQ)dat|=0x80;delay(4); return(dat);/*函数功能:向 DS18B20 写一字节数据入口参数:dat出口参数:*/WriteOneChar(unsigned char dat) unsigned char i=0; for(i=8;i0;i-) DQ=0; DQ=dat&0x01;delay(5);DQ=1;dat=1;delay(4);/*函数功能:向 DS18B20 读温度值入口参数:出口参数:temperature*/ReadTemperature(void) Init_DS18B20(); /初始化WriteOneChar(0xcc); /跳过读序列号的操作WriteOneChar(0x44); /启动温度转换delay(125); /转换需要一点时间,延时Init_DS18B20(); /初始化WriteOneChar(0xcc); /跳过读序列号的操作WriteOneChar(0xbe); /读温度寄存器(头两个值分别为温度的低位和高位)tempL=ReadOneChar(); /读出温度的低位 LSBtempH=ReadOneChar(); /读出温度的高位 MSB /温度转换,把高低位做相应的运算转化为实际温度temperature=(tempH*256)+tempL)*0.0625; delay(200);return(temperature);/*函数功能:独立按键扫描子程序入口参数:出口参数:*/void scan()sz=1;yw=1; if(sz=0)if(sz=1) /如果按了设置或确定键set=set; /跳出循环/*函数功能:1602 液晶显示设置温度子程序入口参数:出口参数:*/void displaystep(int k)write_com(0x0f); /光标闪烁write_com(0xc6+a);write_data(0x30+k);/*函数功能:液晶显示控制子程序入口参数:出口参数:*/void tr()if(a=0)th=k;displaystep(k);a+;if(a=1)tl=k;displaystep(k);a-;/*函数功能:矩阵键盘扫描子程序入口参数:出口参数:*/void keyscan(void)unsigned char n;/扫描第一行P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0)delay();P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0)switch(n)case(0xe0):k=3;tr();break;case(0xd0):k=2;tr();break;case(0xb0):k=1;tr();break;case(0x70):k=0;tr();break;/扫描第二行P1=0xfd;n=P1;n&=0xf0;if(n!=0xf0)delay();P1=0xfd;n=P1; n&=0xf0;if(n!=0xf0)switch(n)case(0xe0):k=7;tr();break;case(0xd0):k=6;tr();break;case(0xb0):k=5;tr();break;case(0x70):k=4;tr();break;/扫描第三行P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0)delay();P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0)switch(n)case(0xe0):k+;tr();break;case(0xd0):k-;tr();break;case(0xb0):k=9;tr();break;case(0x70):k=8;tr();break;if (sz=0)If(sz=1)set=!set; /如果按下了设置键,退出温度设置子程序/*函数功能:设置温度子程序入口参数:出口参数:*/void setemp()set=1;a=0;P1=0xff;write_com(0x80); /在第一行写标题for(num=0;num30)stemp=30;if(stempEmax) deltaPp=(float)Kp*(E_0-E_11); deltaPd=(float)Kd*(E_0-2*E_11+E_21);if(deltaPd=dPdmax) deltaPd=0; deltaPn=deltaPp+deltaPd; else if(abs(E_0)E0) deltaPi=(float)Ki*E_0*(Emax-abs(E_0)/(Emax-E0); else /小误差时的处理 deltaPi=(float)Ki*E_0; if(fabs(deltaPi)=dPdmax) deltaPd=0; deltaPn=deltaPp+deltaPi+deltaPd; if(fabs(deltaPn)dPmax) if(deltaPn0) deltaPn=dPmax; else deltaPn=-dPmax; Psum1+=deltaPn; PsumCopy=Psum1; if(PsumCopyPmax) PsumCopy=Pmax;if(PsumCopyEmax) deltaPn=(float)Kp*(E_0-E_12)+(float)Kd*(E_0-2*E_12+E_22); else if(abs(E_0)E0) deltaPi=(float)Ki*E_0*(Emax-abs(E_0)/(Emax-E0); else /小误差时的处理 deltaPi=(float)Ki*E_0; deltaPn=(float)Kp*(E_0-E_12)+deltaPi+(float)Kd*(E_0-2*E_12+E_22); if(fabs(deltaPn)dPmax) if(deltaPn0) deltaPn=dPmax;else deltaPn=-dPmax; Psum2+=deltaPn;PsumCopy=Psum2; if(PsumCopyPmax) PsumCopy=Pmax; if(PsumCopyPmin) PsumCopy=Pmin; E_22=E_12; E_12=E_0; return(PsumCopy);/*函数功能:PID 控制子程序入口参数:出口参数:*/void pidcontrol()PID1=PIDprocess1();PID2=PIDprocess2(); /根据具体的控制电路设计/*函数功能:主程序入口参数:出口参数:*/void main()sth=0;stl=0;stemp=25;set=0;P1=0xff;while(1)i=ReadTemperature(); /读取即时温度displaytemp(i); /显示即时温度keyscan1(); /扫描独立键盘if(set=1)keyscan(); /扫描矩阵键盘pidcontrol(); /PID 控制子程序附录二 硬件原理图
收藏