远程温度测量课程设计报告.docx

上传人:scccc 文档编号:12681399 上传时间:2021-12-05 格式:DOCX 页数:33 大小:903.74KB
返回 下载 相关 举报
远程温度测量课程设计报告.docx_第1页
第1页 / 共33页
远程温度测量课程设计报告.docx_第2页
第2页 / 共33页
远程温度测量课程设计报告.docx_第3页
第3页 / 共33页
远程温度测量课程设计报告.docx_第4页
第4页 / 共33页
远程温度测量课程设计报告.docx_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《远程温度测量课程设计报告.docx》由会员分享,可在线阅读,更多相关《远程温度测量课程设计报告.docx(33页珍藏版)》请在三一文库上搜索。

1、.项目编号:2015-2016学年第一学期微机原理(单片机)课程设计总结报告项目名称: 远程温度测量 班级: 姓名: 学号:;微机原理(单片机)课程设计任务书项目名称:远程温度测量内容与要求: 上位机:完成界面设计与通讯程序(1)能够显示温度值,能够设定报警温度阈值上限、下限,当超出报警温度阈值上限、下限时,温度值后又HIGH或LOW提示字母。(2)能够发送短信,显示出收信人姓名,收信人电话,当前测得温度值;能够定时发送温度测量情况短信。(3)每隔1秒将测得的温度值保存至文档中,如超过阈值,温度值后又HIGH或LOW提示字母(4)可以对串口进行设置下位机:完成电路设计与控制程序(1)采用DS1

2、8B20采集温度,采用GSM模块发送短信。(2)通过串口与上位机通讯,并传输温度值,接受阈值设置。(3)发送短信成功时,蜂鸣器鸣叫提示。并将短信内容显示在LCD屏第2行(4)将当前温度显示在LCD液晶屏上,当超出报警温度阈值上限、下限时,温度值后又HIGH或LOW提示字母。项目组任务分担评价表姓名分担任务组内评价陈墨LCD显示模块设计与编程,下位机串口通讯程序,DS18B20模块及单片机下位机编程5张新宇上位机温度显示与设置,上位机串口路通讯程序,上位机文件保存及温度判断程序5课程设计报告评分表内容总体方案硬件设计软件设计结果分析明细清单问题分析心得体会参考文献程序代码格式规范总分陈墨得分张新

3、宇得分 微机原理(单片机)课程设计报告目录一、总体方案1二、硬件设计1三、软件设计3四、结果分析或项目所实现的功能、指标5五、明细清单7六、设计调试中遇到的疑难问题及解决方法8七、心得体会与建议8参考文献9附录A.下位机程序9附录B.上位机程序图2629一、总体方案远程温度测量总体框图如图1-1所示。文件打印温度测量模块LCD显示模块控 制 器上位机GSM模块图1-1 远程温度测量总体功能模块示意图 图中, 温度测量模块是利用DS18B20进行温度的测量和采集,并直接传递给控制器51单片机。同时控制器也可以控制温度测量模块的状态。LCD模块可以显示由控制器得到的温度值,并根据上位机给出的阈值上

4、下限显示出HIGH或者LOW。上位机不但可以通过串口改变控制器参数,而且可以利用GSM模块直接发送短信。同时下位机控制器也可以命令GSM模块发送短信。上位机还可以将温度值和是否超过阈值情况打印在txt文档中。二、硬件设计本项目下位机控制器采用的是51系列单片机STC80C52RC型号。其内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路,属于80C51增强型单片机版本。其价格低廉,低功耗,基本符合经济、环保需求。本项目温度测量传感器采用的DS18B2

5、0。DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。三个引脚中间为温度传输接口,其余两个分别为VCC和地。本项目LCD显示模块采用LCD1602液晶屏,它由若干个5X7点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。其成本低廉,字符显示效果好,经济效果好。本项目硬件电路连接图如图2-1所示。 图2-1 硬件电路连接图温度模块的DS18B20中间的2号引脚接单片机P32,1接地3接VCC。LCD1602直接插在扩展插针接口即可,即1接地,2接VCC,3接地(带保护电阻),7-14依次

