您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 基于STC89C52单片机的温度控制电路设计
12.7系统整体硬件电路系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主控电路等,通过Protel99se可画出如图2-9所示的电路图[9][10][11]图2-9温度控制电路原理2三系统软件设计3.1温度控制系统原理框图主控制程序的主要是用来实时控制当前所要测控的环境温度,并读出由DS18B20测量的经过处理的当前环境的温度值,同时检查温度是否在限度之内,否则报警,同时调整温度值。其主控制程序流程图如3-1所示。图3-1主程序流程图图3-2读温度流程图Y发温度转换命令发DS18B20复位命令发跳过读序列号命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器结束NNY开始STC89C52初始化DS18B20初始化温度是否到达设定限度温度显示结束红灯亮温度在显示范围内YNYN3温度控制系统C语言程序#includereg51.h#defineuintunsignedint#defineucharunsignedcharsbitp34=P2^4;sbitp35=P2^5;sbitp36=P2^6;sbitdp=P0^7;sbitp37=P2^7;sbitDQ=P2^2;//定义DS18B20总线I/OsbitSET=P3^1;//定义选择报调整警温度上限和下限(1为上限,0为下限)sbitLING=P2^0;//定义闪烁signedcharm;//温度值全局变量bitsign=0;//外部中断状态标志signedcharshangxian=38;//上限报警温度,默认值为38signedcharxiaxian=5;//下限报警温度,默认值为5ucharcodeLEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};/*****延时子程序*****/voidDelay(uinti){while(i--);}/*****初始化DS18B20*****/voidInit_DS18B20(void){unsignedcharx=0;DQ=1;Delay(8);//稍做延时DQ=0;//单片机将DQ拉低Delay(80);//精确延时,大于480usDQ=1;//拉高总线Delay(14);x=DQ;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay(20);}4/*****读一个字节*****/unsignedcharReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;Delay(4);}return(dat);}/*****写一个字节*****/voidWriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat=1;}}voidTmpchange(void)//发送温度转换命令{Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换}/*****读取温度*****/5unsignedintReadTemperature(void){unsignedchara=0;unsignedcharb=0;unsignedintt=0;floattt=0;Tmpchange();Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器a=ReadOneChar();//读低8位b=ReadOneChar();//读高8位t=b;t=8;t=t|a;tt=t*0.0625;t=tt*100+0.5;//放大100倍输出并四舍五入return(t);}/*****显示开机初始化等待画面*****/Disp_init(){P0=0x80;//显示-p34=1;p35=0;p36=0;p37=0;Delay(200);P0=0x80;p34=0;p35=1;p36=0;p37=0;Delay(200);P0=0x80;p34=0;p35=0;p36=1;p37=0;Delay(200);P0=0x80;p34=0;p35=0;p36=0;p37=1;Delay(200);P0=0x80;6}/*****显示温度子程序*****/Disp_Temperature()//显示温度{uinta,b,c,d,e;e=ReadTemperature();//获取温度值a=e/1000;//计算得到十位数字b=e/100-a*10;//计算得到个位数字d=e%10;//计算得到小数点后两位c=(e%100)/10;//计算得到小数点后一位m=e/100;if(mshangxian||mxiaxian)LING=1;//温度不在范围内报警elseLING=0;p34=0;p35=0;p36=0;p37=0;P0=LEDData[d];//显示小数点后两位p34=1;p35=0;p36=0;p37=0;Delay(300);p34=0;p35=0;p36=0;p37=0;P0=LEDData[c];//显示小数点后一位p34=0;p35=1;p36=0;p37=0;Delay(300);p34=0;p35=0;p36=0;p37=0;P0=LEDData[b];//显示个位dp=0;p34=0;p35=0;p36=1;p37=0;Delay(300);p34=0;p35=0;p36=0;p37=0;P0=LEDData[a];//显示十位p34=0;p35=0;p36=0;p37=1;Delay(300);p34=0;p35=0;p36=0;p37=0;//关闭显示}disptiaozheng(){7ucharf,g,j,k;f=shangxian/10;g=shangxian%10;j=xiaxian/10;k=xiaxian%10;p34=0;p35=0;p36=0;p37=0;P0=0xc0;//显示0p34=1;p35=0;p36=0;p37=0;Delay(200);p34=0;p35=0;p36=0;p37=0;P0=0xc0;//显示0p34=0;p35=1;p36=0;p37=0;Delay(200);p34=0;p35=0;p36=0;p37=0;if(SET==1){P0=LEDData[g];dp=0;//显示上限温度个位}else{P0=LEDData[k];dp=0;}p34=0;p35=0;p36=1;p37=0;Delay(200);p34=0;p35=0;p36=0;p37=0;if(SET==1)P0=LEDData[f];//显示上限温度十位else{if(f==0)P0=0x00;//不显示下限温度十位elseP0=LEDData[j];//显示下限温度十位}p34=0;p35=0;p36=0;p37=1;Delay(200);p34=0;p35=0;p36=0;p37=0;//关闭显示8Delay(20);}/*****外部中断0服务程序*****/voidint0(void)interrupt0{EX0=0;//关外部中断0sign=1;if(SET==1)shangxian++;elsexiaxian++;Delay(500);EX0=1;}/*****外部中断1服务程序*****/voidint1(void)interrupt2{EX1=0;//关外部中断0sign=1;if(SET==1)shangxian--;elsexiaxian--;Delay(500);EX1=1;}/*****主函数*****/voidmain(void){uintz;IT0=1;IT1=1;EX0=1;EX1=1;EA=1;ReadTemperature();LING=0;for(z=0;z100;z++){9Disp_init();}while(1){Disp_Temperature();if(sign==1){for(z=0;z300;z++)disptiaozheng();sign=0;}}}
本文标题:基于STC89C52单片机的温度控制电路设计
链接地址:https://www.777doc.com/doc-2572247 .html