基于stc单片机温度控制的程序Word文档格式.docx

上传人:b****2 文档编号:3647606 上传时间:2023-05-02 格式:DOCX 页数:15 大小:17.24KB
下载 相关 举报
基于stc单片机温度控制的程序Word文档格式.docx_第1页
第1页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第2页
第2页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第3页
第3页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第4页
第4页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第5页
第5页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第6页
第6页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第7页
第7页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第8页
第8页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第9页
第9页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第10页
第10页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第11页
第11页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第12页
第12页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第13页
第13页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第14页
第14页 / 共15页
基于stc单片机温度控制的程序Word文档格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于stc单片机温度控制的程序Word文档格式.docx

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

基于stc单片机温度控制的程序Word文档格式.docx

//===============================================

voidDelay(uintx)//延时程序

{unsignedi;

x=x*5/4;

for(i=0;

i<

x;

i++);

}

ucharInitDS18B20()//初始化

{

ucharstatus;

DS=1;

Delay(8);

DS=0;

Delay(500);

DS=1;

Delay(100);

status=DS;

returnstatus;

//=================================================

voidWriteByte(uintdat)//单字节写入

uchari;

for(i=0;

8;

i++)

{

DS=0;

_nop_();

Delay(10);

DS=dat&

0x01;

Delay(40);

//delay45uS//5

DS=1;

dat>

>

=1;

}

//==================================================

ucharReadByte(void)//读取单字节

uchardat=0,i;

_nop_();

DS=0;

DS=1;

if(DS)dat|=0x80;

Delay(45);

returndat;

ucharreadtemperature()

if(InitDS18B20()==1)

ds18b20isok=0;

else

WriteByte(0xCC);

WriteByte(0x44);

InitDS18B20();

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;

10;

for(j=0;

j<

33;

j++);

延时若干毫秒

入口参数:

n

voiddelaynms(unsignedintn)

unsignedinti;

n;

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;

TR1=1;

//启动定时器T1

TH0=0xF5;

TL0=0x78;

TR0=1;

//启动定时器T0

readtemperature();

//Delay(9000);

while

(1)

//unsignedchari;

//得到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;

//给定值大于测量值时

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)

Delay(3000);

ss1=0;

Delay(2000);

50&

=100)

Delay(1000);

Delay(100);

elseif(Error>

10&

=50)

Delay(500);

5&

=10)

{ss1=0;

elseif(GivenTemper<

measure)//给定值低ccap1制冷

{Error=measure-GivenTemper;

ss1=0;

ss2=1;

}

Delay(50);

{ss1=0;

Delay(10);

}}

/*measure=pp1;

//测量温度

//Error=GivenTemper-measure;

//给定值大于测量值时

if(GivenTemper>

Error=GivenTemper-measure;

//给定值小于测量值时

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转换结果寄存器

//PWM初始化

//voidInitPWM()

//CMOD=0x84;

//CPS1CPS0=00,FOSC/12是PCA/PWMCLOCK94

//CCON=0x00;

//CL=0x00;

//PCA计数器

//CH=0x00;

//CCAP0L=0x80;

//SettheinitialvaluesameasCCAPOH预置初值加热

//CCAP0H=0x80;

//50%的占空比

//CCAPM0=0x42;

//01000010SetupPCAmodule0in8bitpwm,P1.3输出

///////////////另一路pwm

//CCAP1L=0x80;

//SettheinitialvaluesameasCCAPOH预置初值制冷

//CCAP1H=0x80;

//CCAPM1=0x42;

//p1.4输出

/////////////////

//CR=1;

//启动PCA/PWM定时器

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2