6、接P0-P7,15接VCC,16接地,其余悬空。具体接线如图2-1所示。三、软件设计本项目下位机采用51单片机做控制器。由DS18B20得到温度数据后,传递给51单片机,然后单片机根据得到的数据,在LCD液晶屏上显示出相应的数值和符号。同时,上位机和下位机进行串口通信,上位机改变下位机参数设定,下位机的温度数据也传递到上位机。(1)主程序流程图如3-1所示。图3-1 主程序流程图(2)读取温度值模块流程图如图3-2所示。开始传感器初始化发跳过读序列号指令发温度转换指令读温度值低字节读温度值高字节高低字节合并返回温度值开始图3-2 读取温度值模块流程图本项目串行通信采用的波特率为19200,串口

7、采用方式2的工作方式,其计算公式如下:波特率=(2SMOD/32)*(T1溢出率)考虑电源管理寄存器PCON,取PCON为0x80,所以波特率加倍,令TH1=0xFD,最终得到波特率为19200.四、结果分析或项目所实现的功能、指标本项目可实现温度测量功能,可以在LCD液晶屏和上位机上同时显示温度值。同时还具有远程阈值上下限设置功能,可以在上位机设置温度阈值上下限,超过上限上下位机同时会有HIGH的显示,低于下限上下位机也同时又LOW的显示。如图4-1和图4-2所示,测量温度值为25.7度,高于温度上限0度,则上位机和下位机都会显示HIGH字样。(由于拍照时间差会导致温度有微小变化) 图4-1

8、 上位机显示结果(1) 图4-2 下位机显示结果(1) 当温度低于温度下限时,如图4-3和4-4所示,上位机和下位机都会显示LOW字样。 图4-3 上位机显示结果(2) 图4-4 下位机显示结果(2)当温度在设置的温度阈值上下限之间时,下位机只显示温度,上位机会显示NORMAL,证明温度正常。五、明细清单明细及价格清单如表5-1所示序号名称型号/规格数量价格(元)1单片机最小系统板STC89C52RC1702温度传感器DS18B20113液晶显示屏LCD160213 4GSM模块GTM900 1110表5-1 明细及价格清单价格总计70+1+3+110=184(元)。六、设计调试中遇到的疑难问

9、题及解决方法张新宇:1、Labview将温度保存在txt文件中,文件名义一定要和Labview程序里面的txt文件命名一致,否则不但不能实现存储其他功能也会出现错误。2、Labview即使内有Visa模板,但是也必须安装Visa驱动才能正常使用,不安装该驱动串口永远无法读取。3、Labview不能将主体时序调的太慢,由于是串口通信,太慢会出现错误,“等待下一个整数倍毫秒”函数毫秒倍数设置为10100为宜。 陈墨:1、电源管理寄存器PCON最高位为1时波特率要乘2,所以设置TH1为0xFD波特率才为19200。2、DS18B20要考虑好延时,以保证温度读取完成,避免温度读取失败。3、温度低于0度

10、时是要将数值取反加1,转换成补码。七、心得体会与建议备注:正式成稿时,删除此备注。每位小组成员需分别说明对知识的深度认识,和学习方法的总结;对项目的进一步展望,可作哪些方面的改进;对老师教学有哪些建议。如:张新宇:本次课设我学习了之前从未用过的Labview软件,了解了该如何用Labview进行串口通讯,以及制作一个上位机程序。它独特的图形编程方法让我受益颇多。软件中的帮助功能也非常强大,往往根本不需要上网搜索打开帮助查阅即可知道问题出在哪里。对于本课题希望老师能够将GSM收发短信和温度测量分开,6天时间要完成这两个任务真的压力很大,也希望能够更换GSM模块,华为公司的GTM900B不但已经停

