《机电系统综合课程设计》.docx
《《机电系统综合课程设计》.docx》由会员分享,可在线阅读,更多相关《《机电系统综合课程设计》.docx(36页珍藏版)》请在冰豆网上搜索。
《机电系统综合课程设计》
中原工学院机电学院
机电系统综合课程设计说明书
(2014-2015学年第1学期)
专业:
机械电子工程
课设题目:
大气温度检测系统
姓名:
学号:
班级
所在小组:
大气温度检测组
小组分工:
软件的编程和调试
指导教师:
完成日期:
2015年1月14日
机械电子工程教研室
设计任务书
题目
设计大气温度检测系统
设计任务
要求设计合理可行的方案来实时准确的检测大气的温度,可以采用数字显示,也可采用模拟信号进行指针显示等,只要设计符合要求即可。
时间进度
1月1日决定方案采用数字显示;
1月2日进行硬件的选取;
1月3日进行原理图的绘;
1月4日进行PROTUESE的绘制;
1月5日~1月7日进行写编程;
1月8日~1月9日进行编程的调试和仿真;
1月10日~1月11日进行硬件的焊接;
1月12日到1月14日进行设计说明书的书写;
1月15日进行课设答辩;
主要参考书籍和资料
[1]张俊.匠人手记[M].北京航空航天大学出版社,2014.1
[2]刘海威.单片机及应用系统设计原理与实践[M].北京航空航天大学出版社,2009.7
[3]王守中.DIY玩转51单片机[M].电子工业出版社,2013.2
[4]张越,张炎,赵延军.微电子学[J].2007,37(5)
任务分工
备注
大气温度检测课程设计说明书
1.设计目的与意义
微机测量和控制技术在经济迅速发展的今天,已被广泛应用于人类生活中,如工业控制、自动检测、智能仪器仪表、家用电器、等各个方面。
而主控制器是每个控制系统不可或缺的部分,正因为单片机有体积小,重量轻,抗干扰能力强,环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易等优点,所以它是很多设计人员的首选控制器。
而在人们的日常生活或工业生产中,经常要对温度进行检测及控制。
在许多场合器材设备对温度的要求非常高,而传统的温度计反应速度慢、读数麻烦、测量精度不高、误差大,所以需要设计一种高精度的温度计。
为了在很大程度上提高对温度的控制水平,因此以单片机为核心的温度采集与控制系统很有用研发和应用意义。
本文设计一个可以实时检测并显示当前的温度数据的系统,文章以AT89C51单片机,DS18B20温度传感器为硬件基础,主要介绍了相关的硬件电路的连接和相关应用程序。
硬件电路主要包括ATC89C51单片机最小系统,测温电路、LCD显示电路等。
系统程序主要包括主程序、读出温度子程序、计算温度子程序、LCD显示模块的显示程序等。
2.设计内容和要求
2.1方案确定
方案一基于热敏电阻的温度计设计
方案一主要由热敏电阻、电桥电路,指针仪器组成。
热敏电阻的电阻值随温度升高而迅速下降,因为热敏电阻由半导体制成,在半导体内部,自由电子数目随温度的升高增加,导电能力增强,虽然原子振动会加剧并阻碍电子的运动。
但作用对导电性能影响很小,温度上升会使电阻下降。
其原理图如图1所示。
方案二基于DS18B20的数字温度计设计
方案二主要也由数字温度传感器、单片机控制电路、LCD显示电路组成。
DS18B20 测量温度采用了特有的温度测量技术。
它是通过计数时钟周期来实现的。
低温度系数振荡器输出的时钟信号通过由高温度系数振荡器产生的门周期而被计数。
计数器被预置在与- 55 ℃相对应的一个基权值。
如果计数器在高温度系数振荡周期结束前计数到零,表示测量的温度值高于- 55℃,被预置在- 55 ℃的温度寄存器的值就增加1℃,然后重复这个过程,直到高温度系数振荡周期结为止这时温度寄存器中的值就是被测温度值,这个值以16 位形式存放在便笺式存贮器中,此温度值可由主机通过发存贮器读命令而读出,读取时低位在前,高位在后。
斜率累加器用于补偿温度振荡器的抛物线特性。
读出的二进制数可以直接转换为十进制由单片机驱动数LCD显示输出。
其结构框图如图2所示。
图2
方案选择
方案的选择即是传感器的选择。
对比二种方案可以得知,方案一是采用模拟式温度传感器并且采用指针输出,热敏电阻精度低,其中各种转换电路、放大电路的使用连接电路比较复杂,同时指针式仪表读数存在误差没有数字式更为直观。
方案二采用数字式温度传感器。
数字式温度传感器输出的是随温度变化的数字量,更直观,与模拟输出相比,它输出速度响应较慢,但容易与MPU接口。
其还能输出温度数据及相关的温度控制量;能以最简方式构成高性价比、多功能的智能化温度控制系统,并且DS18B20价格相对便宜,益于买到。
更重要的是该控制系统采用单片机控制,而单片机具有灵敏度高、运算速度快、稳定等优点,所以我们选择方案二以DS18B20数字温度传感器进行后续设计。
其原理图如图3所示。
图3
2.2设计内容
本程序的设计的内容主要包括3大模块,主程序模块、DS18b20的温度转换模块、AT89C51温度计算程序模块、LCD显示器的显示程序模块。
首先,DS18B20进行初始化程序,采集大气的温度信号启动转换模块进行数据转换,然后将转换后的数据传入单片机进行数据的处理程序。
待处理完成后送入显示器。
然后显示器进行初始化设置,读取数据并启动其显示程序进行温度的显示。
2.3设计要求
1)DS18B20传感器,LCD显示器的初始化设置;
2)DS18B20传感器的温度转化模块;
3)单片机的读取,写入和处理程序;
4)LCD的显示程序;
5)各个程序模块之间的协调;
6)仿真调试程序;
7)写说明书;
3.设计进度安排
1月5日通过查阅各种资料确定系统程序的整体思路和规划。
1月6日进行DS18B20,LCD的初始化程序、延时程序、温度转换程序的编写。
1月7日进行单片机数据处理程序、显示程序的编写,并进行整体的协调工作。
1月8日进行程序的写入,并编译改正错误。
1月9日进行仿真调试程序。
1月10日进行硬件的调试。
1月12日-1月14日进行设计说明书的书写。
1月15日进行课设答辩。
4.机电系统设计的分析与说明
4.1控制设计
整个系统是由硬件配合软件来实现的,在硬件确定后,编写的软件的功能也就基本定型了。
所以软件的功能大致可分为两个部分:
一是监控,这也是系统的核心部分,二是执行部分,完成各个具体的功能。
(1)程序的整体方法
DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。
在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。
这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±1/2LSB,即0.25℃。
DS18B20温度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
其温度转换计算方法有正负之分:
例如当DS18B20采集到+125℃的实际温度后,输出为07D0H,则:
实际温度=07D0H╳0.0625=2000╳0.0625=1250C。
例如当DS18B20采集到-55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则:
实际温度=370H╳0.0625=880╳0.0625=550C。
经过DS18B20处理过的0、1数据送入单片机后,单片机将其转化成对应的字符。
然后送入LCD
假如数据为t,则t/100得到十位数进行显示,t%100/10得到各位数,t%10得到小数点的后一位。
如果得到的温度在零下,则在前面加“—”号,并计算小数部分和整数部分的值。
(2)主程序
本系统的主程序的主要功能是负责温度的读取并进行实时显示,当其读出并处理DS18B20的测量的当前温度值时,然后延时一定的时间后再次读取温度进行显示【9】。
其程序流程见图4-7所示。
本系统主程序如下,它包含和编程的准备工作和调用子程序功能。
这种模块化编成结构,对于程序的移植再用提供了很大的方便,而且条理清晰,仿真出现错误时便于修改。
其主程序流程图如4所示。
图4
(3)子程序流程图
数字温度计系统子程序主要包含:
读温度子程序、转换温度子程序、计算温度子程序。
(a)读温度子程序流程
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。
则读温度子程序流程图如图5所示。
图5
(b)转换温度子程序流程图
转换温度子程序流程图如图6所示。
图6
(c)计算温度子程序流程图
计算温度子程序流程图如7、8图所示。
图7图8
(4)各个模块的程序
(a)LCD显示模块程序,调试如图9。
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLCD_RS=P2^5;
sbitLCD_RW=P2^6;
sbitLCD_EN=P2^7;
#defineLCD_DataP0
#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}
floatM;
ucharMin_Flag=0;
ucharcodeTemp_Disp_Title[]={"temperture:
"};
ucharCurrent_Temp_Display_Buffer[]={"TEMP:
"};
ucharTemp_Value[]={0x00,0x00};
ucharDisplay_Digit[]={0,0,0};
voidDelay(uintt)
{
while(--t);
}
/****************************延时20us*************************/
voidDelay_20us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************延时time20us*********************/
voiddelay_20us(uinttime)
{
uinti;
for(i=0;i