温度检测系统设计报告.(DOC)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机硬件(嵌入式)综合实践
设计报告
温度检测系统设计与制作
一.系统概述
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
bit rec_flag=0;//记录温度标志
uchar autobac_tim=0;//自动跳转延时
uchar code logos[]="****NT MUSIC****"; uchar incmin=0;//计分钟数
bit overflag=0;//数据溢出标志位
uchar mode=1;//系统运行模式
uchar tempmode;//模式缓存
void init()
{
lcd_init();
eeprom_init();
/***********开机效果****************/ display(l1," Starting NT",1);
longdelay(10);
display(l2," Ver 3.0.1",1);
longdelay(20);
write_cmd(0x01);//清屏
/*************************************/ sys_init();
}
void comms() //模式公共进程
{
time2times(); //时间格式转换
avtemp=gettemp();//获取温度
avtemp2avtemps();//温度格式转换
date_counter();//获取当前日期
date2dates();//日期格式转换
display(l2+1,times,0);
display(l2+11,avtemps,0);
}
void progs(uint i,uint k)//进度条
{
uint j;
write_cmd(0xc0);
for(j=0;j<(i*16/k);j++)
{
write_lcddata(0xff);
}
}
void normal_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;
}
void recding_run() //记录模式运行模式
{
uint WDTPT;//临时写地址指针变量存放
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);