11、产,而且网上资料少,大部分人都采用西门子公司的产品,我想换用西门子公司的产品有助于同学们的学习。 陈墨:本次课设我结合了上学期所学的51单片机理论知识,第一次完成了一个完整的项目。我学会了该如何写一个完整的代码,该如何将程序烧进单片机,该如何进行单片机程序的调试。在课设中我发现了查阅资料的重要性,初始化程序,中断,以及LCD输出程序都可以通过参考资料来完善。课程建议希望以后能够在理论学习时增加单片机的学习课时,让我们对于单片机有更多的了解和认识,这样才能更科学,更容易地完成本次课设。参考文献1 周月霞,孙传友.DS18B20硬件连接及软件编程J.传感器世界.2001(12)2 农静,郑宗亚,刘

12、志杰.单总线数字温度传感DS18B20原理及应用J. 贵州师范大学学报(自然科学版). 2007(03)3 易丽华,黄俊. 基于AT89C51单片机与DS18B20的温度测量系统J.电子与封装.2009(05)4 周青云,王建勋. 基于USB接口与LabVIEW的数据采集系统设计J. 实验室研究与探索. 2011(08)5 王建勋,周青云. 基于DS18B20和LabVIEW的温度监测系统J. 实验室研究与探索.2012(03)6 吕向锋,高洪林, 马亮,王新华. 基于LabVIEW串口通信的研究J. 国外电子测量技术.2009(12)附录A.下位机程序#include"Reg52.

13、H" / 调用MCS51寄存器头文件#include"intrins.H"#include "LCD1602.H"#include "DS18B20B.H"#include"stdio.h"#include<math.h>#define uchar unsigned char#define uint unsigned int#define SKIP_ROM_COMMAND 0xCC /跳过ROM匹配操作 #defineCONVERT_TEMPERATURE0x44/启动温度转换#defineR

14、EAD_SCRATCHPAD0xBE/ 读温度中间暂存寄存器#define N 45872/N=50ms/1.09usUINT8 PresencePlusA; /DS18B20A应答脉冲/*定义引脚单片机 DS18B20P16 DQA */ sbit DQA = P32; /定义DS18B20A数据线long Voltage_value;int y=0,z=0;uchar flag,b,t_cnt;float a4;int t,z;unionint t;uchar c2; temp2;float Temp1,aa=30,bb=26;uchar tt2;uchar rxbuf5;uchar rb

15、i=0;uint TTT;/*初始化DS18B20A.*/void DS18B20A_Init( void ) DQA = 0; /MCU产生复位信号 DelayUs(130); /低电平至少保持480Us DelayUs(130); DQA = 1; / MCU释放信号线 DelayUs(40); /延时15-60us,等待DS18B20A应答,为了保证准确,最好在60US以后再采集数据PresencePlusA = DQA; /接收应答,返回0为成功,1为失败 DelayUs(30); /延时/*向DS18B20A发送一个字节数据.*/void DS18B20A_WiteData( UIN

16、T8 mByte ) UINT8 i; for( i = 0; i < 8 ; i+ ) DQA = 0; / MCU拉低信号线,启动传输 DQA = mByte & 0x01; /发送数据到信号线上 DelayUs(50); /延时至少大于60us,小于120usDQA = 1; /MCU释放信号线 mByte >>= 1; /数据右移一位 DelayUs(10); / 连续写的话,稍微延时/*从DS18B20读取数据,返回读取到的数据*/UINT8 DS18B20A_ReadData( void ) UINT8 i; UINT8 Data = 0; for( i

17、= 0; i < 8 ; i+ ) DQA = 0; / MCU拉低信号线,启动传输,低电平需大于1us Data >>= 1; /数据右移一位 DQA = 1; /MCU释放信号线 if( DQA = 1 ) /单片机读取信号线上数据,需要在15US以内采集完 Data |= 0x80; DelayUs(40); / 延时45us return ( Data ); /返回读取到的数据/*DS18B20A温度转换. 返回UINT16 Temp:返回读出的温度.*/UINT16 TemperatureA_Conversion( ) UINT8 HighByte; UINT8 L

