当前位置:文档之家› 设计报告——温控电路设计

设计报告——温控电路设计

温控电路设计报告书姓名:学校:专业:完成日期:2014/05/16目录1.设计要求 (1)2.总体设计方案 (1)2.1原理分析 (1)2.2功能模块的实现 (1)2.2.1控制模块 (1)2.2.2温度采集模块 (1)3.控制程序设计 (2)3.1程序流程图 (2)3.2程序模块说明 (2)附录 (3)1.主函数 (3)2.ADS1115驱动程序 (6)3.原理图 (13)1.设计要求设计一个温度测量电路,根据设定温度和测量值比较实现以下控制:定义:设定温度:ST(单位℃)测量温度:T(单位℃)控制逻辑要求:当ST> T+2时,继电器闭合(如果当前继电器为断开状态,并且断开时间不够3分钟,不允许闭合);当ST<T-2时,继电器断开(如果当前继电器为闭合状态,并且闭合时间不够3分钟,不允许断开);T-2=<ST<=T+2,继电器保持。

2.总体设计方案2.1原理分析根据要求,使用负温度系数的热敏电阻进行温度的测量,使用ADC采集电压,通过单片机计算得到温度值,并依据相应控制逻辑要求控制继电器的动作。

2.2功能模块的实现2.2.1控制模块使用89C51单片机进行控制部分的设计,如图1为单片机最小系统原理图,89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS 的8位微处理器,具有廉价、使用简单等优点。

本设计中采用89C51单片机完全可以满足要求。

通过单片机根据采集到的数据,控制继电器的动作。

图12.2.2温度采集模块热敏电阻温度测量电路采用简单的电阻分压电路,通过AD采集电压变化,通过单片机计算得出温度值,如图2所示。

TI公司的ADS1115是超小型16位精密模数转换器(ADC),具有板载基准电压和振荡器,通过I2C兼容接口传输数据,工作电压从2.0V到5.5V,取样频率高达860SPS,连续模式的功耗仅为150uA,工作温度从–40℃到+140℃。

本设计中使用ADS1115采集电压,满足精度要求。

图23.控制程序设计3.1程序流程图流程图如图3所示,单片机按照该流程进行温度的采集与继电器的控制。

图33.2程序模块说明程序主要分为ADS1115的电压采集、温度值的计算、根据逻辑控制继电器动作三个部分。

