温度检测系统设计报告DOC.docx
《温度检测系统设计报告DOC.docx》由会员分享,可在线阅读,更多相关《温度检测系统设计报告DOC.docx(28页珍藏版)》请在冰豆网上搜索。
温度检测系统设计报告DOC
计算机硬件(嵌入式)综合实践
设计报告
温度检测系统设计与制作
一.系统概述
1.设计内容
本设计主要从硬件和软件部分介绍了单片机温度控制系统的设计思路,简单说明如何实现对温度的控制,并对硬件原理图和程序框图作了简洁的描述。
还介绍了在单片机控制系统的软硬件设计中的一些主要技术关键环节,该系统主要以AT89S52单片机为核心,同时利用DS18B20温度传感器采集温度,采用4位LED显示管实施信息显示。
AT89S52单片机设计的温度检测电路是本次设计的主要内容,是整个单片机温度控制系统设计中不可缺少的一部分,该系统对温度进行实时采集与检测。
本设计介绍的单片机自动控制系统的主要内容包括:
系统概述、元器件选择、系统理论分析、硬件设计、部分软件设计及主要技术性能参数。
2.元器件选择
单片机AT89S52:
1个
22uF电容:
2个
4.7K电阻:
1个
万能板:
1个
杜邦线:
若干
单排排针:
若干
DS18B20温度传感器:
2个
4位LED显示管:
1个
二.软件功能设计及程序代码
1.总体系统设计思想框图如下:
2.主程序流程图
3.DS18B20数据采集流程图
4.程序代码
①、温度记录仪
#include
#include
#include
#include
#include<18B20.h>
#include
bitrec_flag=0;//记录温度标志
ucharautobac_tim=0;//自动跳转延时
ucharcodelogos[]="****NTMUSIC****";
ucharincmin=0;//计分钟数
bitoverflag=0;//数据溢出标志位
ucharmode=1;//系统运行模式
uchartempmode;//模式缓存
voidinit()
{
lcd_init();
eeprom_init();
/***********开机效果****************/
display(l1,"StartingNT",1);
longdelay(10);
display(l2,"Ver3.0.1",1);
longdelay(20);
write_cmd(0x01);//清屏
/*************************************/
sys_init();
}
voidcomms()//模式公共进程
{
time2times();//时间格式转换
avtemp=gettemp();//获取温度
avtemp2avtemps();//温度格式转换
date_counter();//获取当前日期
date2dates();//日期格式转换
display(l2+1,times,0);
display(l2+11,avtemps,0);
}
voidprogs(uinti,uintk)//进度条
{
uintj;
write_cmd(0xc0);
for(j=0;j<(i*16/k);j++)
{
write_lcddata(0xff);
}
}
voidnormal_run()//无记录运行模式
{
comms();
if(time[2]%10<5)
{
display(l1,logos,1);
}
else
{display(l1,"***",0);display(l1+13,"***",0);display(l1+3,dates,0);}
incmin=0;
}
voidrecding_run()//记录模式运行模式
{
uintWDTPT;//临时写地址指针变量存放
comms();
recfrq2recfrqs();
if(time[2]%10<5)
{
if(mss>50)display(l1,"",0);
else
display(l1,"R",0);
display(l1+1,"-NUM",0);
display(l1+5,datcounts,0);display(l1+9,"**EV",0);display(l1+13,recfrqs,0);
}
else
{display(l1,"***",0);display(l1+13,"***",0);display(l1+3,dates,0);}
/***********定时记录*************/
if(incmin>=recfrq)//触发记录功能
{
incmin=0;//1清除进入记录标志
if(WDTP>10240)//20个扇区
overflag=1;
if(overflag==0)//如果数据尚未溢出
{
if(date_recf==1)
//记录年-月-日(格式:
'z'+年+月+日)为十制数值
{
date_recf=0;//清除记录日期标志
write_isp(WDTP,'z');//日期起始标志
write_isp(WDTP,date[0]);
write_isp(WDTP,date[1]);
write_isp(WDTP,date[2]);//记录年、月、日
}
/***********记录时间************/
write_isp(WDTP,time[0]);
write_isp(WDTP,time[1]);//记录时分
/***********记录温度************/
write_isp(WDTP,avtemp/100);
write_isp(WDTP,avtemp%100);
/**********记录加一*********/
datcount++;
/**********写回数据指针****************/
WDTPT=WDTP;
if(FDTP==512)
{
del_isp(0);//清空记录表
FDTP=0;
}
write_isp(FDTP,WDTPT/256);
write_isp(WDTP,WDTPT%256);
write_isp(WDTP,datcount/256);
write_isp(WDTP,datcount%256);
FDTP=WDTP;
WDTP=WDTPT;
//交互完成
}
if(overflag==1)//如果数据溢出
{
display(l1,"Error!
",1);
display(l2,"DataOverflow!
",1);
autobac_tim=0;
while(autobac_tim!
=3);
display(l2,"",1);
}
}
}
voiddata_run()//查看记录模式
{
uchari=0;
bitbacf=0;
uintcou_t=0;//计数缓存变量
uchartemp=0;//临时数据缓存
uintcd=0;//进度条统计数据
autobac_tim=0;
while(bacf==0)
{
if(autobac_tim>10)
bacf=1;
display(l1,"ReadyforExport",1);
display(l2,"D-DateT-TempL!
",1);
if(RI==1)
{
autobac_tim=0;
RI=0;
ser_rec=SBUF;
switch(ser_rec)
{
case'L':
//格式化
display(l1,"Format?
",1);
display(l2,"Y-YesN-No",1);
while
(1)
{
if(RI==1){RI=0;ser_rec=SBUF;autobac_tim=0;}
if(ser_rec=='Y')//确定格式化
{
display(l1,"Formatting...",1);
display(l2,"",1);
eeprom_format();
display(l1,"FormatSuccessed",1);
longdelay(3);
break;
}
if(ser_rec=='N')break;
if(autobac_tim>10)
break;
}
autobac_tim=0;
break;
case'D':
//输出日期时间
display(l1,"ExportingDate..",1);
display(l2,"",1);
RDTP=512;//将读指针放到首位
cou_t=datcount;
cd=0;
while(cou_t!
=0)
{
if(RI==1)RI=0;
if(SBUF=='B')
{
display(l1,"Exportstopped",1);
cd=0;
longdelay(3);
break;
}
temp=read_isp(RDTP);//预读判断
RDTP--;
if(temp=='z')
{
RDTP++;
prf_date();//输出年月日
}
prf_time();//输出时间
RDTP=RDTP+2;
cou_t--;
cd++;
progs(cd,datcount);
}
if(datcount==0)
{display(l1,"NoData!
",1);
longdelay(3);}
autobac_tim=0;
break;
case'T':
//温度输出
display(l1,"ExportingTemp..",1);
display(l2,"",1);
RDTP=516;//将读指针放到首位
cd=0;
cou_t=datcount;
while(cou_t!
=0)
{
if(RI==1)RI=0;
if(SBUF=='B')
{
display(l1,"Exportstopped",1);
cd=0;
longdelay(3);
break;
}
temp=read_isp(RDTP);//预读判断
RDTP--;
if(temp=='z')
{
RDTP=RDTP+6;
}
else
{
RDTP=RDTP+2;
}
prf_temp();
cou_t--;
cd++;
progs(cd,datcount);
}
if(datcount==0)
{display(l1,"NoData!
",1);
longdelay(3);}
autobac_tim=0;
break;
case'B':
bacf=1;break;
}
ser_rec=0;
}
}
mode=tempmode;display(l2,"",1);
}
voidadj_settings()//设置模式
{
uchari=0;//Counter
bitendadj=0;//调整完毕标志
ucharser_temp=0;//接收缓存
write_cmd(0x01);//清屏
times[5]=':
';//恢复数点
display(l1,"Settime-",1);
display(l1+11,"hour",0);
display(l2+11,"[]",0);
display(l2+1,times,0);
display(l2+12,recfrqs,0);
write_cmd(0xC1+i);
write_cmd(0x0f);//显示闪烁光标
autobac_tim=0;//初始化自动返回时间常数
while(!
endadj)
{
if(RI==1)//接收到数据
{
RI=0;
autobac_tim=0;//自动返回清零
ser_temp=SBUF;
if((ser_temp>47)&&(ser_temp<58))//进行数值判断
{
if(i<8)
times[i]=ser_temp;
if(i>8&&i<14)
recfrqs[i-11]=ser_temp;
if(i>=14)
dates[i-13]=ser_temp;
i++;
}
if(ser_temp=='F')i++;//往前一步
if(ser_temp=='B')endadj=1;//退出调整
switch(i)//显示处理
{
case2:
i++;display(l1+11,"min",0);break;
case5:
i++;display(l1+11,"sec",0);break;
case8:
i=i+3;display(l1+11,"frq",0);break;
case14:
i++;display(l1+4,"dateyear",0);
display(l2,"",1);
break;
case17:
i++;display(l1+11,"moun",0);break;
case20:
i++;display(l1+11,"day",0);break;
case23:
endadj=1;break;
}
if(i<14)
{
display(l2+1,times,0);display(l2+12,recfrqs,0);
write_cmd(0xC1+i);
}
else
{
display(l2+3,dates,0);
write_cmd(0xC1+i-11);
}
}
if(endadj==1)//写回参数
{
time[0]=(times[0]-48)*10+times[1]-48;time[1]=(times[3]-48)*10+times[4]-48;
time[2]=(times[6]-48)*10+times[7]-48;
recfrq=(recfrqs[0]-48)*100+(recfrqs[1]-48)*10+recfrqs[2]-48;
date[0]=(dates[2]-48)*10+dates[3]-48;
date[1]=(dates[5]-48)*10+dates[6]-48;
date[2]=(dates[8]-48)*10+dates[9]-48;
}
if(autobac_tim>10)
endadj=1;
}
display(l2,"",1);
write_cmd(0x0c);//正常显示
}
voidmain()
{
init();
while
(1)
{
switch(mode)
{
case1:
normal_run();break;
case2:
recding_run();break;
case3:
data_run();break;
}
if(RI==1)
{
RI=0;
ser_rec=SBUF;
switch(ser_rec)
{
case'A':
adj_settings();break;
case'R':
mode=2;break;
case'N':
mode=1;break;
case'H':
tempmode=mode;mode=3;break;
case'D':
ser_sents(dates);break;
case'T':
times[5]=':
';ser_sents(times);break;
case'W':
ser_sents(avtemps);break;
case'C':
ser_sents(datcounts);break;
case'F':
ser_sents(recfrqs);break;
}
ser_rec=0;
}
}
}
voidmiao()interrupt1//秒产生中断
{
TH0=(65535-9200)/256;
TL0=(65535-9200)%256;
mss++;
if(mss==100)
{mss=0;time[2]++;autobac_tim++;}
if(autobac_tim==255)
autobac_tim=244;//保持溢出
if(time[2]>=60)
{
time[2]=0;time[1]++;incmin++;
}
if(time[1]>=60)
{
time[1]=0;time[0]++;
}
if(time[0]>=24)
{
time[0]=0;dayincf=1;//天自增标志置位
date_recf=1;//日期需要记录
}
/*将返回时间[时分秒*/
}
②、system.h
/******系统I/O******/
/*****LCDI/O*******/
sbitRS=P1^2;
sbitLCDEN=P1^1;
/*****DS18B20*******/
sbitDS=P1^0;
#defineucharunsignedchar
#defineuintunsignedint
ucharcodenum[]={'0','1','2','3','4','5','6','7','8','9'};
/********时间相关变量************/
uchartime[]={23,28,00};//时分秒(10进制数)
uchartimes[]="15:
37:
00";//时分秒(ASCII码)
ucharmss=0;
uchardate[]={11,11,11};//年月日(10进制数)
uchardates[]="2011-10-29";//年月日(ASCII码)
bitdayincf=0;
bitdate_recf=0;//日期记录标志
/***********记录频率变量*******************/
ucharrecfrq=2;//记录频率(10进制数)
ucharrecfrqs[]="001";//记录频率(ASCII码)
uintdatcount=0;//记录总数
uchardatcounts[]="0000";
/**************串口接收变量****************/
ucharser_rec;
/*************温度相关变量****************/
uintavtemp=0;
ucharavtemps[]="00.0";
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidlongdelay(ucharz)
{
for(z;z>0;z--)
delay(255);
}
voidser_sent(ucharsendata)//串口发送单字节
{
SBUF=sendata;
while(TI!
=1);
TI=0;
delay
(1);
}
voidser_sents(ucharstrings[])//串口发送字符串
{
uchari=0;
while(strings[i]!
='\0')
{
ser_sent(strings[i]);
delay(20);
i++;
}
ser_sent('\n');
}
voiddate_counter()//日期转变
{
ucharn;//月天数暂存
uintyear=2000+date[0];//将年转换为标准年
if(dayincf==1)
{
dayincf=0;
switch(date[1])//根据月份制定月天数
{
case1:
n=31;break;case2:
if(year%4==0||year%400==0){n=29;}else{n=28;}break;
case3:
n=31;break;case4:
n=30;break;
case5:
n=31;break;case6:
n=30;break;
case7:
n=31;break;case8:
n=31;break;
case9:
n=30;break;case10:
n=31;break;
case11:
n=30;break;case12:
n=31;break;
}
date[2]++;
if(date[2]>n)
{
date[2]=1;
date[1]++;
}
if(date[1]>12)
{
date[1]=1;date[0]++;
}
}
}
voidsys_init()//系统初始化
{
EA=1;TMOD=0x21;TR1=1;REN=1;SM0=0;SM1=1;
TH1=0xfA;
TL1=0xfA;
ET0=1;//允许定时器中断0
TH0=(65535-9200)/256;
TL0=(65535-9200)%256;//定时器中断0初值
TR0=1;//开中断(秒)
ES=0;
}
voidrecfrq2recfrqs()//10进制记录频率转字符串
{
recfrqs[0]=num[recfrq/100];recfrqs[1]=num[recfrq%100/10];
recfrqs[2]=num[recfrq%100%10];
datcounts[0]=num[datcount/1000];
datcounts[1]=num[datcount%1000/100];
datcounts[2]=num[datcount%1000%100/10];
datcounts[3]=num[datcount%1000%100%10];
}
voidtime2times()//10进制时间转字符串
{
times[0]=num[time[0]/10];times[1]=num[time[0]