18、owByte;UINT16 Temp; / 温度 DS18B20A_Init(); /初始化DS18B20Aif( PresencePlusA = 0 ) DS18B20A_WiteData( SKIP_ROM_COMMAND ); / 跳过ROM匹配操作 DS18B20A_WiteData( CONVERT_TEMPERATURE ); / 启动温度转换 while( !DS18B20A_ReadData() ); / 等待转换完成 DS18B20A_Init(); / 再次初始化DS18B20Aif( PresencePlusA = 0 ) DS18B20A_WiteData( SKIP_

19、ROM_COMMAND ); / 跳过ROM匹配操作DS18B20A_WiteData( READ_SCRATCHPAD ); / 读取温度 LowByte = DS18B20A_ReadData(); HighByte = DS18B20A_ReadData(); Temp = ( (UINT16)HighByte << 8 ) | LowByte; / 计算温度 return Temp; /返回读出的温度 /*串口部分声明*/void Uart_init(void);void Send_data( void );unsigned int SenData; /用来存接收与发送的值

20、void change(float x);/*串口程序发送*/void Send_data (void) SBUF=SenData; /SUBF接受/发送缓冲器 while(TI=0); TI=0;/*串口初始化*/void Uart_init(void) /串口初始化 SCON = 0x50; /REN=1允许串行接受状态,串口工作模式1 TMOD|= 0x20; /定时器工作方式2 PCON|= 0x80; TH1 = 0xFD; /baud*2 reload value 19200、数据位8、停止位1。效验位无 (11.0592) TL1 = 0xF3; TR1 = 1; ES = 1;

21、 /开串口中断 EA = 1; / 开总中断 / IE = 0x0;void uartSend(uchar s)uchar i;for(i=0;i<2;i+)SBUF=si;while(!TI);TI=0;/*主函数*/void main( void ) UINT8 DisplayBuf16; / 存储转换后的温度数据 int Temp0; UINT8 MinusTempFlag = 0; / 负数温度标志/*timer0*/TMOD=0x21;TH0=(65536-N)/256;TL0=(65536-N)%256;ET0=1;TR0=1;t_cnt=0;/*uart*/TMOD=0x2

22、0;TH1=0xFD; /波特率19200TL1=0xFD;TR1=1;SM0=0;SM1=1;REN=1;ES=1;/*/ DelayMs( 200 );/ 上电延时 LCD1602_Init(); DelayMs( 200 ); LCD1602_WriteUSerCode(); / 写入用户自定义字符 DQA = 1; LCD1602_SetDisplayPosition(0,1); /显示显示位置 LCD1602_WriteString("YQ516 Board V2.2"); / 显示字符 DelayMs( 2000 );Uart_init(); while(1)

23、Temp0 = TemperatureA_Conversion( ); / DB18B20A温度转换并显示 temp2.t=Temp0; if( Temp0 & 0x8000 ) /如果温度为负数 MinusTempFlag = 1; Temp0 = Temp0; / 取反 Temp0 += 1; / 取反后加1 else MinusTempFlag = 0; Temp1 = (float)Temp0 * 0.0625; / 计算温度 if( MinusTempFlag ) / 如果是负温度 sprintf(DisplayBuf," -%7.3f",Temp1);

24、/将Temp1的数据打印到DisplayBuf中,浮点数,7位,3位小数点 else sprintf(DisplayBuf," %7.3f ",Temp1); / 将Temp1的数据打印到DisplayBuf中,浮点数,7位,3位小数点 LCD1602_SetDisplayPosition(0,1); / 显示显示位置 LCD1602_WriteString(DisplayBuf); / 显示温度 LCD1602_SetDisplayPosition(9,1); / 设置自定义字符位置 LCD1602_WriteData(0x00); / 写入温度左上角点LCD1602_S

25、etDisplayPosition(10,1); LCD1602_WriteData('C'); / 写入温度C if(Temp1>aa) LCD1602_SetDisplayPosition(12,1); LCD1602_WriteData('H'); LCD1602_SetDisplayPosition(13,1); LCD1602_WriteData('I'); LCD1602_SetDisplayPosition(14,1); LCD1602_WriteData('G'); LCD1602_SetDisplayPos

26、ition(15,1); LCD1602_WriteData('H'); if(Temp1<bb) LCD1602_SetDisplayPosition(12,1); LCD1602_WriteData('L'); LCD1602_SetDisplayPosition(13,1); LCD1602_WriteData('O'); LCD1602_SetDisplayPosition(14,1); LCD1602_WriteData('W'); LCD1602_SetDisplayPosition(15,1); LCD1602

27、_WriteData(' '); if(Temp1>bb)&&(Temp1<aa)LCD1602_SetDisplayPosition(12,1); LCD1602_WriteData(' '); LCD1602_SetDisplayPosition(13,1); LCD1602_WriteData(' '); LCD1602_SetDisplayPosition(14,1); LCD1602_WriteData(' '); LCD1602_SetDisplayPosition(15,1); LCD16

28、02_WriteData(' '); t=(int)Temp1; void T0_time() interrupt 1TH0=(65536-45872)/256;TL0=(65536-45872)%256;t_cnt+;if(t_cnt=20)/TTT=(uint)Temp1;/tt0=(uchar)temp2;/tt1=(uchar)(TTT&0x0F);uartSend(temp2.c);t_cnt=0; /*主函数结束*/*中断4*/void serial() interrupt 4if(RI)rxbufrbi=SBUF;RI=0;rbi+;if(rxbuf0!=

29、0xff) rbi=0;else if(rbi=5)bb=(rxbuf1*255+rxbuf2)/100;aa=(rxbuf3*255+rxbuf4)/100;rbi=0;else TI=0;/* LCD1602接口子程序.*/#include"reg52.h" /调用头文件,单片机内部寄存器都定义在此,用的时候需要先调用typedef unsigned char UINT8; /给unsigned char重新定义一个别名UINT8,用的时候直接写UINT8就可以 typedef unsigned int UINT16; /给unsigned int重新定义一个别名UIN