附录1.主函数#include<reg52.h>#include"ads1115.h"#define ST 30.0 //设定温度sbit relay=P0^7; //继电器控制引脚float T; //当前温度int count=0; //定时计数bit en_relay=1; //继电器允许动作标志位//温度范围从0~50摄氏度code float table[]={28.38,27.13,25.94,24.81,23.74,22.72,21.75,20.83,19.95,19.12,18.32,17.57,16.85,16.16,15.5,14.88,14.28,13.71,13.17,12.65,12.16,11.69,11.24,10.81,10.39,10.0,9.623,9.263,8.918,8.588,8.272,7.97,7.68,7.402,7.136,6.881,6.637,6.402,6.177,5.961,5.754,5.556,5.365,5.182,5.006,4.837,4.674,4.518,4.368,4.224,4.085,0};void Judge(); //逻辑控制函数void delay(int); //延时函数int GetTemp(); //获取温度值///*******************************************//函数名称:main//功能:主函数//参数:无//返回值:无//********************************************void main(){TMOD=0x01; //定时器模式设置TH0=0x3C;TL0=0xB0;ET0=1;TR0=0; //定时停止EA=1;while(1){GetTemp();Judge();delay(100);}}///*******************************************//函数名称:Delay//功能:延时函数//参数:x 设置延时时间//返回值:无//********************************************void delay(int x){int i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}///*******************************************//函数名称:GetTemp//功能:获取电压值并换算成温度值//参数:无//返回值:-1:超出范围 1:在测量范围内//********************************************int GetTemp(){int i;float vol;float res;vol=ADS1115(0,1); //ADS1115的AIN1输入res=50.0/vol-10.0; //换算得到热敏电阻当前阻值if(res>28.38 || res<4.085)return -1;for(i=0;i<50;i++){if(res<=table[i] && res>table[i+1]) //查表并计算得到温度{T=i+(table[i]-res)/(table[i]-table[i+1]);}}return 1;}///*******************************************//函数名称:Judge//功能:按照要求实现逻辑控制//参数:无//返回值:无//******************************************** void Judge(){if(en_relay) //如果继电器允许工作{if(ST>T+2) //如果 ST>T+2{relay=0; //继电器闭合en_relay=0; //不允许继电器工作TR0=1; //开启3分钟定时}if(ST<T-2) //如果 ST<T-2{relay=0; //继电器打开en_relay=0; //不允许继电器工作TR0=1; //开启3分钟定时}//如果 T-2=<ST<=T+2,继电器保持}}///******************************************* //函数名称:定时器中断T0//功能:定时3分钟后允许继电器动作//参数:无//返回值:无//******************************************** void timer0() interrupt 1{TH0=0x3C;TL0=0xB0;count++;if(count==3600) //定时3分钟{count=0;en_relay=1; //允许继电器动作TR0=0; //关闭计时}}2.ADS1115驱动程序#ifndef __ADS1115_H__#define __ADS1115_H__sbit SCL = P1^0;sbit SDA = P1^1;#define TRUE 1#define FALSE 0/************POINTER REGISTER*****************/#define Pointer_0 0x00 //Convertion register#define Pointer_1 0x01 //Config register#define Pointer_2 0x02 //Lo_thresh register#define Pointer_3 0x03 //Hi_thresh register/************CONFIG REGISTER*****************/#define MUX_0 0x0000 //AINp=AIN0, AINn=AIN1#define MUX_1 0x1000 //AINp=AIN0, AINn=AIN3#define MUX_2 0x2000 //AINp=AIN1, AINn=AIN3#define MUX_3 0x3000 //AINp=AIN2, AINn=AIN3#define MUX_4 0x4000 //AINp=AIN0, AINn=GND#define MUX_5 0x5000 //AINp=AIN1, AINn=GND#define MUX_6 0x6000 //AINp=AIN2, AINn=GND#define MUX_7 0x7000 //AINp=AIN3, AINn=GND#define MODE_0 0x0000#define MODE_1 0x0100#define COMP_POL_0 0x0000#define COMP_POL_1 0x0008#define COMP_LAT_0 0x0000#define COMP_LAT_1 0x0040//*************ADDR Initial********************/#define ADDRESS 0x90 //ADDR PIN ->GND#define ADDRESS_W ADDRESS|0x00 //写地址#define ADDRESS_R ADDRESS|0x01 //读地址/*************Config Initial*********************/#define OS 0x8000#define MUX_A0 MUX_4 //AINp=AIN0, AINn=GND#define MUX_A1 MUX_5 //AINp=AIN1, AINn=GND#define MUX_A2 MUX_6 //AINp=AIN2, AINn=GND#define MUX_A3 MUX_7 //AINp=AIN3, AINn=GND#define MUX_A01 MUX_0 //AINp=AIN0, AINn=AIN1 即01通道差分输入#define MUX_A23 MUX_3 //AINp=AIN2, AINn=AIN3 即23通道差分输入#define PGA 0x0200 //#define MODE 0x0100 //Continuous conversion mode#define DR 0x00E0 //Data Rate = 860#define COMP_QUE 0x0003void Delay_us_15 (void);void Delay_ms_1 (void); //功能:延时void Start(void); //功能:完成IIC的起始条件操作void Stop(void); //功能:完成IIC的终止条件操作void ACK(void); //功能:完成IIC的主机应答操作void NACK(void); //功能:完成IIC的主机无应答操作unsigned char Check(void);//功能:检查从机的应答操作void Write_1_Byte(unsigned char DataByte);//写 1个字节unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n); //写 N个字节unsigned char Read_1_Byte(void);//读 1个字节void Read_N_Byte(unsigned int *readbuff,unsigned char n);//读 N个字节void InitADS1115(bit S_MUX_0, bit S_MUX_1);//ADS1115初始化void WriteWord(void);//写void ReadWord(void);//读unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1);//ADS1115取值#endif#include<reg52.h>#include<intrins.h>#include"ads1115.h"unsigned int Config;unsigned char Writebuff[4],Readbuff[3];unsigned int Result[2];int D_ADS; //转换的数字量void Delay_us_15 (void) /*延时程序*/{unsigned char i;for(i = 0;i < 15;i++)_nop_();}void Delay_ms_1 (void){unsigned char i;for(i = 150;i > 0;i--) _nop_();}///******************************************* //函数名称:Start//功能:完成IIC的起始条件操作//参数:无//返回值:无//********************************************/ void Start(void){SCL=1;SDA=1;Delay_us_15 ();SDA=0;Delay_us_15 ();SCL=0;Delay_us_15 ();}/////******************************************* //函数名称:Stop//功能:完成IIC的终止条件操作//参数:无//返回值:无//********************************************/ void Stop(void){SDA=0;Delay_us_15 ();SCL=1;Delay_us_15 ();SDA=1;Delay_us_15 ();}///******************************************* //函数名称:ACK//功能:完成IIC的主机应答操作//参数:无//返回值:无//********************************************/ void ACK(void){SDA=0;_nop_(); _nop_();SCL=1;Delay_us_15 ();SCL=0;_nop_(); _nop_();SDA=1;Delay_us_15 ();}//******************************************* //函数名称:NACK//功能:完成IIC的主机无应答操作//参数:无//返回值:无//********************************************/ void NACK(void){SDA=1;_nop_(); _nop_();SCL=1;Delay_us_15 ();SCL=0;_nop_(); _nop_();SDA=0;Delay_us_15 ();}//**********检查应答信号函数******************/ ///*如果返回值为1则证明有应答信号,反之没有*/ ///******************************************* //函数名称:Check//功能:检查从机的应答操作//参数:无//返回值:从机是否有应答:1--有,0--无//********************************************/ unsigned char Check(void){unsigned char slaveack;SDA=1;_nop_(); _nop_();SCL=1;_nop_(); _nop_();_nop_(); _nop_();// _nop_(); _nop_();slaveack = SDA; //读入SDA数值SCL=0;Delay_us_15 ();if(slaveack)return FALSE;elsereturn TRUE;}/***************Write a Byte****************/void Write_1_Byte(unsigned char DataByte){int i;for(i=0;i<8;i++){if(DataByte&0x80) //if((DataByte<<i)&0x80)SDA=1;elseSDA=0;Delay_us_15 ();SCL=1;Delay_us_15 ();SCL=0;Delay_us_15 ();DataByte <<= 1;}SDA=1;_nop_();}/***************Write N Byte****************/unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n){int i;for(i=0;i<n;i++){Write_1_Byte(*writebuffer);if(Check()){writebuffer ++;}else{Stop();return FALSE;}}Stop();return TRUE;}//***************Read a Byte****************/unsigned char Read_1_Byte(void){unsigned char data_Value = 0, FLAG, i;for(i=0;i<8;i++){SDA=1;Delay_us_15 ();SCL=1;Delay_us_15 ();FLAG=SDA;data_Value <<= 1;if( FLAG)data_Value |= 0x01;SCL=0;Delay_us_15 ();}return data_Value;}//***************Read N Byte****************/void Read_N_Byte(unsigned int*readbuff, unsigned char n) {unsigned char i;for(i=0;i<n;i++){readbuff[i]=Read_1_Byte();if(i==n-1)NACK(); //不连续读字节elseACK(); //连续读字节}Stop();}//*****************初始化******************/void InitADS1115(bit S_MUX_0, bit S_MUX_1){if (S_MUX_0 == 0 && S_MUX_1 == 0) //AIN0 Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;if (S_MUX_0 == 0 && S_MUX_1 == 1) //AIN1 Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;// if (S_MUX_0 == 1 && S_MUX_1 == 0) //AIN2// Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;// if (S_MUX_0 == 1 && S_MUX_1 == 1) //AIN3// Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;if (S_MUX_0 == 1 && S_MUX_1 == 0) //01通道差分输入Config = OS+MUX_A01+PGA+DR+COMP_QUE+MODE;if (S_MUX_0 == 1 && S_MUX_1 == 1) //23通道差分输入Config = OS+MUX_A23+PGA+DR+COMP_QUE+MODE;Writebuff[0]=ADDRESS_W;Writebuff[1]=Pointer_1;Writebuff[2]=Config/256;Writebuff[3]=Config%256;Readbuff[0]=ADDRESS_W;Readbuff[1]=Pointer_0;Readbuff[2]=ADDRESS_R;}//***************Write a Word***********************/void WriteWord(void){int t;Start(); //写入4个字节do{t=Write_N_Byte(Writebuff,4);}while(t==0);}//***************Read Word***********************/ void ReadWord(void){int t;Start(); //写入2个字节do{t=Write_N_Byte(Readbuff,2);}while(t==0);Start(); //写入2个字节do{t=Write_N_Byte(&Readbuff[2],1);}while(t==0);Read_N_Byte(Result,2); //读出2个字节}//***************ADS1115********************///参数说明 (S_MUX_0,S_MUX_0) (0,0) 0通道输入// (0,1) 1通道输入// (1,0) 01通道差分输入// (1,1) 23通道差分输入unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1){InitADS1115(S_MUX_0, S_MUX_1);WriteWord();Delay_ms_1();ReadWord();D_ADS=Result[0]*256+Result[1]; //转换的数字量return D_ADS;}3.原理图。

相关主题