基于stc单片机温度控制的程序.docx

上传人:b****2 文档编号:23099319 上传时间:2023-04-30 格式:DOCX 页数:15 大小:17.24KB
下载 相关 举报
基于stc单片机温度控制的程序.docx_第1页
第1页 / 共15页
基于stc单片机温度控制的程序.docx_第2页
第2页 / 共15页
基于stc单片机温度控制的程序.docx_第3页
第3页 / 共15页
基于stc单片机温度控制的程序.docx_第4页
第4页 / 共15页
基于stc单片机温度控制的程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于stc单片机温度控制的程序.docx

《基于stc单片机温度控制的程序.docx》由会员分享,可在线阅读,更多相关《基于stc单片机温度控制的程序.docx(15页珍藏版)》请在冰豆网上搜索。

基于stc单片机温度控制的程序.docx

基于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模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1