1、机电系统综合课程设计中原工学院机电学院机电系统综合课程设计说明书(2014-2015学年第 1 学期)专 业: 机械电子工程 课设题目: 大气温度检测系统 姓 名: 学 号: 班 级 所在小组: 大气温度检测组 小组分工: 软件的编程和调试 指导教师: 完成日期: 2015 年 1 月 14 日机械电子工程教研室设计任务书题 目设计大气温度检测系统设计任务要求设计合理可行的方案来实时准确的检测大气的温度,可以采用数字显示,也可采用模拟信号进行指针显示等,只要设计符合要求即可。时间进度1月1日决定方案采用数字显示;1月2日进行硬件的选取;1月3日进行原理图的绘;1月4日进行PROTUESE的绘制
2、;1月5日1月7日进行写编程;1月8日1月9日进行编程的调试和仿真;1月10日1月11日进行硬件的焊接;1月12日到1月14日进行设计说明书的书写;1月15日进行课设答辩;主要参考书籍和资料1张俊.匠人手记M. 北京航空航天大学出版社,2014.12刘海威.单片机及应用系统设计原理与实践M.北京航空航天大学出版社,2009.73王守中.DIY玩转51单片机M. 电子工业出版社,2013.24张越,张炎,赵延军.微电子学J.2007,37(5)任务分工备 注 大气温度检测课程设计说明书1.设计目的与意义微机测量和控制技术在经济迅速发展的今天,已被广泛应用于人类生活中,如工业控制、自动检测、智能仪
3、器仪表、家用电器、等各个方面。而主控制器是每个控制系统不可或缺的部分,正因为单片机有体积小,重量轻,抗干扰能力强,环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易等优点,所以它是很多设计人员的首选控制器。而在人们的日常生活或工业生产中,经常要对温度进行检测及控制。在许多场合器材设备对温度的要求非常高,而传统的温度计反应速度慢、读数麻烦、测量精度不高、误差大,所以需要设计一种高精度的温度计。为了在很大程度上提高对温度的控制水平,因此以单片机为核心的温度采集与控制系统很有用研发和应用意义。本文设计一个可以实时检测并显示当前的温度数据的系统,文章以AT89C51单片机, DS18B20温度传
4、感器为硬件基础,主要介绍了相关的硬件电路的连接和相关应用程序。硬件电路主要包括ATC89C51单片机最小系统,测温电路、LCD显示电路等。系统程序主要包括主程序、读出温度子程序、计算温度子程序、LCD显示模块的显示程序等。2.设计内容和要求 2.1方案确定方案一基于热敏电阻的温度计设计方案一主要由热敏电阻、电桥电路,指针仪器组成。热敏电阻的电阻值随温度升高而迅速下降,因为热敏电阻由半导体制成,在半导体内部,自由电子数目随温度的升高增加,导电能力增强,虽然原子振动会加剧并阻碍电子的运动。但作用对导电性能影响很小,温度上升会使电阻下降。其原理图如图1所示。 方案二基于DS18B20的数字温度计设计
5、方案二主要也由数字温度传感器、单片机控制电路、LCD显示电路组成。DS18B20测量温度采用了特有的温度测量技术。它是通过计数时钟周期来实现的。低温度系数振荡器输出的时钟信号通过由高温度系数振荡器产生的门周期而被计数。计数器被预置在与-55相对应的一个基权值。如果计数器在高温度系数振荡周期结束前计数到零,表示测量的温度值高于-55,被预置在-55的温度寄存器的值就增加1,然后重复这个过程,直到高温度系数振荡周期结为止这时温度寄存器中的值就是被测温度值,这个值以16位形式存放在便笺式存贮器中,此温度值可由主机通过发存贮器读命令而读出,读取时低位在前,高位在后。斜率累加器用于补偿温度振荡器的抛物线
6、特性。读出的二进制数可以直接转换为十进制由单片机驱动数LCD显示输出。其结构框图如图2所示。图2方案选择方案的选择即是传感器的选择。对比二种方案可以得知,方案一是采用模拟式温度传感器并且采用指针输出,热敏电阻精度低,其中各种转换电路、放大电路的使用连接电路比较复杂,同时指针式仪表读数存在误差没有数字式更为直观。方案二采用数字式温度传感器。数字式温度传感器输出的是随温度变化的数字量,更直观,与模拟输出相比,它输出速度响应较慢,但容易与MPU接口。其还能输出温度数据及相关的温度控制量;能以最简方式构成高性价比、多功能的智能化温度控制系统,并且DS18B20价格相对便宜,益于买到。更重要的是该控制系
7、统采用单片机控制,而单片机具有灵敏度高、运算速度快、稳定等优点,所以我们选择方案二以DS18B20数字温度传感器进行后续设计。其原理图如图3所示。图3 2.2设计内容本程序的设计的内容主要包括3大模块,主程序模块、DS18b20的温度转换模块、AT89C51温度计算程序模块、LCD显示器的显示程序模块。首先,DS18B20进行初始化程序,采集大气的温度信号启动转换模块进行数据转换,然后将转换后的数据传入单片机进行数据的处理程序。待处理完成后送入显示器。然后显示器进行初始化设置,读取数据并启动其显示程序进行温度的显示。2.3设计要求1)DS18B20传感器,LCD显示器的初始化设置; 2)DS1
8、8B20传感器的温度转化模块;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控制设计整个系统是由硬件配合软件来实现
9、的,在硬件确定后,编写的软件的功能也就基本定型了。所以软件的功能大致可分为两个部分:一是监控,这也是系统的核心部分,二是执行部分,完成各个具体的功能。 (1)程序的整体方法DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25进行比较,若低于0.25,温度寄存器的最低位就置0;若高于0.25,最低位就置1;若高于0.75时,温度寄存器的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5,四舍五入最大量化误差为1/2LSB,即0.25。DS18B20温
10、度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。其温度转换计算方法有正负之分:例如当DS18B20采集到+125的实际温度后,输出为07D0H,则:实际温度=07D0H0.0625=20000.0625=1250C。例如当DS18B20采集到-55的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则:实际温度=370H
11、0.0625=8800.0625=550C。经过DS18B20处理过的0、1数据送入单片机后,单片机将其转化成对应的字符。然后送入LCD假如数据为t,则t/100得到十位数进行显示,t%100/10得到各位数,t%10得到小数点的后一位。如果得到的温度在零下,则在前面加“”号,并计算小数部分和整数部分的值。 (2) 主程序本系统的主程序的主要功能是负责温度的读取并进行实时显示,当其读出并处理DS18B20的测量的当前温度值时,然后延时一定的时间后再次读取温度进行显示【9】。其程序流程见图4-7所示。本系统主程序如下,它包含和编程的准备工作和调用子程序功能。这种模块化编成结构,对于程序的移植再用
12、提供了很大的方便,而且条理清晰,仿真出现错误时便于修改。其主程序流程图如4所示。图4 (3) 子程序流程图 数字温度计系统子程序主要包含:读温度子程序、转换温度子程序、计算温度子程序。 (a)读温度子程序流程读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。则读温度子程序流程图如图5所示。图5(b)转换温度子程序流程图 转换温度子程序流程图如图6所示。图6(c)计算温度子程序流程图 计算温度子程序流程图如7、8图所示。 图7 图8 (4)各个模块的程序(a)LCD显示模块程序,调试如图9。#include #include #defin
13、e uchar unsigned char#define uint unsigned intsbit LCD_RS = P25;sbit LCD_RW = P26;sbit LCD_EN = P27;#define LCD_Data P0 #define delayNOP() _nop_();_nop_();_nop_();_nop_();float M; uchar Min_Flag=0;uchar code Temp_Disp_Title=temperture : ;uchar Current_Temp_Display_Buffer=TEMP: ;uchar Temp_Value=0x00
14、,0x00;uchar Display_Digit=0,0,0;void Delay(uint t) while(-t);/*延时20us*/ void Delay_20us(void) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /*延时 time20us* */ void delay_20us(uint time) uint i; for (i=0;itime;i+); void DelayXus(uint t) uchar i; while(t-) for(i=0;i200;i+); bit LCD_Busy_Check()
15、 bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(LCD_Data&0x80); LCD_EN=0; return result;void Write_LCD_Command(uchar CMD) while(LCD_Busy_Check(); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); LCD_Data = CMD; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0;void Writ
16、e_LCD_Data(uchar DAT) while(LCD_Busy_Check(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; LCD_Data = DAT; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0;void LCD_Initialise() Write_LCD_Command(0x01); /清屏 DelayXus(5); Write_LCD_Command(0x38); /设置16*2显示,5*7点阵,8位数据接口 DelayXus(5); Write_LCD_Command(0x0c); /画面开,
17、禁止光标显示闪烁 DelayXus(5); Write_LCD_Command(0x06); /当读写一个字节后,光标自动加1 DelayXus(5); void Set_LCD_POS(uchar p) Write_LCD_Command(p|0x80); void Display_Temperature(uint num) uchar m,n,q,i; m=num/100; /得到十位 n=num%100/10; /得到个位 q=num%10; /对上述整数求余得到小数点后第一位 Display_Digit2 = m; Display_Digit1 = n; Display_Digit0
18、= q; if(Min_Flag) Current_Temp_Display_Buffer7 = -; else Current_Temp_Display_Buffer7 = ; Current_Temp_Display_Buffer11 = Display_Digit0 + 0; Current_Temp_Display_Buffer10 = .; Current_Temp_Display_Buffer9 = Display_Digit1 + 0; Current_Temp_Display_Buffer8 = Display_Digit2 + 0; if(Display_Digit2 = 0
19、) Current_Temp_Display_Buffer8 = ; Set_LCD_POS(0x00); for(i=0;i16;i+) Write_LCD_Data(Temp_Disp_Titlei); Set_LCD_POS(0x40); for(i=0;i16;i+) Write_LCD_Data(Current_Temp_Display_Bufferi); Set_LCD_POS(0x4d); Write_LCD_Data(C); void main() uint Temperature; LCD_Initialise(); Delay(40000); while(1) Temper
20、ature=TempValue(); Display_Temperature(Temperature); DelayXus(100); (b)DS18B20的采集模块程序,调试图如10.#include #include #define uchar unsigned char#define uint unsigned intsbit ds18B20_data = P20;#define ds18B20_READ_ROM 0x33 / 读 ROM 指令#define ds18B20_MATCH_ROM 0x55 / 匹配 ROM 指令#define ds18B20_SKIP_ROM 0xCC /
21、 跳过 ROM 指令 #define ds18B20_SEARCH_ROM 0xF0 / 搜索 ROM 指令#define ds18B20_ALARM_SEARCH 0xEC / 报警搜索指令 #define ds18B20_WRITE_SCRATCHPAD 0x4E / 写暂存寄存器指令 #define ds18B20_READ_SCRATCHPAD 0xBE / 读暂存寄存器指令#define ds18B20_COPY_SCRATCHPAD 0x48 / 复制暂存寄存器指令#define ds18B20_CONVERT_T 0x44 / 启动温度转换指令#define ds18B20_RE
22、CALL_E2 0xB8 / 重新调出 E2PROM 的数据 #define ds18B20_READ_POWER_SUPPLY 0xB4 / 读电源 #define delayNOP() _nop_();_nop_();_nop_();_nop_();float M; uchar Min_Flag=0;/*温度探头程序*/ bit Rstds18B20(void); / DS18B20 复位程序, 返回 0-有设备连接,1-无设void Writeds18B20(uchar ); / 写一个字节 ds18B20 数据、命令子程序 uchar Readds18B20(void); / 读一个字
23、节ds18B20 数据子程序uint TempValue(void); / 启动 ds18B20 温度转换程序 /*ds18B20 复位程序*/ bit Rstds18B20(void) / 返回,0-有设备连接;1-无设备连接 uchar i; bit RstFlag; RstFlag = 1; ds18B20_data = 1; _nop_(); ds18B20_data=0; / 发送复位脉冲,时间480us delay_20us(40); / 延时 480-960us ds18B20_data = 1; / 拉高总线,延时 15us-60us 后等待ds18B20 响应 delay_2
24、0us(2); / 15us-60us for (i=0;i6;i+) / 60us-240us delay_20us(1); if (ds18B20_data=0) RstFlag=0; / 接收 ds18B20 的存在信号 delay_20us(20); / 240us return RstFlag; /*写一个字节 ds18B20 数据、命令子程序*/ void Writeds18B20(uchar ch) uchar i; ds18B20_data = 1; / 拉高总线,延时 1us,准备启动 _nop_(); for (i=0;i1; _nop_(); /先写低位,后写高位 /*读
25、一个字节 ds18B20 数据子程序*/ uchar Readds18B20(void) uchar i,ch; ch = 0; ds18B20_data = 1; / 拉高总线,延时 1us,准备启动 _nop_(); for (i=0;i1; if (ds18B20_data = 1) / 拉高总线,准备接收数据 ch = ch+0x80; delay_20us(2); return ch; /*启动 ds18B20 温度转换程序* /uint TempValue(void) uchar temp1=0,temp2=0; uint T=0; if(!Rstds18B20() Rstds18
26、B20(); Writeds18B20(ds18B20_SKIP_ROM); Writeds18B20(ds18B20_CONVERT_T); if(!Rstds18B20() Rstds18B20(); Writeds18B20(ds18B20_SKIP_ROM); / 跳过 ROM 操作 Writeds18B20(ds18B20_READ_SCRATCHPAD); /* 发读 ds18B20 数据, 前两位是温度值 */ temp1 = Readds18B20(); / 温度值的低位数据 temp2 = Readds18B20(); / 温度值的高位数据 T = temp1+(temp28
27、); if(temp2&0xfc)=0xfc) Min_Flag=1; M=T+1; else Min_Flag=0; M=T; return (M*0.625); /将测量的数据转换成实际温度 else return 0xffff; else return 0xffff; void main() uint Temperature; Delay(40000); while(1) Temperature=TempValue(); DelayXus(100); (3)主程序,调试图如11。void main() uint Temperature; LCD_Initialise(); Delay(40000); while(1) Temperature=TempValue(); Display_Temperature(Temperature); DelayXus(100)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1