温度检测系统设计报告DOC.docx

上传人:b****4 文档编号:24381964 上传时间:2023-05-26 格式:DOCX 页数:28 大小:483.21KB
下载 相关 举报
温度检测系统设计报告DOC.docx_第1页
第1页 / 共28页
温度检测系统设计报告DOC.docx_第2页
第2页 / 共28页
温度检测系统设计报告DOC.docx_第3页
第3页 / 共28页
温度检测系统设计报告DOC.docx_第4页
第4页 / 共28页
温度检测系统设计报告DOC.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

温度检测系统设计报告DOC.docx

《温度检测系统设计报告DOC.docx》由会员分享,可在线阅读,更多相关《温度检测系统设计报告DOC.docx(28页珍藏版)》请在冰豆网上搜索。

温度检测系统设计报告DOC.docx

温度检测系统设计报告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]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1