设计报告温控电路设计.docx
- 文档编号:25042746
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:21
- 大小:51.79KB
设计报告温控电路设计.docx
《设计报告温控电路设计.docx》由会员分享,可在线阅读,更多相关《设计报告温控电路设计.docx(21页珍藏版)》请在冰豆网上搜索。
设计报告温控电路设计
温控电路设计
报告书
姓名:
学校:
专业:
完成日期:
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= 2.总体设计方案 2.1原理分析 根据要求,使用负温度系数的热敏电阻进行温度的测量,使用ADC采集电压,通过单片机计算得到温度值,并依据相应控制逻辑要求控制继电器的动作。 2.2功能模块的实现 2.2.1控制模块 使用89C51单片机进行控制部分的设计,如图1为单片机最小系统原理图,89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS的8位微处理器,具有廉价、使用简单等优点。 本设计中采用89C51单片机完全可以满足要求。 通过单片机根据采集到的数据,控制继电器的动作。 图1 2.2.2温度采集模块 热敏电阻温度测量电路采用简单的电阻分压电路,通过AD采集电压变化,通过单片机计算得出温度值,如图2所示。 TI公司的ADS1115是超小型16位精密模数转换器(ADC),具有板载基准电压和振荡器,通过I2C兼容接口传输数据,工作电压从2.0V到5.5V,取样频率高达860SPS,连续模式的功耗仅为150uA,工作温度从–40℃ 到+140℃。 本设计中使用ADS1115采集电压,满足精度要求。 图2 3.控制程序设计 3.1程序流程图 流程图如图3所示,单片机按照该流程进行温度的采集与继电器的控制。 图3 3.2程序模块说明 程序主要分为ADS1115的电压采集、温度值的计算、根据逻辑控制继电器动作三个部分。 附录 1.主函数 #include #include"ads1115.h" #defineST30.0//设定温度 sbitrelay=P0^7;//继电器控制引脚 floatT;//当前温度 intcount=0;//定时计数 biten_relay=1;//继电器允许动作标志位 //温度范围从0~50摄氏度 codefloattable[]={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}; voidJudge();//逻辑控制函数 voiddelay(int);//延时函数 intGetTemp();//获取温度值 ///******************************************* //函数名称: main //功能: 主函数 //参数: 无 //返回值: 无 //******************************************** voidmain() { TMOD=0x01;//定时器模式设置 TH0=0x3C; TL0=0xB0; ET0=1; TR0=0;//定时停止 EA=1; while (1) { GetTemp(); Judge(); delay(100); } } ///******************************************* //函数名称: Delay //功能: 延时函数 //参数: x设置延时时间 //返回值: 无 //******************************************** voiddelay(intx) { inti,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } ///******************************************* //函数名称: GetTemp //功能: 获取电压值并换算成温度值 //参数: 无 //返回值: -1: 超出范围1: 在测量范围内 //******************************************** intGetTemp() { inti; floatvol; floatres; 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]); } } return1; } ///******************************************* //函数名称: Judge //功能: 按照要求实现逻辑控制 //参数: 无 //返回值: 无 //******************************************** voidJudge() { if(en_relay)//如果继电器允许工作 { if(ST>T+2)//如果ST>T+2 { relay=0;//继电器闭合 en_relay=0;//不允许继电器工作 TR0=1;//开启3分钟定时 } if(ST { relay=0;//继电器打开 en_relay=0;//不允许继电器工作 TR0=1;//开启3分钟定时 } //如果T-2= } } ///******************************************* //函数名称: 定时器中断T0 //功能: 定时3分钟后允许继电器动作 //参数: 无 //返回值: 无 //******************************************** voidtimer0()interrupt1 { TH0=0x3C; TL0=0xB0; count++; if(count==3600)//定时3分钟 { count=0; en_relay=1;//允许继电器动作 TR0=0;//关闭计时 } } 2.ADS1115驱动程序 #ifndef__ADS1115_H__ #define__ADS1115_H__ sbitSCL=P1^0; sbitSDA=P1^1; #defineTRUE1 #defineFALSE0 /************POINTERREGISTER*****************/ #definePointer_00x00//Convertionregister #definePointer_10x01//Configregister #definePointer_20x02//Lo_threshregister #definePointer_30x03//Hi_threshregister /************CONFIGREGISTER*****************/ #defineMUX_00x0000//AINp=AIN0,AINn=AIN1 #defineMUX_10x1000//AINp=AIN0,AINn=AIN3 #defineMUX_20x2000//AINp=AIN1,AINn=AIN3 #defineMUX_30x3000//AINp=AIN2,AINn=AIN3 #defineMUX_40x4000//AINp=AIN0,AINn=GND #defineMUX_50x5000//AINp=AIN1,AINn=GND #defineMUX_60x6000//AINp=AIN2,AINn=GND #defineMUX_70x7000//AINp=AIN3,AINn=GND #defineMODE_00x0000 #defineMODE_10x0100 #defineCOMP_POL_00x0000 #defineCOMP_POL_10x0008 #defineCOMP_LAT_00x0000 #defineCOMP_LAT_10x0040 //*************ADDRInitial********************/ #defineADDRESS0x90//ADDRPIN->GND #defineADDRESS_WADDRESS|0x00//写地址 #defineADDRESS_RADDRESS|0x01//读地址 /*************ConfigInitial*********************/ #defineOS0x8000 #defineMUX_A0MUX_4//AINp=AIN0,AINn=GND #defineMUX_A1MUX_5//AINp=AIN1,AINn=GND #defineMUX_A2MUX_6//AINp=AIN2,AINn=GND #defineMUX_A3MUX_7//AINp=AIN3,AINn=GND #defineMUX_A01MUX_0//AINp=AIN0,AINn=AIN1即01通道差分输入 #defineMUX_A23MUX_3//AINp=AIN2,AINn=AIN3即23通道差分输入 #definePGA0x0200// #defineMODE0x0100//Continuousconversionmode #defineDR0x00E0//DataRate=860 #defineCOMP_QUE0x0003 voidDelay_us_15(void); voidDelay_ms_1(void);//功能: 延时 voidStart(void);//功能: 完成IIC的起始条件操作 voidStop(void);//功能: 完成IIC的终止条件操作 voidACK(void);//功能: 完成IIC的主机应答操作 voidNACK(void);//功能: 完成IIC的主机无应答操作 unsignedcharCheck(void);//功能: 检查从机的应答操作 voidWrite_1_Byte(unsignedcharDataByte);//写1个字节 unsignedcharWrite_N_Byte(unsignedchar*writebuffer,unsignedcharn);//写N个字节 unsignedcharRead_1_Byte(void);//读1个字节 voidRead_N_Byte(unsignedint*readbuff,unsignedcharn);//读N个字节 voidInitADS1115(bitS_MUX_0,bitS_MUX_1);//ADS1115初始化 voidWriteWord(void);//写 voidReadWord(void);//读 unsignedintADS1115(bitS_MUX_0,bitS_MUX_1);//ADS1115取值 #endif #include #include #include"ads1115.h" unsignedintConfig; unsignedcharWritebuff[4],Readbuff[3]; unsignedintResult[2]; intD_ADS;//转换的数字量 voidDelay_us_15(void)/*延时程序*/ { unsignedchari; for(i=0;i<15;i++) _nop_(); } voidDelay_ms_1(void) { unsignedchari; for(i=150;i>0;i--)_nop_(); } ///******************************************* //函数名称: Start //功能: 完成IIC的起始条件操作 //参数: 无 //返回值: 无 //********************************************/ voidStart(void) { SCL=1; SDA=1; Delay_us_15(); SDA=0; Delay_us_15(); SCL=0; Delay_us_15(); } // ///******************************************* //函数名称: Stop //功能: 完成IIC的终止条件操作 //参数: 无 //返回值: 无 //********************************************/ voidStop(void) { SDA=0; Delay_us_15(); SCL=1; Delay_us_15(); SDA=1; Delay_us_15(); } ///******************************************* //函数名称: ACK //功能: 完成IIC的主机应答操作 //参数: 无 //返回值: 无 //********************************************/ voidACK(void) { SDA=0; _nop_();_nop_(); SCL=1; Delay_us_15(); SCL=0; _nop_();_nop_(); SDA=1; Delay_us_15(); } //******************************************* //函数名称: NACK //功能: 完成IIC的主机无应答操作 //参数: 无 //返回值: 无 //********************************************/ voidNACK(void) { SDA=1; _nop_();_nop_(); SCL=1; Delay_us_15(); SCL=0; _nop_();_nop_(); SDA=0; Delay_us_15(); } //**********检查应答信号函数******************/ ///*如果返回值为1则证明有应答信号,反之没有*/ ///******************************************* //函数名称: Check //功能: 检查从机的应答操作 //参数: 无 //返回值: 从机是否有应答: 1--有,0--无 //********************************************/ unsignedcharCheck(void) { unsignedcharslaveack; SDA=1; _nop_();_nop_(); SCL=1; _nop_();_nop_(); _nop_();_nop_(); //_nop_();_nop_(); slaveack=SDA;//读入SDA数值 SCL=0; Delay_us_15(); if(slaveack) returnFALSE; else returnTRUE; } /***************WriteaByte****************/ voidWrite_1_Byte(unsignedcharDataByte) { inti; for(i=0;i<8;i++) { if(DataByte&0x80)//if((DataByte< SDA=1; else SDA=0; Delay_us_15(); SCL=1; Delay_us_15(); SCL=0; Delay_us_15(); DataByte<<=1; } SDA=1; _nop_(); } /***************WriteNByte****************/ unsignedcharWrite_N_Byte(unsignedchar*writebuffer,unsignedcharn) { inti; for(i=0;i { Write_1_Byte(*writebuffer); if(Check()) { writebuffer++; } else { Stop(); returnFALSE; } } Stop(); returnTRUE; } //***************ReadaByte****************/ unsignedcharRead_1_Byte(void) { unsignedchardata_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(); } returndata_Value; } //***************ReadNByte****************/ voidRead_N_Byte(unsignedint*readbuff,unsignedcharn) { unsignedchari; for(i=0;i { readbuff[i]=Read_1_Byte(); if(i==n-1) NACK();//不连续读字节 else ACK();//连续读字节 } Stop(); } //*****************初始化******************/ voidInitADS1115(bitS_MUX_0,bitS_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; } //***************WriteaWord***********************/ voidWriteWord(void) { intt; Start();//写入4个字节 do { t=Write_N_Byte(Writebuff,4); }while(t==0);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 报告 温控 电路设计