基于stc单片机温度控制的程序.docx
- 文档编号:1939270
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:15
- 大小:17.24KB
基于stc单片机温度控制的程序.docx
《基于stc单片机温度控制的程序.docx》由会员分享,可在线阅读,更多相关《基于stc单片机温度控制的程序.docx(15页珍藏版)》请在冰点文库上搜索。
基于stc单片机温度控制的程序
#include
#include
#include
#include
unsignedintpp1;
unsignedintj=0;
unsignedintReceiveData;//计算机向单片机发送的数据
unsignedintADdat2;
unsignedcharcH;
unsignedcharcL;
unsignedcharINPUT_ZH;
unsignedcharINPUT_X;
unsignedintGivenTemper,measure,Error;
floatpp;
sbitDS=P2^4;
sbitss1=P2^0;
sbitss2=P2^1;
#defineucharunsignedchar
#defineuintunsignedint
ucharTemp_Value[]={0x00,0x00};
voiddelay(unsignedinti);
uchara,b,c;
floattt;
unsignedinttemp;
/*************************此部分为18B20的驱动程序*************************************/
bitds18b20isok=1;
//===============================================
voidDelay(uintx)//延时程序
{unsignedi;
x=x*5/4;
for(i=0;i } //=============================================== ucharInitDS18B20()//初始化 { ucharstatus; DS=1;Delay(8);DS=0;Delay(500);DS=1;Delay(100); status=DS;Delay(100); DS=1; returnstatus; } //================================================= voidWriteByte(uintdat)//单字节写入 { uchari; for(i=0;i<8;i++) { DS=0; _nop_(); Delay(10); DS=dat&0x01; Delay(40);//delay45uS//5 DS=1; dat>>=1; } } //================================================== ucharReadByte(void)//读取单字节 { uchardat=0,i; DS=1; _nop_(); for(i=0;i<8;i++) { DS=0; _nop_(); dat>>=1; DS=1; _nop_(); _nop_(); if(DS)dat|=0x80; Delay(45); DS=1; } returndat; } ucharreadtemperature() { if(InitDS18B20()==1) ds18b20isok=0; else { WriteByte(0xCC); WriteByte(0x44); InitDS18B20(); WriteByte(0xCC); WriteByte(0xBE); Temp_Value[0]=ReadByte(); Temp_Value[1]=ReadByte(); a=Temp_Value[0];//读取到的第一个字节为温度LSB b=Temp_Value[1]; ds18b20isok=1; } } /***************************************************** 函数功能: 延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ voiddelay1ms() { unsignedinti,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } /***************************************************** 函数功能: 延时若干毫秒 入口参数: n ***************************************************/ voiddelaynms(unsignedintn) { unsignedinti; for(i=0;i delay1ms(); } /********************************************************* 函数功能: 单片机向计算机发送数据 *********************************************************/ voidsend(unsignedintsend_data) { SBUF=send_data; while(TI==0); TI=0; } /******************************************************** 函数功能: 串口中断函数单片机通过中断接收计算机发送数据 ********************************************************/ voidUART_SER(void)interrupt4//串行中断服务程序 { if(RI)//判断是接收中断产生 { RI=0;//标志位清零 ReceiveData=SBUF;//读入缓冲区的值 } } voidmain(void) { IE=0x90;//EnableADCinterruptandOpenmasterinterruptswitch,允许T1,T0中断 TMOD=0x22;//定时器T1工作于方式2,带自动重装功能的8位计数器,最大计数值为256 SCON=0x50;//SCON=01010000B,串口工作方式1,允许接收(REN=1) PCON=0x00;//PCON=00000000B,波特率9600 TH1=0xfa;//根据规定给定时器T1赋初值 TL1=0xfa;//根据规定给定时器T1赋初值 TR1=1;//启动定时器T1 TH0=0xF5;//根据规定给定时器T1赋初值 TL0=0x78;//根据规定给定时器T1赋初值 TR0=1;//启动定时器T0 readtemperature(); //Delay(9000); while (1) { //unsignedchari; readtemperature(); //得到AD的输入温度值 //ADget_Z=ADget/10;十位 //ADget_X=ADget%10;个位 //ADget_Z=ADget_Z*1000; //if(ds18b20isok) //pp=100; //else //{ //pp=200; //}; temp=b;//先把高八位有效数据赋于temp temp<<=8;//把以上8位数据从temp低八位移到高八位 temp=temp|a;//两字节合成一个整型变量 tt=temp*0.0625;//得到真实十进制温度值 //因为DS18B20可以精确到0.0625度 //所以读回数据的最低位代表的是0.0625度 temp=tt*10+0.5;//放大十倍 pp=temp*10; pp1=floor(pp); cH=(pp1-pp1%256)/256; cL=pp1%256; send(cH); send(cL); //if(j==1) //{ //INPUT_ZH=ReceiveData; //} //elseif(j==2) //{ //INPUT_X=ReceiveData; //j=0; //} //GivenTemper=(INPUT_ZH*256+INPUT_X)/100;//温度扩大10,给定温度 GivenTemper=ReceiveData*100;//Temperature; //pp1=floor(pp*100); //cH=(pp1-pp1%256)/256; //cL=pp1%256; //send(cH); //send(cL); //delaynms(1000); measure=pp; //ss1=0; //ss2=1; //ss1=0; //ss2=1;//GivenTemper=(INPUT_ZH*256+INPUT_X)/100;//温度扩大10,给定温度 //给定值大于测量值时 if(GivenTemper>measure)//给定值高ccap0加热 {Error=GivenTemper-measure; //CCAP1L=0; //CCAP1H=0; //if(Error>0) if(Error>300) { ss1=1; ss2=0; } elseif(Error>100&&Error<=300) { ss1=1; ss2=0; Delay(3000); ss1=0; ss2=0; Delay(2000); } elseif(Error>50&&Error<=100) { ss1=1; ss2=0; Delay(1000); ss1=0; ss2=0; Delay(100); } elseif(Error>10&&Error<=50) { ss1=1; ss2=0; Delay(500); ss1=0; ss2=0; Delay(500); } elseif(Error>5&&Error<=10) { ss1=1; ss2=0; Delay(100); ss1=0; ss2=0; Delay(100); } else {ss1=0; ss2=0;} } elseif(GivenTemper {Error=measure-GivenTemper; //if(Error>0) if(Error>300) { ss1=0; ss2=1; } elseif(Error>100&&Error<=300) { ss1=0; ss2=0; Delay(50); ss1=0; ss2=1; Delay(100); } elseif(Error>50&&Error<=100) { ss1=0; ss2=0; Delay(100); ss1=0; ss2=1; Delay(100); } elseif(Error>10&&Error<=50) { ss1=0; ss2=0; Delay(100); ss1=0; ss2=1; Delay(1000); } elseif(Error>5&&Error<=10) {ss1=0; ss2=1; Delay(1000); ss1=0; ss2=0; Delay(10);} else { ss1=0; ss2=0; } } }} /*measure=pp1;//测量温度 //Error=GivenTemper-measure; //给定值大于测量值时 if(GivenTemper>measure)//给定值高ccap0加热 { Error=GivenTemper-measure; } //给定值小于测量值时 elseif(GivenTemper { Error=measure-GivenTemper; delaynms(10000); } } } //增量式PID算法(需要控制的不是控制量的绝对值,而是控制量的增量) /********************************************************* 函数功能: AD采样 /*********************************************************/ //unsignedintADCRESULT() //{ //ADC_RES=500; //ADdat2=(ADC_RES<<2)+ADC_RESL;//10位转换结果 //pp=(ADdat2/1024)*5;//pp1=((long)ADdat2*1500)/358;//得到温度 //ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START; //returnpp; //} /******************************************************** 函数功能: 完成函数的初始化功能(A/D采样会用到) ********************************************************/ //voidInitADC() //{ //P1ASF=0xf7;//SetallP1asanaloginputport将所有的P1口定义为模拟输入端口 //ADC_RES=0;//Clearpreviousresult清除上一个结果.ADC_RES为A/D转换结果寄存器 //ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START; //} //PWM初始化 //voidInitPWM() //{ //CMOD=0x84;//CPS1CPS0=00,FOSC/12是PCA/PWMCLOCK94 //CCON=0x00; //CL=0x00;//PCA计数器 //CH=0x00;//PCA计数器 //CCAP0L=0x80;//SettheinitialvaluesameasCCAPOH预置初值加热 //CCAP0H=0x80;//50%的占空比 //CCAPM0=0x42;//01000010SetupPCAmodule0in8bitpwm,P1.3输出 ///////////////另一路pwm //CCAP1L=0x80;//SettheinitialvaluesameasCCAPOH预置初值制冷 //CCAP1H=0x80;//50%的占空比 //CCAPM1=0x42;//p1.4输出 ///////////////// //CR=1;//启动PCA/PWM定时器 //}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 stc 单片机 温度 控制 程序