30、T16,用的时候直接写UINT16就可以/* 引脚定义 单片机 LCD1602P24 RSP25 RWP26 ENP0 D0 - D7*/sbit LCD_RS = P10; / 数据、指令选择信号sbit LCD_RW = P11; / 读写选择信号sbit LCD_EN = P12; / 读写使能信号#define DATA_PORT P0 / 数据端口/*1.RS = 1为数据操作;RS = 0为写指令或读状态.2.RW = 1为读选通;RW = 0为写选通.3. 在EN下降沿,数据被锁存到LCD1602,在EN高电平期间,数据被读出.4. D0 - D7,数据总线.*/*命令码*/#d

31、efine CLEAR_DISPLAY 0x01 / 清屏/* 功能设置 */#define SET_OPERATING_MODE 0x38 / 工作方式设置/* 0X38: 8位数据接口;两行显示;5 * 8 点阵字符 */* 显示开关控制 */#define SET_DISPLAY 0x08 / 显示命令#define SET_DISPLAY_D 0x04 / 开显示#define SET_DISPLAY_C 0x02 / 开光标#define SET_DISPLAY_B 0x01 / 开闪烁/* 输入方式设置 */#define SET_INPUT_MODE 0x06 /读写数据后,AC

32、自动加一,画面不动/* DDRAM地址设置 */#define SET_DDRAM_ADDRESS1 0x80 / 第一行显示地址0x00-0x2F #define SET_DDRAM_ADDRESS2 0xC0 / 第一行显示地址0x40-0x67/*延时微秒.输入: UINT8 Us:要延时的时间 3+ US*2.*/void DelayUs( UINT8 Us )while(-Us);/*延时毫秒.输入: UINT8 Ms:要延时的Ms时间.*/void DelayMs( UINT16 Ms )UINT8 i;while (Ms-) for ( i = 0; i < 114; i+ ); / 大概1MS,不是很精确 /*检查LCD1602是否忙.BusyFlag = 1,LCD1602正忙,需等待;BusyFlag = 0,LCD1602空闲,可以写;*/void LCD1602_CheckBusy( void ) UINT8 BusyFlag; / 忙标志 BusyFlag = 1; / 先置位忙标志 while ( BusyFlag )

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1