恒温箱温度计算机控制系统设计_第1页
恒温箱温度计算机控制系统设计_第2页
恒温箱温度计算机控制系统设计_第3页
恒温箱温度计算机控制系统设计_第4页
恒温箱温度计算机控制系统设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西南科技大学计算机控制系统报告设计名称:恒温箱温度计算机控制系统设计姓名:孙兰学号:20121856班级:自动1201班指导教师:聂诗良起止日期:2015.9.15--2012.12.25西南科技大学信息工程学院制设计任务书学生班级: 自动1201 学生姓名: 孙兰 学号: 20121856设计名称: 恒温箱温度计算机控制系统设计起止日期: 9月15日——12月25日 指导教师: 聂诗良设计要求:(1)温度采集传感器采用热电阻或热电偶,或一体化数字温度传感器 DS18B20。2)控制灯泡亮度或发热量,采用继电器开关控制或用可控硅平滑控制。3)采用单片机或PLC作为控制器。4)采用LED或LCD或PC机的液晶显示器作为显示器,同时显示给定温度和实际温度。5)采用自制按键或PC机的键盘作为温度给定值输入。(6)恒温箱实际温度达到给定值时(误差要求 ±1℃)需声光提示,声音时延 5秒后停止。(7)恒温箱最高温度 ≤50℃。2恒温箱温度计算机控制系统设计摘要:本设计的温度测量及加热控制系统以AT89S52单片机为核心部件,外加温度采集电路、键盘及显示电路、加热控制电路和越限报警等电路。采用单总线型数字式的温度传感器DS18B20,及行列式键盘和动态显示的方式,以容易控制的固态继电器作加热控制的开关器件。本作品既可以对当前温度进行实时显示又可以对温度进行控制,以使达到用户需要的温度,并使其恒定在这一温度。人性化的行列式键盘设计使设置温度简单快速,两位整数一位小数的显示方式具有更高的显示精度。建立在模糊控制理论上的控制算法,使控制精度完全能满足一般社会生产的要求。通过对系统软件和硬件设计的合理规划,发挥单片机自身集成众多系统级功能单元的优势,在不减少功能的前提下有效降低了硬件成本,系统操控简便。关键词:单片机 恒温控制 模糊控制3Abstract:ThedesignofthetemperaturemeasurementandheatingcontrolsystemstoAT89S52microcontrollercorecomponent,plusthetemperatureacquisitioncircuit,keyboardanddisplaycircuit,heatingcircutaltemperaturesensorDS18B20,andthedeterminantofthekeyboardanddynamicdisplayinordertoeasilycontrolthesolid-staterelaysforheatingcontroloftheswitchingdevice.Thisworksbothonthecurrenttemperatureinreal-timedisplayoftemperaturecanbecontrolledinordertoenableuserstoreachtherequiredtemperature,andmakeitconstantatthistemperature.HumanizeddesignkeyboarddeterminanttemperatureeasyExpress,thetwodecimalinteger,adisplayshowsahigheraccuracy.Setupinthefuzzycontroltheory,controlalgorithms,sothatthecontrolaccuracycanmeetthegeneralrequirementsofsocialproduction.Throughthesystemsoftwareandhardwaredesignofrationalplanning,exerttheirownsingle-chipintegrationofmanysystem-levelfunctionalunitoftheadvantages,doesnotreducethefunctionsatthepremiseofeffectivelyreducingthecostofhardware,thesystemeasytomanipulate.Keywords:microcontroller,temperaturecontrol,fuzzycontrol4设计目的和意义利用AT89S52对温度进行控制,采用单总线传输方式读取 DS18B20当前温度值并用龙丘小液晶显示,使用按键更改设定温度, 使用PID算法控制箱体温度到一个恒定值, 这样一个控制系统涵盖了以计算机控制系统课程为核心的单片机原理及应用、 自动控制原理等相关课程知识,提供了真正将理论课程所学的知识应用于实践的平台。 从硬件的搭建到软件算法的探索都需要扎实的理论基础。在涉及光耦驱动晶闸管电路的设计过程中还考察了器件选型的重要性,对于箱体的设计还考察了学生对于实际的考虑。 整个设计过程需要工程的思想, 正是迎合了我自动化专业优秀学生所必须具备的知识与能力!系统总体结构2.1总体方案设计系统整体框图如下图:图1系统原理总框图上面的系统总体框图中,该系统中微控制器采用 AT89S52单片机小系统,温度显示采用龙丘小液晶显示模块、声光报警器模块、 DS18B20温度采集模块、键盘输入设定温度模块、继电器驱动模块。2.2温度控制方案选择该温度控制系统的控制对象是箱体内的温度,但是温度这个量的控制必须借助其他产热原件才能实现。经过多方调查,我总结到可行又比较简单的方案大体都是使用灯泡发光产热来改变箱体内温度,控制灯泡产热的方案分别如下所述:方案一:采用继电器作为程控开关,控制灯泡的开或关,进而控制其产热。这种方案简单易行,但是继电器控制的频率一般只有 10Hz左右,不能在50Hz交流电的每个周期都控制灯泡开关一次,也就是只能控制灯泡的亮或灭,不能调节灯泡的亮度。方案二:采用开关器件晶闸管作为控制灯泡亮度的执行部件,由于晶闸管的开关速度可以5达到很快,因而可以控制灯泡的亮度。由于本装置要求控制调节控制温度的精度要达到1°C,用继电器方案也可以达到要求,但是不能实现平滑控制灯泡发热量的要求。为了能够平滑控制灯泡亮度,最终选定使用晶闸管控制方案,即方案二。2.3主控芯片的选择对于本系统这样一个典型而又全面的控制系统来说, 用八位的52单片机或者AVR单片机就可以满足控制要求。方案一:采用52系列单片机,有两个外部中断口、 3路定时器、4路8位I/O口,资源丰富,编程简单。方案二:使用AVR系列的ATMEGA16单片机,除了拥有一般的中断、定时、输入输出功能外,还有PWM输出功能,JTAG等外加功能,但是需要烧写熔丝位,编程相对复杂些,而且价格要高出好多。综合考虑到价格因素以及资源需求,最终选定 AT89S52单片机作为主控芯片。2.4液晶显示方案选择方案一:使用的最为广泛的方案也就是使用 1602字符型液晶显示器,该液晶价格便宜,编程简单,但是只能显示两行 16个字符以内的英文字符。方案二:使用龙丘小液晶,分辨率 128*64,可以显示不同大小的汉字和字符,功耗很低,采用3.3V供电。由于本系统使用便宜的7805线性稳压芯片供电,其发热功率与输入与输出电压差以及负载电流的大小乘积正相关。所以采用 LCD1602字符型液晶继电器,选择方案一。系统模块设计3.1系统电源模块设计电源是整个系统工作的基础,所有的功能实现都是基于稳定的电源。本系统电源单片机、DS18B20用的5V标准的TTL电平逻辑,这里给出使用 L7805产生5V电源的电路。图27805产生5V电源L7805是非常普通的线性稳压芯片,其输出最大电流为1.5A,但是由于它是线性电源,其发热功率与输入与输出电压差以及负载电流的大小乘积正相关。为了尽量减小功耗,在输入和输出端都使用了电容滤波,抑制电压电流的波动。3.2AT89S52单片机小系统模块设计63.2.1AT89S52单片机简介AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。3.2.2单片机最小系统电路单片机工作的基本要求包括必要的5V电源(40引脚),接地(20引脚),晶振电路(18、19引脚),复位电路(9引脚)以及使用内部存储器需要给31脚接高。图3AT89S52最小系统电路图3.3LCD1602液晶显示器显示模块设计该款液晶显示器与单片机通信属于串行口数据通信方式,可以直接与单片机引脚连接,接受5V电平逻辑。7图4小液晶连接电路3.4DS18B20温度采集模块设计3.4.1DS18B20简介DS18B20数字温度计是Dallas公司生产的1-Wire器件,即单总线器件。与传统的热敏电阻有所不同,DS18B20可直接将被测温度转化成串行数字信号,以供单片机处理,具有连线简单、微型化、低功耗、高性能、抗干扰能力强、精度高等特点。因此用它来组成一个测温系统,具有电路简单,在一根通信线上可以挂很多这样的数字温度计,十分方便。 目前已被众多行业进行广泛的运用(锅炉、温控表粮库、冷库、工业现场温度监控、仪器仪表温度监控、农业大棚温度监控等)。通过编程, DS18B20可以实现9~12位的温度读数。3.4.2温度检测部分电路温度检测部分很简单,因为信息经过单线接口送入DS18B20或从DS18B20送出,因此从微处理器到DS18B20仅需连接一条信号线和地线就可以正常工作,这里我还是给它接入了电源线。图5温度检测部分电路3.5键盘输入温度设定模块设计为了简便,我只使用了3个独立按键作为按键输入,分别作为设置键(移位键)、增加键、减小键。最开始在板子上用了4个按键,有一个没有用。8图6按键检测电路3.6可控硅驱动模块设计可控硅使用的型号是BT137,配合使用光耦MOC3021驱动它,MOC3021又用了一个PNP三极管来驱动,这里也就是运用了两级驱动来控制强电的灯泡亮灭,完全隔离保证安全。图7可控硅驱动部分电路系统软件设计整个软件系统的流程图绘制在下面图中。系统初始化液晶显示是否按键重设温度 Y 重设温度N开中断读一次温度显示当前温度和设定温度再读一次温度判断正确性并显示现实判断PID调光检测温度=设定温度N Y9Y声光报警图8软件流程图4.1液晶显示程序设计该龙丘小液晶可以显示不同字号的汉字或者字符,但是比较麻烦的是,该液晶没有解码汉字的芯片,所以要输出显示都要先使用一款 “汉字取模软件”。这也使得我在程序中加入汉字取点的数组以后,程序体积增大了很多,最终代码段接近 8K。液晶程序结构如下:先定义各端口为sbitlcdrs=P2^0;//定义lcdrs脚sbitlcdwr=P2^1;//定义lcdwr脚sbitlcde=P2^2;//定义lcde脚uchartm[]={"0123456789"};// 定义字符数组ucharno[]={"nowtemp="};ucharset[]={"settemp="};// 定义字符串显示ucharsn[]={"inputst="};// 定义设置时字符串voidwrite_com(ucharcom){P0=com;//将数据送入P2口,即写入指令或地址lcdrs=0;lcdwr=0;//根据规定,RS和R/W同时为低电平时,可以写入指令delaynms(5);lcde=0;delaynms(5);lcde=1;}/*****************************************************函数功能:将数据 (字符的标准ASCII码)写入液晶模块入口参数:dat(为字符常量)***************************************************/voidwrite_dat(uchardat){P0=dat;//将数据送入P2口,即将数据写入液晶模块lcdrs=1;lcdwr=0;//RS为高电平,RW为低电平时,可以写入数据delaynms(5);lcde=0;10delaynms(5);lcde=1;}/*****************************************************函数功能:对 LCD的显示模式进行初始化设置***************************************************/4.2温度检测程序设计DS18B20采集温度的精度可以设置,我们使用了最高精度的模式,也就是 12位。其源码在官方资料上以及网上随处可见,经过修改后,该模块简化程序如下。uchards18b20_temp()//18B20读温度函数{uchartemp=0,temph=0,templ=0;ds18b20_reset();//将DS18B20初始化ds18b20_write(0xcc);// 跳过读序号列号的操作ds18b20_write(0x44);// 启动温度转换delaynms(10);//转换一次需要延时一段时间ds18b20_reset();//将DS18B20初始化ds18b20_write(0xcc);//跳过读序号列号的操作ds18b20_write(0xbe);//读取温度寄存器,前两个分别是温度的低位和高位templ=ds18b20_read();//将读取到的温度的低位存在templ中temph=ds18b20_read();//高位存在temph中temp=temph*16+templ/16;//读出温度整数部分,2位xs=(templ%16)*10/16;//读出温度的小数部分,1位returntemp;//返回温度的整数部分}心得体会通过本次制作恒温箱,对于计算机控制系统有更实际的了解,以前学习的知识,都是基于理论,就算是实验课,器材也是学校已经弄好了,我们做实验基本就是连接线路,也根本了解的不深入。但是,这次的课程设计,不但要我们自己买器材,更要我们设计电路、画出电路图、画出PCB、最终焊接成一块板子,然后调试板子,板子硬件调试差不多了又要设计程序。这样一个控制系统涵盖了以计算机控制系统课程为核心的单片机原理及应用、自动控制原理等相关课程知识,提供了真正将理论课程所学的知识应用于实践的平台。从硬件的搭建到软件算法的探索都需要扎实的理论基础。在涉及光耦驱动晶闸管电路的设计过程中还考察了器件选型的重要性,对于箱体的设计还考察了学生对于实际的考虑。整个设计过程需要工程的思想。恒温箱顾名思义就是要让温度基本恒定在一个我们期望的值,所以在设计程序时,就要想一个算法来控制单片机,使之能够恒定温度。当然对于这种控制,最好的算法莫过于 PID算法,因11为此法简单而有效,工业上也有很多的应用,如果需要更精确的控制,可以再 PID的基础增加一些算法,比如模糊控制、鲁棒控制等。通过这次的设计制作,我学习到了如何把理论上的东西运用到实践当中,并且对于PID参数的调整有了更加深入的理解,体会颇深,对于以后做项目又增加了不少经验。参考文献单片机原理与应用/戴胜华等-北京:清华大学出版社;北京交通大学出版社,2005.4[2]51单片机快速入门 /徐玮等-北京:机械工业出版社, 2011.11C语言程序设计/戴胜华等-北京:清华大学出版社,200单片机原理与应用/戴胜华等-北京:清华大学出版社;北京交通大学出版社,2005.4计算机控制系统/高金源等-北京:清华大学出版社,2007.112附录一 电路原理图附录二 主函数完整程序//************************* 恒温箱系统程序 **************************///******************************************************************工作流程:通过按键输入设定希望达到的温度值,确定后单片机输出脉冲控制灯泡加热,期间DS18B20不断检测温度并将之显示在LCD1602液晶屏上,同时液晶屏也显示设定的温度值,当实际温度和给定温度误差在0.1度范围内一段时间后,LED发光,蜂鸣器发出一定频率的声音,表示系统已达到平衡,经过大概5s后停止发光和鸣叫;重新设定给定后,重新达平衡则再次发光和鸣叫。恒温箱内温度保持在给定值加减允许的误差范围内。*******************************************************************/#include<reg52.h>//包含单片机寄存器的头文件#include<intrins.h>//包含_nop_()函数定义的头文件#defineucharunsignedchar//宏定义uchar#defineuintunsignedint//宏定义uintsbitCF=P2^4;//定义触发脉冲发送引脚/*****************************************************以下是延时函数模块***************************************************//*****************************************************函数功能:延时 1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是 1毫秒***************************************************/voiddelay1ms(){unsignedchari,j;for(i=0;i<4;i++)13for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/voiddelaynms(unsignedintn){unsignedinti;for(i=0;i<n;i++)delay1ms();}/************************************************************************以下是DS18B20的操作程序************************************************************************/sbitDQ=P2^3;//定义18B20数据引脚uchartime;//设置全局变量,专门用于严格延时ucharxs;//存放读取温度的小数位/*****************************************************函数功能:将 DS18B20传感器初始化***************************************************/voidds18b20_reset()//18b20复位函数{while(1){DQ=1;DQ=0;time=250;//540us延时,当delay=1时延时为2us,T=2*xwhile(--time);DQ=1;time=25;while(--time);while(DQ==0){time=220;while(--time);if(DQ)break;}time=150;while(--time);break;}}/*****************************************************函数功能:向 DS18B20写入一个字节数据入口参数:dat***************************************************/voidds18b20_write(uchardat)//18B20 写函数{uchari=0;for(i=0;i<8;i++){DQ=0;//将数据线从高拉低时即启动写时序DQ=dat&0x01;//利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样14for(time=0;time<25;time++);// 延时约45us,DS18B20在拉低后的约 15~60us期间从数据线上采样DQ=1;//释放数据线dat>>=1;//将dat中的各二进制位数据右移1位}for(time=0;time<25;time++);// 稍作延时,给硬件一点反应时间}/*****************************************************函数功能:从 DS18B20读取一个字节数据出口参数:dat***************************************************/uchards18b20_read()//18B20读函数{uchari=0,dat=0;//储存读出的一个字节数据for(i=0;i<8;i++){DQ=1;DQ=0;_nop_();_nop_();_nop_();_nop_();//延时4个机器周期,给系统反应时间DQ=1;//拉高数据线_nop_();_nop_();_nop_();_nop_();//延时4个机器周期,给系统反应时间if(DQ)dat|=0x01<<i;time=25;while(--time);DQ=1;//拉高数据线_nop_();}return(dat);//返回读出的十六进制数据}/*****************************************************函数功能:从 DS18B20读取温度出口参数:temp***************************************************/uchards18b20_temp()//18B20读温度函数{uchartemp=0,temph=0,templ=0;ds18b20_reset();//将DS18B20初始化ds18b20_write(0xcc);// 跳过读序号列号的操作ds18b20_write(0x44);// 启动温度转换delaynms(10);//转换一次需要延时一段时间ds18b20_reset();//将DS18B20初始化ds18b20_write(0xcc);//跳过读序号列号的操作ds18b20_write(0xbe);//读取温度寄存器 ,前两个分别是温度的低位和高位templ=ds18b20_read();//将读取到的温度的低位存在templ中temph=ds18b20_read();//高位存在temph中temp=temph*16+templ/16;//读出温度整数部分,2位xs=(templ%16)*10/16;//读出温度的小数部分,1位returntemp;//返回温度的整数部分}15/************************************************************************以下是LCD1602液晶模块的操作程序************************************************************************/sbitlcdrs=P2^0;//定义lcdrs脚sbitlcdwr=P2^1;//定义lcdwr脚sbitlcde=P2^2;//定义lcde脚uchartm[]={"0123456789"};// 定义字符数组ucharno[]={"nowtemp="};ucharset[]={"settemp="};// 定义字符串显示ucharsn[]={"inputst="};// 定义设置时字符串/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:com***************************************************/voidwrite_com(ucharcom){P0=com;//将数据送入 P2口,即写入指令或地址lcdrs=0;lcdwr=0;//根据规定,RS和R/W同时为低电平时,可以写入指令delaynms(5);lcde=0;delaynms(5);lcde=1;}/*****************************************************函数功能:将数据 (字符的标准 ASCII码)写入液晶模块入口参数:dat(为字符常量)***************************************************/voidwrite_dat(uchardat){P0=dat;//将数据送入 P2口,即将数据写入液晶模块lcdrs=1;lcdwr=0;//RS为高电平,RW为低电平时,可以写入数据delaynms(5);lcde=0;delaynms(5);lcde=1;}/*****************************************************函数功能:对 LCD的显示模式进行初始化设置***************************************************/voidinit(){delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间write_com(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口delaynms(5);//延时5ms ,给硬件一点反应时间write_com(0x38);delaynms(5);//延时5ms ,给硬件一点反应时间write_com(0x38);//连续三次,确保初始化成功delaynms(5);//延时5ms ,给硬件一点反应时间write_com(0x0c);//显示控制:显示开,光标关,闪烁关delaynms(5);//延时5ms ,给硬件一点反应时间write_com(0x06);//输入方式设置:数据读写操作后, AC自动加1,画面不动delaynms(5);//延时5ms ,给硬件一点反应时间write_com(0x01);//清屏幕指令,将以前的显示内容清除16delaynms(5);//延时5ms ,给硬件一点反应时间}/*****************************************************函数功能:LCD在第一行显示 "nowtemp= .°C"字符串***************************************************/voidlcdnt(){uchari;write_com(0x80);for(i=0;i<9;i++){write_dat(no[i]);delay1ms();//延时1ms给硬件一点反应时间}write_com(0x80+0x0b);write_dat('.');delay1ms();//延时1ms给硬件一点反应时间write_com(0x80+0x0d);write_dat(0xDF);delay1ms();//延时1ms给硬件一点反应时间write_com(0x80+0x0e);write_dat('C');delay1ms();//延时1ms给硬件一点反应时间}/*****************************************************函数功能:LCD在第二行显示 "settemp= .°C"字符串***************************************************/voidlcdgg(){uchari;write_com(0x80+0x40);for(i=0;i<9;i++){write_dat(set[i]);delay1ms();//延时1ms给硬件一点反应时间}write_com(0x80+0x40+0x0b);write_dat('.');delay1ms();//延时1ms给硬件一点反应时间 ?write_com(0x80+0x40+0x0d);write_dat(0xDF);delay1ms();//延时1ms给硬件一点反应时间write_com(0x80+0x40+0x0e);write_dat('C');delay1ms();//延时1ms给硬件一点反应时间}/*****************************************************函数功能:设置模式下 LCD在第二行显示"inputst"字符串***************************************************/voidlcdst(){uchari;write_com(0x80+0x40);for(i=0;i<9;i++){write_dat(sn[i]);delay1ms();//延时1ms给硬件一点反应时间17}}/*****************************************************函数功能:LCD显示当前实际温度的个、十位和小数位入口参数:sw,gw,xs***************************************************/voidlcdntemp(ucharsw,uchargw,ucharxs){write_com(0x80+0x09);//指针的位置移至第一行第9个位置write_dat(tm[sw]);delay1ms();//延时1ms给硬件一点反应时间write_com(0x80+0x0a);write_dat(tm[gw]);delay1ms();//延时1ms给硬件一点反应时间write_com(0x80+0x0c);write_dat(tm[xs]);delay1ms();//延时1ms给硬件一点反应时间}/*****************************************************函数功能:LCD显示设置温度的个、十位和小数位入口参数:a,b***************************************************/voidlcdxs(uchara,ucharb){write_com(0x80+0x40+0x09);// 将指针移至第二行第 9个位置write_dat(tm[a]);//显示设置温度的十位delay1ms();//延时1ms给硬件一点反应时间write_com(0x80+0x40+0x0a);write_dat(tm[b]);delay1ms();//延时1ms给硬件一点反应时间write_com(0x80+0x40+0x0c);write_dat(tm[0]);delay1ms();//延时1ms给硬件一点反应时间}/************************************************************************以下是按键模块的操作程序************************************************************************/sbitKEY1=P1^0;//按键1+1sbitKEY2=P1^1;//按键2-1sbitKEY3=P1^2;//按键3+5sbitKEY4=P1^3;//按键4-5sbitKEY_I=P1^4;//模式切换按键ucharst;//存放设定温度值intflag=0;//定义模式切换标志位,初始化为 0,默认为工作模式/*****************************************************函数功能:检测模式切换按键,按下后改变模式出口参数:flag***************************************************/intKEY_IJC(){if(KEY_I==0){delaynms(10);//延时10ms,按键消抖处理if(KEY_I==0){18flag=~flag;while(~KEY_I);// 按键消抖处理,释放按键有效}}returnflag;}/*****************************************************函数功能:按键检测,在设置模式下修改给定值入口参数:st出口参数:st***************************************************/ucharaj(ucharst){if(KEY1==0){delaynms(10);//延时10ms,按键消抖处理if(KEY1==0){if(st==60)st=60;//判断设定值是否等于 60,若等于,则 st依然等于 60elsest++;//按键1,st即设定值+1while(~KEY1);// 按键消抖处理,释放按键有效}}if(KEY2==0){delaynms(10);//延时10ms,按键消抖处理if(KEY2==0){if(st==20)st=20;//判断设定值是否等于 20,若等于,则 st依然等于 20elsest--;//按键2,st即设定值-1while(~KEY2);// 按键消抖处理,释放按键有效}}if(KEY3==0){delaynms(10);//延时10ms,按键消抖处理if(KEY3==0){if(st>55)st=60;//判断设定值是否大于 55,若大于,则 st等于60elsest+=5;//按键3,st即设定值+5while(~KEY3);// 按键消抖处理,释放按键有效}}if(KEY4==0){delaynms(10);//延时10ms,按键消抖处理if(KEY4==0){if(st<25)st=20;//判断设定值是否小于 25,若小于,则 st等于20else19st-=5;//按键4,st即设定值-5while(~KEY4);// 按键消抖处理,释放按键有效}}returnst;}/************************************************************************以下是声光报警模块的程序************************************************************************/sbitled=P1^7;//定义led引脚sbitbu=P3^1;//定义蜂鸣器引脚inttime0=0;//用来计算达到平衡后的延时inttime1=0;//用来计算 LED和蜂鸣器的作用时间intflag0=0;//用来标志表示达到平衡状态intflag1=1;//用来标志LED和蜂鸣器工作 ,初始为1允许计时/*****************************************************函数功能:实现蜂鸣器发出一定频率的声音***************************************************/voidbeep(){delay1ms();bu=~bu;//蜂鸣器发出一定频率的叫声}/*****************************************************LED发光,函数功能:当采集到的实际温度与设定温度在误差范围内一段时间后即稳定后,蜂鸣器鸣叫,延时5S后结束入口参数:s1,sw0,gw0,xs0***************************************************/voidled_bu(uchars1,ucharsw0,uchargw0,ucharxs0){if((((sw0*100+gw0*10+xs0)<=(s1*10+1))&&((sw0*100+gw0*10+xs0)>=(s1*10-1)))&&(flag1==1))//当实际温度和设定温度在误差范围内一段时间后,置位LED和蜂鸣器标志位{time0++;if(time0==150){time0=0;//清零计时flag1=0;//将计算平衡延时的标志位置零,即达到平衡后不再计时flag0=1;//置位LED和蜂鸣器标志位}}else{time0=0;//若不在误差范围内,则计时清零}if(flag0==1){time1++;//计算LED和蜂鸣器工作的时间led=0;beep();//LED发光,蜂鸣器发出一定频率的声音if(time1==40){led=1;bu=1;//延时后LED熄灭,蜂鸣器停止鸣叫time1=0;//清计时时间20flag1=0;flag0=0;//清标志位,等待下次设定后才重新置位标志位}}}/************************************************************************以下是计算α角即延时的程序************************************************************************/floatki=0.15;//定义PID参数intthiserr=0;//存放偏差interr=0;//存放累计的偏差/*****************************************************函数功能:根据输入的温度给定值和实际温度值,通过 PID算法求出需要的延时时间***************************************************/intout_time(uchars0,uchartemp){intatime;//存放输出的延时thiserr=s0*10-(temp*10+xs);// 计算误差err+=thiserr;//将误差累加if(err>30000)err=30000;if(err<-1500)err=-1500;//对累加的误差进行处理if(thiserr>400)thiserr=400;//定义误差最大为 400if(thiserr<=0){thiserr=0;atime=30000;//误差小于等于 0时,停止脉冲发送}elseatime=(400-thiserr)*17+850-ki*err;// 计算延时时间if(atime<850)atime=850;//定义最小延时为 850return atime;//返回延时时间}/*****************************************************以下是主函数***************************************************/uintV_TH0,V_TL0;// 定义变量,用来装定时器初值intdtime;//定义触发脉冲延时时间即 α角ucharsw,gw;//存放读取的实际温度的十位和各位uchara,b;//存放设定温度值的十位和各位和小数位uchartem;//存放读取到的温度的整数/*****************************************************函数功能:设定各种初值,设定定时器,中断工作方式,调用各模块函数***************************************************/voidmain(){TMOD=0x11;//设置定时器工作方式TH1=0xFE;TL1=0x0C;//给定时器 1装定时初值21EX1=1;//允许外部中断 1中断IT1=1;//设置外部中断 1触发方式为下降沿触发led=1;bu=1;//初始化led和蜂鸣器引脚st=20;//设置温度初始值a=st/10;b=st%10;//计算得到设置温度十位和各位CF=0;//脉冲发送端口置低dtime=1000;//初始定义延时时间为 1msEA=1;//允许中断init();//LCD 初始化lcdnt();//LCD 显示while(1){tem=ds18b20_temp();//DS18B20读取温度sw=tem/10;//温度十位gw=tem%10;//温度各位lcdntemp(sw,gw,xs);//LCD 显示当前温度dtime=out_time(st,tem);//通过函数计算需要发送脉冲的延时即α角V_TH0=(65535-dtime)/256;V_TL0=(65535-dtime)%256;// 计算定时器初值lcdgg();//LCD 显示lcdxs(a,b);//LCD 显示设置温度flag=KEY_IJC();// 模式切换按键检测led_bu(st,sw,gw,xs);//声光报警函数while(flag)//进入设置模式{flag1=1;//进入设置模式后,重新置位标志位,可以开始计时tem=ds18b20_temp();//DS18B20读取温度sw=tem/10;//温度十位gw=tem%10;//温度各位lcdntemp(sw,gw,xs);//LCD 显示当前温度lcdst();//LCD 显示进入设置a=st/10;b=st%10;//计算设置温度的十位和各位lcdxs(a,b);//LCD 显示设置温度st=aj(st);//修改设定值按键检测flag=KEY_IJC();// 模式切换按键检测}}}/*****************************************************以下是中断函数模块***************************************************//*****************************************************函数功能:外部中断 1函数,检测过零信号***************************************************/voidex_1(void)interrupt222{TH0=V_TH0;TL0=V_TL0;// 为定时器 0装定时初值TR0=1;//打开定时器 0ET0=1;//允许定时器 0中断}/*****************************************************函数功能:定时器 0中断函数,经过延时后进入,与定时器 1配合完成触发脉冲的发送***************************************************/voidtimer0(void)interrupt1{CF=1;//脉冲发送引脚置高TH0=V_TH0;TL0=V_TL0;// 重装定时初值TR1=1;//打开定时器 1ET1=1;//允许定时器 1中断TR0=0;//关闭定时器 0}/*****************************************************函数功能:定时器 1中断函数,确定脉冲的高电平持续时间***************************************************/voidtimer1(void)interrupt3{CF=0;//脉冲发送引脚置低,脉冲发送结束TH1=0xFE;TL1=0x0C;//重装定时初值TR1=0;//关闭定时器 1}单片机初始化/*--------------------------------------------------------------------------REG52.HHeaderfileforgeneric80C52and80C32microcontroller.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.--------------------------------------------------------------------------*/#ifndef__REG52_H__#define__REG52_H__/* BYTERegisters */sfrP0 =0x80;sfrP1 =0x90;sfrP2 =0xA0;sfrP3 =0xB0;sfrPSW =0xD0;sfrACC =0xE0;sfrB =0xF0;sfrSP =0x81;sfrDPL =0x82;sfrDPH =0x83;sfrPCON =0x87;sfrTCON =0x88;sfrTMOD =0x89;sfrTL0 =0x8A;sfrTL1 =0x8B;sfrTH0 =0x8C;23sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/* 8052Extensions */sfrT2CON =0xC8;sfrRCAP2L=0xCA;sfrRCAP2H=0xCB;sfrTL2 =0xCC;sfrTH2 =0xCD;/*BITRegisters*//*PSW*/sbitCY=PSW^7;sbitAC=PSW^6;sbitF0=PSW^5;sbitRS1=PSW^4;sbitRS0=PSW^3;sbitOV=PSW^2;sbitP=PSW^0;//8052only/*TCON*/sbitTF1=TCON^7;sbitTR1=TCON^6;sbitTF0=TCON^5;sbitTR0=TCON^4;sbitIE1=TCON^3;sbitIT1=TCON^2;sbitIE0=TCON^1;sbitIT0=TCON^0;/*IE*/sbitEA=IE^7;sbitET2=IE^5;//8052onlysbitES=IE^4;sbitET1=IE^3;sbitEX1=IE^2;sbitET0=IE^1;sbitEX0=IE^0;/*IP*/sbitPT2=IP^5;sbitPS=IP^4;sbitPT1=IP^3;sbitPX1=IP^2;sbitPT0=IP^1;sbitPX0=IP^0;/*P3*/sbitRD=P3^7;sbitWR=P3^6;sbitT1=P3^5;sbitT0=P3^4;sbitINT1=P3^3;sbitINT0=P3^2;sbitTXD=P3^1;sbitRXD=P3^0;24/*SCON*/sbitSM0=SCON^7;sbitSM1=SCON^6;sbitSM2=SCON^5;sbitREN=SCON^4;sbitTB8=SCON^3;sbitRB8=SCON^2;sbitTI=SCON^1;sbitRI=SCON^0;/*P1*/sbitT2EX=P1^1;//8052onlysbitT2=P1^0;//8052only/*T2CON*/sbitTF2=T2CON^7;sbitEXF2=T2CON^6;sbitRCLK=T2CON^5;sbitTCLK=T2CON^4;sbitEXEN2=T2CON^3;sbitTR2=T2CON^2;sbitC_T2=T2CON^1;sbitCP_RL2=T2CON^0;#endif基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论