




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于的温度控制系统设计C语言源程序(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)
/*********************************************************/基于的温度控制系统设计C语言源程序(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)/*程序名称:温度监控系统*//*程序功能:利用89C52单片机和DS18B20温度传感器实现环境*//*温度的实时测量和高、低温报警*//*程序版本:v1.0*//*作者:*//*编写时间:*//*********************************************************/#include<reg52.h>#include<intrins。h>//含_nop_()延时函数//定义数据类型#defineucharunsignedchar#defineuintunsignedint//定义端口#defineLEDP0//段码输出口sbitDQ=P3^2;//传感器数据口sbitSMG_q=P1^0; //定义数码管阳级控制脚(千位)sbitSMG_b=P1^1;ﻩ//定义数码管阳级控制脚(百位)sbitSMG_s=P1^2;ﻩ//定义数码管阳级控制脚(十位)sbitSMG_g=P1^3;ﻩ//定义数码管阳级控制脚(个位)sbitbuzzer=P1^5;//蜂鸣器 sbitled_low=P2^6;//低温指示灯sbitled_high=P2^7;//高温指示灯sbitled_ok=P2^5;//温度正常指示灯sbitled_work=P2^4;//工作指示灯sbitset=P3^7;//设置按键sbitadd=P3^4;//加一按键sbitdec=P3^5;//减一按键//定义变量和常量intcount=0;//按键次数寄存器inth;//主函数用循环计数器uinttemp;//温度值ucharr;//温度值整数形式ucharhigh=35,low=20;//上下限初值//共阳LED段码表”0""1”"2"”3”"4”"5”"6””7""8""9”"不亮”"-"ucharcodeLED_code[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharcodeLED_code1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数部分转换码表uchardatatemp_data[2]={0x00,0x00};//存储从传感器读出的温度值uchardatadp[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算//子函数声明voidds_reset();//DS18B20初始化函数voidds_write(uchards_wrdata);//DS18B20写数据函数uchards_read();//DS18B20读数据函数read_temp();//读取温度函数voidchange_temp(uinttem);//温度数据处理voidxianshi(inthorl);//温度显示转换voiddisplay();//数码管显示函数voidkeyscan();//按键查询函数voidwarn_led();//超限报警voiddelay(uintt);//延时函数,单次25us/********************主函数*********************/voidmain(){ LED=0x00;//初始化显示端口ﻩled1=0;ﻩled2=0;ﻩled3=0;ﻩled4=0; for(h=0;h<4;h++)ﻩ{ dp[h]=8; } while(1)//循环执行显示和温度读取 { ﻩuchari;ﻩﻩfor(i=0;i〈200;i++)ﻩﻩ{ﻩ ﻩwarn_led();//指示灯控制ﻩﻩ display();//显示 ﻩ keyscan();//按键扫描 ﻩ}ﻩ change_temp(read_temp());//温度数据读取和处理 ﻩﻩ}}/***********************************************//*函数名称:ds_reset()*//*函数功能:DS18B20初始化*//*入口参数:无*//*输出参数:无*//*调用函数:delay();_nop_();*//*全局变量:无*//*局部变量:presence*//***********************************************/voidds_reset(void){ﻩcharpresence=1; while(presence)ﻩ{ﻩﻩwhile(presence)ﻩ { ﻩﻩDQ=1;//传感器数据段先置高电平ﻩ _nop_();ﻩﻩﻩ_nop_();ﻩﻩﻩ//适当延时ﻩﻩﻩDQ=0;//传感器数据段从高电平拉到低电平 ﻩdelay(50);//延时ﻩﻩﻩDQ=1;//再置高电平ﻩﻩ delay(6);//延时 ﻩpresence=DQ;//初始化成功,继续下一步 }ﻩﻩdelay(45);//延时ﻩﻩpresence=~DQ;ﻩ} DQ=1;//拉高电平 led_work=0; ﻩ ﻩ//开工作指示灯}/***********************************************//*函数名称:ds_write()*//*函数功能:向DS18B20写数据*//*入口参数:ds_wrdata*//*输出参数:无*//*调用函数:delay();_nop_();*//*全局变量:无*//*局部变量:ds_wrdata*//***********************************************/voidds_write(uchards_wrdata){ uchari; for(i=8;i>0;i--)ﻩ{ ﻩDQ=1;_nop_(); _nop_();ﻩﻩDQ=0; ﻩ_nop_(); _nop_(); _nop_(); _nop_();ﻩﻩDQ=ds_wrdata&0x01;//最低位移出 ﻩdelay(6); ﻩds_wrdata=ds_wrdata/2;//右移1位 } DQ=1; delay(1);}/***********************************************//*函数名称:ds_read()*//*函数功能:从DS18B20读数据*//*入口参数:无*//*输出参数:value*//*调用函数:delay();_nop_();*//*全局变量:*//*局部变量:i;value;*//***********************************************/uchards_read(void){ﻩuchari; ucharvalue=0;ﻩfor(i=8;i>0;i-—)ﻩ{ﻩﻩDQ=1;_nop_();ﻩﻩ_nop_();ﻩ value〉>=1;ﻩ DQ=0; _nop_(); ﻩ_nop_();ﻩ _nop_(); _nop_(); ﻩDQ=1;ﻩ _nop_();ﻩ _nop_();ﻩﻩ_nop_(); ﻩ_nop_(); ﻩif(DQ)value|=0x80;ﻩﻩdelay(6); } DQ=1;ﻩreturn(value);}/***********************************************//*函数名称:read_temp()*//*函数功能:读温度数据数据*//*入口参数:无*//*输出参数:yemp*//*调用函数:ds_reset();ds_write();ds_read();*//*delay();*//*全局变量:temp*//*局部变量:temp_data[];*//***********************************************/read_temp(){ ds_reset();//传感器初始化 delay(200);ﻩds_write(0xcc);//发跳过读取序列号命令ﻩds_write(0x44);//发温度转换命令 ds_reset();ﻩdelay(1);ﻩds_write(0xcc);ﻩ ﻩﻩds_write(0xbe); //读18B20中存储器ﻩtemp_data[0]=ds_read();//读温度值的低字节命令 temp_data[1]=ds_read();//读温度值的高字节ﻩtemp=temp_data[1]; temp<<=8; temp=temp|temp_data[0];//两字节合成一个整型变量 returntemp;//返回温度值}/***********************************************//*函数名称:chang_temp()*//*函数功能:将温度传感器中独到的数据进行转换*//*入口参数:tem*//*输出参数:dp[]*//*调用函数:无*//*全局变量:dp[];ditab[];r;*//*局部变量:tem*//***********************************************/voidchange_temp(uinttem){ﻩucharn=0;ﻩif(tem〉6348)//温度值正负判断 { ﻩtem=65536-tem;//负温度求补码 n=1;//标志位置1ﻩ}ﻩdp[4]=tem&0x0f;//取小数部分的值ﻩdp[0]=ditab[dp[4]];//存入小数部分显示值ﻩdp[4]=tem〉〉4;//取中间八位,即整数部分的值 dp[3]=dp[4]/100;//取百位数据 dp[1]=dp[4]%100;//取后两位数据ﻩdp[2]=dp[1]/10;//取十位数据ﻩdp[1]=dp[1]%10;//个位ﻩr=dp[1]+dp[2]*10+dp[3]*100;//实际温度值(十进制) if(!dp[3])ﻩ //符号位显示判断ﻩ{ﻩﻩdp[3]=0x0a;//最高位为0时不显示ﻩﻩif(!dp[2]) ﻩ{ﻩﻩﻩdp[2]=0x0a;//次高位为0时不显示 } }ﻩif(n)ﻩ{ dp[3]=0x0b; ﻩ//负温度时最高位显示"—”ﻩ}}/***********************************************//*函数名称:xianshi()*//*函数功能:温度数据转换成显示所需LED段码*//*入口参数:horl*//*输出参数:dp[]*//*调用函数:无*//*全局变量:dp[];*//*局部变量:n;*//***********************************************/voidxianshi(inthorl){ intn=0;ﻩif(horl>128) ﻩ ﻩ//负数补码转换ﻩ{ horl=256—horl; n=1; } dp[3]=horl/100; dp[3]=dp[3]&0x0f;//百位ﻩdp[2]=horl%100/10;ﻩ //十位ﻩdp[1]=horl%10; //个位 dp[0]=0; ﻩﻩ//小数位ﻩif(!dp[3]) ﻩ ﻩ//高位为零不显示 { dp[3]=0x0a;ﻩ if(!dp[2])ﻩ {ﻩﻩ dp[2]=0x0a; ﻩ}ﻩ}ﻩif(n)ﻩ ﻩ //负数最高位显示“-”ﻩ{ ﻩdp[3]=0x0b;ﻩ}}/***********************************************//*函数名称:display()*//*函数功能:数码管显示*//*入口参数:无*//*输出参数:无*//*调用函数:delay()*//*全局变量:dp[];LED_code[];LED_code1[];*//*led1;led2;led3;led4;*//*局部变量:j;*//***********************************************/voiddisplay(){ intj;ﻩfor(j=0;j〈4;j++)//4位LED扫描控制ﻩ{ switch(j)ﻩ {ﻩ ﻩcase0:LED=LED_code[dp[0]];ﻩﻩ ﻩled4=1; ﻩ ﻩdelay(450); ﻩﻩﻩled4=0;ﻩ break;//小数位 ﻩﻩcase1:LED=LED_code1[dp[1]];ﻩ ﻩ led3=1; ﻩﻩdelay(450); ﻩ ﻩled3=0; break;//个位 ﻩ case2:LED=LED_code[dp[2]];ﻩ ﻩ led2=1; delay(450);ﻩﻩﻩ led2=0; ﻩﻩbreak;//十位ﻩﻩﻩcase3:LED=LED_code[dp[3]]; led1=1; ﻩ ﻩdelay(450); ﻩ led1=0;ﻩﻩﻩﻩbreak;//百位 } }}/***********************************************//*函数名称:keyscan()*//*函数功能:按键查询*//*入口参数:无*//*输出参数:无*//*调用函数:delay();display();xianshi();*//*全局变量:count;high;low;*//*局部变量:无*//***********************************************/voidkeyscan(){ﻩif(set==0) ﻩ //set键按下 { ﻩwhile(1)ﻩﻩ{ ﻩdelay(500);ﻩ ﻩ//延时去抖动ﻩ if(set==0) ﻩﻩ//重新判断set键是否按下ﻩ {ﻩ count++; ﻩﻩ while(!set) //按键弹起继续显示前面内容 ﻩ display();ﻩ } ﻩﻩif(count==1) ﻩ//set按下一次执行此段ﻩﻩ { ﻩﻩxianshi(high);ﻩ//转换上限温度为段码并显示 ﻩﻩdisplay();ﻩﻩﻩﻩif(add==0) //add键是否按下ﻩﻩﻩﻩ{ ﻩﻩﻩ while(!add)ﻩ//弹起时上限温度加一并显示ﻩﻩ ﻩ display();ﻩﻩ ﻩ high+=1; ﻩ ﻩ} ﻩﻩﻩif(dec==0) ﻩ//dec键是否按下ﻩ {ﻩ ﻩﻩﻩwhile(!dec)ﻩ//弹起时上限温度减一并显示ﻩﻩ ﻩﻩdisplay(); ﻩﻩﻩ high-=1; }ﻩ } if(count==2)ﻩ //set键按下两次执行此段 ﻩ{ ﻩ xianshi(low);ﻩ//转换下限温度为段码并显示ﻩﻩﻩﻩdisplay(); ﻩﻩ if(add==0) ﻩ//add键是否按下 ﻩﻩ{ﻩ ﻩ ﻩwhile(!add)ﻩ//弹起时下限温度加一并显示 ﻩ ﻩdisplay(); ﻩ low+=1;ﻩﻩ }ﻩ ﻩ //dec键是否按下ﻩﻩﻩ if(dec==0)ﻩ ﻩﻩ{ ﻩﻩ while(!dec) //弹起时下限温度减一并显示 ﻩﻩ display(); ﻩ low-=1;ﻩﻩ ﻩ}ﻩ }ﻩﻩ if(count>=3)ﻩﻩ//set键按下三次回到温度显示状态ﻩ ﻩ{ ﻩ count=0;ﻩ ﻩbreak;ﻩﻩﻩ} ﻩ}ﻩ}}/***********************************************//*函数名称:warn_led()*//*函数功能:工作情况指示灯控制*//*入口参数:无*//*输出参数:无*//*调用函数:无*//*全局变量:high;low;r;*//*局部变量:无*//***********************************************/voidwarn_led(){ﻩif(r>high) //温度高于上限温度ﻩ{ ﻩled_low=1; ﻩ ﻩ//“低温”指示灯灭 ﻩled_high=0;ﻩﻩ //“高温”指示灯亮 led_ok=1;ﻩﻩﻩ //“正常"指示灯灭 buzzer=0;ﻩﻩﻩﻩ//蜂鸣器发声 } elseif(r〈low) ﻩﻩ //温度低于下限温度 { ﻩled_low=0; ﻩﻩﻩ//“低温"指示灯亮 led_high=1;ﻩ ﻩ //“高温”指示灯灭ﻩﻩled_ok=1;ﻩ ﻩ//“正常”指示灯灭 buzzer=0; ﻩ//蜂鸣器发声ﻩ}ﻩelse ﻩ //温度正常ﻩ{ﻩﻩled_low=1; ﻩﻩﻩ//“低温”指示灯灭ﻩ led_high=1;ﻩﻩ //“高温”指示灯灭 ﻩled_ok=0;ﻩ ﻩﻩ//“正常”指示灯亮ﻩﻩbuzzer=1;ﻩ ﻩﻩ//蜂鸣器不发声 }}/***********************************************//*函数名称:delay()*//*函数功能:延时函数,单次25us左右延时*//*入口参数:t;*//*输出参数:无*//*调用函数:无*//*全局变量:无*//*局部变量:t;*//***********************************************/voiddelay(uintt){ﻩfor(;t〉0;t--);}/*******************程序结束********************/#include<reg51.h>unsignedintx,y;voiddelayms(unsignedintz)//延时{ﻩunsignedinti,j; for(i=z;i〉0;i——)ﻩfor(j=150;j〉0;j——);}voidOn_all()//开启所有灯{ P0=0x00;P1=0x00;P2=0x00;P3=0x00;}voidOff_all()//关闭所有灯{ﻩP0=0xff;P1=0xff;P2=0xff;P3=0xff;}voidls()//正向流水灯{ﻩP0=0x00;delayms(400);ﻩP2=0x00;delayms(400); P3=0x00;delayms(400);ﻩP1=0x00;delayms(400); P0=0x01;delayms(50);ﻩP0=0x02;delayms(50);ﻩP0=0x04;delayms(50); P0=0x08;delayms(50); P0=0x10;delayms(50); P0=0x20;delayms(50);ﻩP0=0x40;delayms(50); P0=0x80;delayms(50); P0=0x00;ﻩP2=0x01;delayms(50); P2=0x02;delayms(50);ﻩP2=0x04;delayms(50);ﻩP2=0x08;delayms(50); P2=0x10;delayms(50);ﻩP2=0x20;delayms(50);ﻩP2=0x40;delayms(50); P2=0x80;delayms(50); P2=0x00;ﻩP3=0x80;delayms(50); P3=0x40;delayms(50); P3=0x20;delayms(50);ﻩP3=0x10;delayms(50); P3=0x08;delayms(50);ﻩP3=0x04;delayms(50);ﻩP3=0x02;delayms(50);ﻩP3=0x01;delayms(50);ﻩP3=0x00; P1=0x80;delayms(50);ﻩP1=0x40;delayms(50);ﻩP1=0x20;delayms(50);ﻩP1=0x10;delayms(50); P1=0x08;delayms(50); P1=0x04;delayms(50); P1=0x02;delayms(50); P1=0x01;delayms(50); P1=0x00;Off_all();ﻩP0=0xfe;delayms(50); P0=0xfd;delayms(50); P0=0xfb;delayms(50); P0=0xf7;delayms(50); P0=0xef;delayms(50);ﻩP0=0xdf;delayms(50);ﻩP0=0xbf;delayms(50);ﻩP0=0x7f;delayms(50); P0=0xff;ﻩP2=0xfe;delayms(50); P2=0xfd;delayms(50); P2=0xfb;delayms(50); P2=0xf7;delayms(50);ﻩP2=0xef;delayms(50); P2=0xdf;delayms(50); P2=0xbf;delayms(50);ﻩP2=0x7f;delayms(50);P2=0xff; P3=0x7f;delayms(50);ﻩP3=0xbf;delayms(50);ﻩP3=0xdf;delayms(50); P3=0xef;delayms(50);ﻩP3=0xf7;delayms(50); P3=0xfb;delayms(50); P3=0xfd;delayms(50);ﻩP3=0xfe;delayms(50);ﻩP3=0xff; P1=0x7f;delayms(50); P1=0xbf;delayms(50); P1=0xdf;delayms(50);ﻩP1=0xef;delayms(50); P1=0xf7;delayms(50); P1=0xfb;delayms(50);ﻩP1=0xfd;delayms(50);ﻩP1=0xfe;delayms(50);ﻩP1=0xff; P0=0xfe;delayms(50); P0=0xfc;delayms(50); P0=0xf8;delayms(50); P0=0xf0;delayms(50);ﻩP0=0xe0;delayms(50);ﻩP0=0xc0;delayms(50);ﻩP0=0x80;delayms(50);ﻩP0=0x00;delayms(50);ﻩP2=0xfe;delayms(50); P2=0xfc;delayms(50);ﻩP2=0xf8;delayms(50);ﻩP2=0xf0;delayms(50); P2=0xe0;delayms(50); P2=0xc0;delayms(50); P2=0x80;delayms(50);ﻩP2=0x00;delayms(50); P3=0x7f;delayms(50); P3=0x3f;delayms(50);ﻩP3=0x1f;delayms(50); P3=0x0f;delayms(50);ﻩP3=0x07;delayms(50); P3=0x03;delayms(50); P3=0x01;delayms(50); P3=0x00;delayms(50); P1=0x7f;delayms(50);ﻩP1=0x3f;delayms(50);ﻩP1=0x1f;delayms(50);ﻩP1=0x0f;delayms(50);ﻩP1=0x07;delayms(50);ﻩP1=0x03;delayms(50);ﻩP1=0x01;delayms(50); P1=0x00;delayms(50);}voidfan_ls()//反向流水灯{Off_all();delayms(300);On_all();delayms(300);Off_all();delayms(300);ﻩP1=0x00;delayms(400);ﻩP3=0x00;delayms(400);ﻩP2=0x00;delayms(400);ﻩP0=0x00;delayms(400);ﻩP1=0x01;delayms(50);ﻩP1=0x02;delayms(50); P1=0x04;delayms(50); P1=0x08;delayms(50); P1=0x10;delayms(50);ﻩP1=0x20;delayms(50); P1=0x40;delayms(50); P1=0x80;delayms(50); P1=0x00;ﻩP3=0x01;delayms(50); P3=0x02;delayms(50);ﻩP3=0x04;delayms(50); P3=0x08;delayms(50);ﻩP3=0x10;delayms(50); P3=0x20;delayms(50);ﻩP3=0x40;delayms(50);ﻩP3=0x80;delayms(50); P3=0x00; P2=0x80;delayms(50); P2=0x40;delayms(50); P2=0x20;delayms(50); P2=0x10;delayms(50); P2=0x08;delayms(50);ﻩP2=0x04;delayms(50); P2=0x02;delayms(50); P2=0x01;delayms(50); P2=0x00;ﻩP0=0x80;delayms(50); P0=0x40;delayms(50); P0=0x20;delayms(50); P0=0x10;delayms(50);ﻩP0=0x08;delayms(50); P0=0x04;delayms(50);ﻩP0=0x02;delayms(50);ﻩP0=0x01;delayms(50); P0=0x00;Off_all();ﻩP1=0xfe;delayms(50); P1=0xfd;delayms(50); P1=0xfb;delayms(50); P1=0xf7;delayms(50);ﻩP1=0xef;delayms(50); P1=0xdf;delayms(50); P1=0xbf;delayms(50); P1=0x7f;delayms(50);ﻩP1=0xff;ﻩP3=0xfe;delayms(50); P3=0xfd;delayms(50);ﻩP3=0xfb;delayms(50);ﻩP3=0xf7;delayms(50);ﻩP3=0xef;delayms(50); P3=0xdf;delayms(50);ﻩP3=0xbf;delayms(50);ﻩP3=0x7f;delayms(50);ﻩP3=0xff; P2=0x7f;delayms(50); P2=0xbf;delayms(50); P2=0xdf;delayms(50);ﻩP2=0xef;delayms(50);ﻩP2=0xf7;delayms(50);ﻩP2=0xfb;delayms(50); P2=0xfd;delayms(50);ﻩP2=0xfe;delayms(50);ﻩP2=0xff; P0=0x7f;delayms(50); P0=0xbf;delayms(50); P0=0xdf;delayms(50);ﻩP0=0xef;delayms(50);ﻩP0=0xf7;delayms(50); P0=0xfb;delayms(50);ﻩP0=0xfd;delayms(50);ﻩP0=0xfe;delayms(50); P0=0xff;ﻩP1=0xfe;delayms(50); P1=0xfc;delayms(50);ﻩP1=0xf8;delayms(50);ﻩP1=0xf0;delayms(50); P1=0xe0;delayms(50); P1=0xc0;delayms(50);ﻩP1=0x80;delayms(50); P1=0x00;delayms(50);ﻩP3=0xfe;delayms(50);ﻩP3=0xfc;delayms(50); P3=0xf8;delayms(50); P3=0xf0;delayms(50); P3=0xe0;delayms(50); P3=0xc0;delayms(50);ﻩP3=0x80;delayms(50); P3=0x00;delayms(50); P2=0x7f;delayms(50); P2=0x3f;delayms(50);ﻩP2=0x1f;delayms(50);ﻩP2=0x0f;delayms(50); P2=0x07;delayms(50); P2=0x03;delayms(50); P2=0x01;delayms(50); P2=0x00;delayms(50); P0=0x7f;delayms(50);ﻩP0=0x3f;delayms(50); P0=0x1f;delayms(50); P0=0x0f;delayms(50);ﻩP0=0x07;delayms(50);ﻩP0=0x03;delayms(50); P0=0x01;delayms(50); P0=0x00;delayms(50);Off_all();On_all();Off_all();On_all();Off_all();}voidban_shan()//半边交替闪{Off_all(); P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;delayms(50);ﻩP1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;delayms(50);ﻩP1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;delayms(50);ﻩP1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;delayms(50); P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;delayms(50);ﻩP1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;delayms(50);ﻩP1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;delayms(50); P1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;delayms(50); P1=0x00;P3=0x00;delayms(50);P0=0xff;P2=0xff;delayms(50); P1=0xff;P3=0xff;delayms(50);P0=0x00;P2=0x00;delayms(50);}voidshangxia_shan()//上下交替闪{On_all();Off_all();ﻩP0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;delayms(50); P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;delayms(50);ﻩP0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;delayms(50); P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;delayms(50);ﻩP0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;delayms(50);ﻩP0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;delayms(50);ﻩP0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;delayms(50); P0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;delayms(50); P0=0x00;P1=0x00;delayms(50);P2=0xff;P3=0xff;delayms(50);ﻩP0=0xff;P1=0xff;delayms(50);P2=0x00;P3=0x00;delayms(50);}voidhuayang_shan()//花样闪烁{On_all();delayms(400); P0=0xff;P2=0x00;P3=0x00;P1=0x00;delayms(200); P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200); P0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200); P0=0x00;P2=0x00;P3=0x00;P1=0xff;delayms(200);ﻩP0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200); P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200);ﻩP0=0xff;P2=0x00;P3=0x00;P1=0x00;delayms(200);On_all();delayms(400);ﻩP0=0x00;P2=0x00;P3=0x00;P1=0xff;delayms(200);ﻩP0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200); P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200); P0=0xff;P2=0x00;P3=0x00;P1=0x00;delayms(200); P0=0x00;P2=0xff;P3=0x00;P1=0x00;delayms(200); P0=0x00;P2=0x00;P3=0xff;P1=0x00;delayms(200); P0=0x00;P2=0x00;P3=0x00;P1=0xff;delayms(200);On_all();delayms(400);Off_all();delayms(400); P0=0x00;delayms(200); P3=0x00;delayms(200);ﻩP1=0x00;delayms(200);ﻩP2=0x00;delayms(200);On_all();delayms(400);Off_all();delayms(400);ﻩP1=0x00;delayms(200);ﻩP2=0x00;delayms(200);ﻩP0=0x00;delayms(200); P3=0x00;delayms(200);On_all();delayms(400);Off_all();delayms(50);On_all();delayms(50);Off_all();delayms(50);On_all();delayms(50);Off_all();delayms(50);}voidmain(){On_all();delayms(300);Off_all();delayms(300);On_all();delayms(300);Off_all();delayms(300);On_all();delayms(300);Off_all();delayms(300);ls();//正向流水fan_ls();//反向流水ban_shan();//半边交替闪shangxia_shan();//上下交替闪烁huayang_shan();//花样闪烁}(2014届)毕业设计题目:基于PID的温度控制系统设计学院:********专业:电气工程及其自动化班级:电气***学号:**********姓名:某某某指导教师:某某某教务处制年月日诚信声明我声明,所呈交的论文是本人在老师指导下进行的研究工作及取得的研究成果。据我查证,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得______或其他教育机构的学位或证书而使用过的材料.我承诺,论文中的所有内容均真实、可信.论文作者签名:签名日期:年月日授权声明学校有权保留送论文交的原件,允许论文被查阅和借阅,学校可以公布论文的全部或部分内容,可以影印、缩印或其他复制手段保存论文,学校必须严格按照授权对论文进行处理,不得超越授权对论文进行任意处置。论文作者签名:签名日期:年月日基于PID的温度控制系统设计摘要温度是工业上最基本的参数,与人们的生活紧密相关,实时测量温度在工业生产中越来越受到重视,离不开温度测量所带来的好处,因此研究控制和测量温度具有及其重要的意义。本设计介绍了以AT89C52单片机为主控器件,基于PID的温度控制系统的设计方案和设计的基本原理.由DS18B20收集温度信号,并以数字信号的方式送给单片机进行处理,从而达到温度控制的目标。主要包括硬件电路的设计和系统程序的设计.硬件电路由主控器件、温测电路、温控电路和显示电路等组成。软件设计部分包括:显示电路、温度信号处理,超温警报、继电器控制、按键处理等程序。关键词:温度检测,温度控制,PID算法DesignofTemperatureControlSystemBasedonPIDAbstractTemperatureisthemostbasicparametersofindustrialandcloselyrelatedwithpeople'slives,real-timemeasurementoftemperatureinindustrialproductionandmoreattention,whichisinseparablefromthebenefitsofthetemperaturemeasurement,temperaturecontrolandmeasurementstudythereforehasitssignificance.ThisdesignintroducesthebasicprinciplestoAT89C52microcontroller—basedcontrollerpiecestemperaturecontrolsystemdesignanddesign.CollectedbytheDS18B20temperaturesignal,anddigitalsignalsentbywayofthemicrocontrollerforprocessing,soastoachievethetargettemperaturecontrol。Includingthedesignofhardwarecircuitdesignandsystemprograms.Hardwarecircuitincludesamasterdevice,thetemperaturemeasuringcircuit,temperaturecontrolcircuitanddisplaycircuit.Softwaredesign,including:displayelectrical,temperature,signalprocessing,over-temperaturealarm,relaycontrol,keyhandlingprocedures.Keywords:temperaturedetection,temperaturecontrol,PIDalgorithm目录TOC\*MERGEFORMAT摘要PAGEREF_Toc13802IIIAbstractPAGEREF_Toc22970IV1绪论PAGEREF_Toc174911.1课题的来源PAGEREF_Toc65611.2课题的意义PAGEREF_Toc2461411.3课题研究的主要内容PAGEREF_Toc185712硬件设计PAGEREF_Toc3169432。1单片机控制模块的设计PAGEREF_Toc927832.1.1AT89C52单片机简介PAGEREF_Toc347532。1.2单片机的引脚功能PAGEREF_Toc276942。1。3单片机控制模块的电路设计PAGEREF_Toc98052。1。4电源设计PAGEREF_Toc1261762.2温度采集模块的设计PAGEREF_Toc2441172.2。1DS18B20芯片的简介PAGEREF_Toc2918372。2.2DS18B20的内部结构PAGEREF_Toc2533682。2.3DS18B20的供电方式PAGEREF_Toc22286102。2。4DS18B20的引脚功能PAGEREF_Toc8376102。3温度控制模块的设计PAGEREF_Toc8493112.4按键及显示模块的设计PAGEREF_Toc23016122.4.1LCD1602的参数和引脚功能PAGEREF_Toc18967122。4.2LCD1602的特点PAGEREF_Toc4184132.4.3按键电路的设计PAGEREF_Toc1883132.5报警模块的设计PAGEREF_Toc23150143软件设计PAGEREF_Toc14481163。1主程序的设计PAGEREF_Toc22789163.2DS18B20读温度程序的设计PAGEREF_Toc17472163.3键盘扫描程序的设计PAGEREF_Toc25913173.4报警处理程序的设计PAGEREF_Toc16640183.5PID控制算法PAGEREF_Toc32133184系统仿真84922参考文献PAGEREF_Toc2992027致谢PAGEREF_Toc1668928附录PAGEREF_Toc15295291绪论1。1课题的来源在食品加工、化工、冶炼等工业控制和生产中,在工业生产和日常生活中经常要用到温度检测和控制。以及各种各样的加热炉、热处理器等,都对温度有着严格的要求。传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的通常是电压,再转换成相应的温度值,在硬件方面是个难点,而且从设计和调试的角度来讲都是很复杂的,以及高昂的制作成本。但采用DS18B20作为温测元件,然后用单片机对温度进行控制,可以大幅度提高温度控制的技术指标,而且还具有控制方便、简单、灵活等特点.单片机已经渗透到我们生活的各领域,仪表仪器、家用电器、航空航天、计算机通讯网络和数据的传输,包括工业自动化的实时控制和数据处理等,这些都离不开单片机。用单片机可构成丰富多样的数据采集系统和控制系统。像工厂流水线智能化的管理、电梯智能化的控制、多种报警系统,都可以与计算机联网构成二级控制系统等.1.2课题的意义温度传感器是测量温度的关键,现在温度传感器正由模拟式向数字式、集成化向智能化、网络化的方向发展。在测量温度的电路中,使用热敏电阻之类的器件利用其感温效应,将随被测温度变化的电压或电流采集过来,先进行A/D转换,然后用单片机进行数据的处理,再在显示电路上,将被测温度显示出来。这种设计需要用到A/D转换电路,因此电路的设计比较复杂.继而想到可以采用智能温度传感器来设计数字温度计。本数字温度计的设计采用美国半导体公司DALLAS推出的一种改进型智能温度传感器DS18B20作为检测元件,其温度值可以直接被读出来,通过单片机AT89C52的读写和显示,然后用LCD1602来进行显示.它的测温范围为-55℃~+125℃,最大分辨率可达0.0625℃。而且采用3线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。1。3课题研究的主要内容1、总体设计的内容总体设计的主要内容有:利用单片机作为系统的主控制器,利用DS18B20作为温度传感器,将信号送入单片机进行处理,经过PID算法后,单片机的输出用来控制加热棒的输出功率,从而实现对温度的控制。2、总体设计的基本要求总体布置的基本要求主要有:(1)温度控制系统的总体设计和思路;(2)各部分原理说明;(3)温度控制系统硬件设计,有理论依据,有分析计算过程,主要元件有原理和说明,所有元件必须要有型号和参数;(4)温度控制系统软件设计,可以使用汇编语言或C语言编程.主要软件必须能在设计好的硬件电路上正确运行.2硬件设计硬件设计方框图如图2-1所示,它主要由五个模块组成:单片机控制模块;温度采集模块;温度控制模块;按键及显示模块;报警模块。图2-1硬件设计方框图2。1单片机控制模块的设计方案一:采用8031芯片,其内部没有程序存储器,需要进行外部扩展,这给电路增加了复杂度.方案二:采用2051芯片,其内部有2KB单元的程序存储器,不需外部扩展程序存储器。但由于系统用到较多的I/O口,因此此芯片资源不够用。方案三:采用AT89C52单片机,其内部有4KB单元的程序存储器,不需外部扩展程序存储器,而且它的I/O口也足够本次设计的要求。方案评价:比较这三种方案,综合考虑单片机的各部分资源,本次设计选用方案三。2。1.1AT89C52单片机简介AT89C52是ATMEL公司生产的51系列单片机。片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度,兼容51指令系统,Flash存储单元和8位中央处理器置于片内,AT89C52单片机功能强大,在许多复杂的应用场合都可以用到。单片机是微型机的一个分支,单片机的最大特点就是在超大规模的集成电路芯片上集成了定时器、存储器、CPU、和多种输入/输出接口电路.由于单片机的这种结构,相应的它具有很多的特点。它的特点包括:可靠性高;抗干扰能力强;控制能力强;性价比高;低电压;能扩展了多种串行口。2.1.2单片机的引脚功能AT89C52单片机的引脚图如图2—2所示。图2—2AT89C52引脚图电源引脚VCC和VSSVCC(40引脚):电源端,+5V。VSS(20引脚):接地端.外接晶体引脚XTAL2和XTAL1XTAL2(18引脚):接微调电容和外部晶体的端口。作为振荡电路的输出端。XTAL1(19引脚):接微调电容和外部晶体的端口。作为振荡电路的输入端。控制信号引脚RST、ALE、PSEN、EARST(9引脚):复位信号输入端,高电平有效。完成复位操作,输入端必须为两机器周期(即为24个时钟振荡周期)的高电平。ALE/PROG(30引脚):地址锁存允许信号端。当单片机上电正常工作后,ALE引脚不断向外输出正脉冲信号,此频率为振荡器平率的1/6.输出信号作为锁存低8位地址的控制信号。如果想确认单片机芯片的好坏,可用示波器查看ALE端是否有脉冲信号输出.若有脉冲信号输出,则单片机基本上是好的。PSEN(29引脚):程序存储允许输出信号端。EA(31引脚):外部程序存储器地址允许输入端/固化编程电压输入端.输入/输出端口P0、P1、P2和P3P0端口(P0.0~P0.7,39~32引脚)P1端口(P1.0~P1.7)P2端口(P2.0~P2.7)P3端口(P3。0~P3.7)P3端口还用于一些复用功能,如表2—1所示.表2-1P3各口线与第2功能表口线替代的第2功能P3。0RXD(串行口输入)P3。1TXD(串行口输出)P3.2INT0(外部中断0输入)P3.3INT1(外部中断1输入)P3。4T0(定时器0的外部输入)P3。5T1(定时器1的外部输入)P3.6WR(片外数据存储器“写选通控制”输出)P3。7RD(片外数据存储器“读选通控制”输出)2.1。3单片机控制模块的电路设计单片机的最小系统如图2-3所示,由单片机芯片、电源、时钟振荡电路与复位电路组成.时钟振荡电路的设计:单片机XIAL1和XIAL2分别接30pF的电容,中间再并个12MHz的晶振,形成单片机的晶振电路.电容器C1和C2可稳定频率并对振荡频率有微调作用.复位电路的设计:复位操作有按键手动复位和上电自动复位两种。本设计采用的是上电自动复位:RST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。电容端瞬间通电,电容C通过电阻R充电,RST端为正脉冲,用以复位。只要电源VCC的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就完成了系统的复位初始化.关于参数的选定,在振荡稳定后应保证复位高电平持续时间(即正脉冲宽度)大于2个机器周期。当采用的晶体频率为6MHz时,可取C=22μF,R=1kΩ;当采用的晶体频率为12MHz时,可取C=10μF,R=8.2kΩ。图2-3单片机的最小系统图2。1.4电源设计220V交流电转5V直流电的电源设计如图2—4所示是由3个部分组成:变压器、桥式整流电路和三端稳压器。图2-45V直流电电源设计图变压器:将220V交流电变成9V左右,由此可知变压器变比为220/9=25/1;桥式整流电路:经过滤波整流后,电压有效值增大为10V。如图2-5所示为桥式整流电路电压波形图;三端稳压器:一般用于直流电路的保护电路,起到降压、稳压的作用。图2-5桥式整流电路电压波形图2。2温度采集模块的设计方案一:传统的测温元件有热电偶和热电阻。一般来说热电偶和热电阻测出的电压,再转换成相应的温度,要比较多外部硬件的支持,其缺点有:硬件电路较复杂;软件调试较复杂;制作成本较高。方案二:结合单片机电路的设计,决定使用温度传感器DS18B20,它是最新推出的一种智能型温度传感器,它的优点是可以直接读出被测的温度.主要是对温度信号进行采集和转换工作,电路由DS18B20温度传感器和单片机部分组成.温度传感器DS18B20把收集到的温度送到单片机的P2。6口,单片机接受温度,然后存储下来。因为电路部分只用到了温度传感器和单片机,所以硬件方面比较简单.方案评价:方案一这种设计需要用到A/D转换电路,感温电路比较麻烦.但方案二电路比较简单,软件设计容易实现,故实际设计中拟采用方案二。2。2.1DS18B20芯片的简介DS18B20是美国著名半导体公司推出的一种可以直接读出被测温度值的温度传感器,而且采用寄生供电方式与单片机相连,具有成本低和易使用的特点。输出信号为数字信号,方便单片机控制和处理,很多外围电路因此可以减掉。且该芯片的线形较好,物理、化学性也相对稳定,在工业生产中可以用来做测量温度的元件。由于AT89C52能够带多个DSB1820,因此容易实现多点测量的目的。轻松的构建传感器网络,并且单片机可以同时进行数码显示与键盘控制,也可以通过RS232串口与上位机进行数据通讯,达到全方位立体监控的效果。采用温度芯片DS18B20测量温度,可以更方便的实现多点测温,也体现了数据数字化的好处,便于测温数据集成显示,也方便了后期对数据的处理及其记录。2。2.2DS18B20的内部结构DS18B20芯片的内部结构如图2—6所示。DS18B20主要包括上下限触发器、储存器与控制逻辑、CRC发生器电源、温度传感器、64位ROM单线借口暂存器。图2—6DS18B20芯片的内部结构图DS18B20温度数字对应关系表如表2-2所示。表2—2DS18B20温度数字对应关系表温度/℃二进制表示十六进制表示+125000001111101000007D0H+8500000101010100000550H+25.062500000001100100000191H+10.125000000001010000100A2H+0。500000000000000100008H000000000000010000000H-0。51111111111110000FFF8HDS18B20温度值格式表如表2-3所示.表2-3DS18B20温度值格式表高字节15141312111098SSSSS2625241/01/01/01/01/0643216低字节76543210232221202_12_22_32_484210。50。250.1250.0625DS18B20的工作过程:发复位DS18B20的负脉冲;收DS18B20的回应脉冲;发ROM命令(33H);发储存和控制命令。DS18B20储存控制命令共有6种,如表2—4所示.表2-4DS18B20存储器控制指令指令约定代码复制48H读数据BEH读电源供电方式B4H温度转换44H读EERAMB8H写数据4EH主机操作ROM的命令有5种,如表2-5所示。表2-5DS18B20的ROM指令指令约定代码读ROM33H匹配ROM55H跳过ROMCCH搜索ROM0F0H报警搜索ECHDS18B20的执行序列:初始化;执行ROM命令,用于定位;执行DS18B20的储存控制命令,用于转换和读数据;DS18B20的I/O信号有回应脉冲、复位脉冲、写0,读0,写1,读1等几种。2.2.3DS18B20的供电方式在硬件上,DS18B20与单片机的连接有两种方法,一种是用寄生电源供电,此时,VCC、GND接地,I/O接单片机I/O;另外一种是VCC接外部电源,GND接地,I/O与单片机的I/O线相连。无论是内部寄生电源还是外部供电,I/O口线要接5kΩ左右的上拉电阻。如图2-7所示,本设计采用的是外部电源供电的方式,且选用的上拉电阻为4。7kΩ。图2-7DS18B20外部电源供电方式图2。2.4DS18B20的引脚功能引脚功能说明:GND为地;I/O是数据输入/输出脚(单线接口,可作寄生供电);UDD为外接供电电源输入端(在寄生电源接线方式时接地)。DS28B20的引脚如图2—8所示。图2—8DS18B20引脚图DS18B20的特点说明:采用单总线技术,与单片机通信只需要一根I/O线,在一根线上可以挂接多个DS18B20。每只DS18B20具有一个独有的,不可修改的64位序列号,根据序列号访问相应的器件。低压供电,电源范围从3.0~5。5V,可以本地供电,也可以直接从数据线窃取电源(寄生电源方式)。测温范围为-55℃~+125℃,在—10℃~+85℃范围内误差为±0.5℃。可编辑数据为9~12位,转换12位温度时间为750ms(最大)。用户可自设定报警上下限温度。报警搜索命令可识别和寻址超过程序限定温度(温度报警条件)的器件。DS18B20的分辨率由用户通过EEPROM设置为9~12位。DS18B20可将检测到温度值直接转化为数字量,并通过串行通信的方式与主控制器进行数据通信。负电压特性,电源极性接反时,温度计不会因为发
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年财务会计重点内容试题及答案
- 采购与供应链协同创新合作组织结构重点基础知识点
- 2025注册会计师复习过程中的反思试题及答案
- 企业财务的稳健经营策略研究试题及答案
- 项目管理考试思维训练试题及答案
- 2025年证券从业资格证有效复习策略试题及答案
- 微生物实验室常见问题探讨试题及答案
- 论项目管理中有效沟通的考查试题及答案
- 2025年证券从业资格的核心考点试题及答案
- 2025年证券从业资格证考试中的经济波动影响分析试题及答案
- 氩弧焊接施工方案
- 排拉表标准格式
- 教科版四年级下册科学全册教案
- 园林史课件-第7讲-中国园林的成熟期(元明清初)和成熟后期(清中、末)-私家园林
- 商业摄影课件
- 第十套广播体操教案
- GB/T 629-1997化学试剂氢氧化钠
- 焦化厂生产工序及工艺流程图
- optimact540技术参考手册
- 第一章电力系统仿真软件介绍课件
- 产品QC工程图 (质量保证工程图)Excel表格
评论
0/150
提交评论