




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、综合设计报告书全套设计加扣 3346389411或3012250582设计项目: 温度测控系统设计 班 级: 电科151 姓 名: 学 号: XXXXXXXXXX 指导老师: 一、 综合设计要求用单片机开发一个温度测量控制系统,显示用16*2的液晶,实时显示测量温度,加热输出采用通断控制,用发光二极管来模拟,能设置目标温度,能设置报警温度阈值,超过了进行报警,报警采用液晶屏幕显示。二、 方案分析和设计看到设计任务的时候,因为主要是进行温度测量,所以必然会用到温度传感器。那么什么是温度传感器呢。温度传感器(temperature transducer)是指能感受温度并转换成可用输出信号的传感器。
2、温度传感器是温度测量仪表的核心部分,品种繁多。按测量方式可分为接触式和非接触式两大类,按照传感器材料及电子元件特性分为热电阻和热电偶两类。在经过一番选择后,最终确定用DS18B20作为需要的温度传感器,原因如下。1.DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 2.因为之前用过热敏电阻代替,精度不够高,也想尝试下新的传感器。其次就是16*2的液晶显示模块,因为要求中不需要显示中文,所有就采用LCD1602模块为所需的液晶显示屏。加热部分用发光二极管模拟,并采用通断控制,那么就可以利用定时器中断发出PWM波达到需要的要求
3、即可。其次是设置目标温度和警报温度。显然,需要加至少两个按键来控制。进行报警的部分就可以使用简单的蜂鸣器即可。当温度达到警报温度的时候,蜂鸣器就响。因为是LCD屏,所有发挥部分加了一个万年历的模块,采用DS1302时钟模块。本可以加个计算器模块,但是估计IO口设计完上面的一系列模块后就不够用了,所以不打算加上计算器模块。三、 硬件设计主要元器件的选择:MCU 芯片选择的是AT89C51,LCD显示屏采用的是LCD1602,在仿真电路中用的是LM016L,和LCD1602性质相同。温度传感器用的是DS18B20。发挥部分用的是DS1302时钟模块。模块设计最小系统:这个部分的设计相对比较简单,首
4、先是系统时钟电路,需要一个12M的外部晶振,其次需要两个30pf电容。搭配起来就是一个系统时钟了。接下来就是复位电路了,需要一个10K电阻,一个10f的电解电容,还有一个开关。设计好后的最小系统如图所示:液晶显示:LCD1602按照LCD1602手册连接好电路如图所示:DS18B20温度模块: 单线数字温度传感器,所以操作的要求比较高,读取数据的时候需要控制在微秒量级。初始化:主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。做
5、为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。写操作:写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总
6、线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。读操作:对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。DS
7、1302模块:DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS
8、1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。加热模块:用的LED代替,在加热的时候LED在PWM波的作用下会出现周期为4s的亮灭,代表加热的进行。在停止加热的时候,会灭掉。按键功能:按键1是万年历按键,按键2是设置目标温度和警报温度按键,按一下进入目标温度设置,按两下进入警报温度设置。按键3是加温度按键,按键4是减温度按键。按键5是温度显示按键。硬件电路图:硬件PC
9、B板图:四、 软件设计LCD显示模块部分代码编写:在LCD硬件部分介绍的时候,介绍了LCD1602读写的步骤和时序。按步骤可以编写出以下的初始化和读写代码。其中的清屏(LcdWriteCom(0x01))这一步在主函数里面的用处很多。DS18B20温度显示模块:DS18B20对时序的要求很高,要控制在微秒量级之间,初始化、读、写中的任何一步有误差就会显示不出温度。按照硬件部分的介绍可以写出DS18B20部分的代码如下:初始化:写操作:读操作:DS1302模块代码:根据硬件部分对DS1302的解释,也可以写出如下的代码PWM波代码:通过定时器中断1输出周期为4s的方波,实现两秒亮,两秒灭。目标温
10、度和警报温度设定:达到目标温度后LED灭和未达到目标温度LED周期性亮灭:达到警报温度后蜂鸣器响:五、 软件仿真按下温度显示按键,显示当前温度:按下目标温度设置键,出现Aim_temp设置。此时按下加和减键可以实现目标温度设置。继续按下温度设置键,跳转到警报温度设置页面,按下加和减号键可以设置警报温度。此时,按下温度显示键:如果目标温度高于当前温度,LED灯会周期性亮灭,模拟加热环节。如果目标温度低于当前温度,则LED灭。模拟停止加热环节。如果当前温度高于设定的警报温度,蜂鸣器响。目标温度(52)高于当前温度(48),LED亮。目标温度(52)低于当前温度(55),LED灭:当前温度高于警报温
11、度,蜂鸣器响:按下万年历显示模块,显示日期(初始化值):六、 总结体会通过本次的综合设计,让我学会了如何通过元器件手册编写相应的初始化等程序。尤其是DS18B20这个温度传感器模块。稍有延迟误差就读不出具体的温度数据,会一直显示-0.006。调了很久,才把延迟范围控制在要求的范围内。此外,对于LCD1602的部分,要是想显示单独一个变量数字,需要在末尾加上0。例如:要在LCD上显示目标温度Aim_temp,需要拆分成高位和地位,分别用Aim_h和Aim_l来表示,那么要显示出来就需要Aim_h+0才可以显示出来。总之,这次综合设计让我更加意识到了单片机的强大和有趣,希望未来能在这条路上越走越远
12、。七、 参考文献1. DS1302时钟芯片介绍2. DS18B20模块介绍3. LCD1602显示屏模块介绍附件:程序清单(因篇幅有限,仅写出主函数部分代码)/*2018年9月12日10:19:01*/#include<reg51.h>#include"lcd.h"#include"temp.h"#include"general.h"#include"ds1302.h"/* 函数名 : main* 函数功能 :进入目标温度和报警温度设置页面后,需要返回温度显示页面,必须先返回万年历页面,此时再按温度显示
13、键,方可进入温度显示页面* 输入 : 无* 输出 : 无*/全局函数void LcdDisplay(int);void DS1302_LcdDisplay();void RES();/结果运算函数void aim();void alarm();void change_temp();/-定义全局变量typedef unsigned int u16; unsigned char Runmodel = Calendar;unsigned char Temp = "Temperature" /温度unsigned char Date = "calendar"/万
14、年历unsigned char Aim_tp = "AIM_TEMP"unsigned char Alarm_tp = "Alarm_tp"unsigned char Aim_temp = 27;/目标温度初始值unsigned char Alarm_temp = 95; /报警温度初始值unsigned char Aim_h,Aim_l,Alarm_h,Alarm_l,Alarm_mh;int Now_temp;/IO口设定#define GPIO_KEY P1sbit K1 = P20;/选择按键1,进入万年历模式sbit K2 = P21;/选择按
15、键2,进入温度测量模式sbit K3 = P22; /选择按键3,进行目标温度和最高温度警报设置sbit K4 = P10;/自加按键sbit K5 = P11;/自减按键sbit led = P23;sbit beep=P15; /蜂鸣器响应sbit reset = P32; /复位按键void delay(u16 i) while(i-); void main()unsigned char i = 0;Isrint();LcdInit(); /初始化LCD1602while(1)Runmodel = Run_Model();if(K3 = PutDown)Delay10ms(1);if(K
16、3 = PutDown)LcdWriteCom(0x01);LcdWriteCom(0x83);for(i = 0;i<8;i+)LcdWriteData(Aim_tpi);/第一次按下K3进行目标温度设定LcdWriteCom(0xc5);aim();LcdWriteData(Aim_h);LcdWriteData(Aim_l);LcdWriteData(0xdf);LcdWriteData('C');while(1)Delay10ms(10); /这里必须加个延迟,不然温度会一下子加三下if(K4 = PutDown)/设置目标温度进行自加Delay10ms(2);i
17、f(K4 = PutDown)Aim_temp+; /设置目标温度进行自加aim();LcdWriteCom(0xc5);LcdWriteData(Aim_h);LcdWriteData(Aim_l);LcdWriteData(0xdf);LcdWriteData('C');if(K5 = PutDown) /设置目标温度进行自减Delay10ms(1);if(K5 = PutDown)Aim_temp-;aim();LcdWriteCom(0xc5);LcdWriteData(Aim_h);LcdWriteData(Aim_l);if(K3 = PutDown)Delay10
18、ms(1);if(K3 = PutDown)LcdWriteCom(0x01); /清屏,进入下一个警报温度设置页面LcdWriteCom(0x83);for(i = 0;i<8;i+)LcdWriteData(Alarm_tpi);LcdWriteCom(0xc5);alarm();LcdWriteData(Alarm_mh);LcdWriteData(Alarm_h); LcdWriteData(Alarm_l);LcdWriteData(0xdf);LcdWriteData('C');while(1)Delay10ms(10);if(K4 = PutDown)Del
19、ay10ms(1);if(K4 = PutDown)Alarm_temp+;alarm();LcdWriteCom(0xc5);LcdWriteData(Alarm_mh);LcdWriteData(Alarm_h); LcdWriteData(Alarm_l);LcdWriteData(0xdf); LcdWriteData('C');if(K5 = PutDown)Delay10ms(1);if(K5 = PutDown)Alarm_temp-;alarm();LcdWriteCom(0xc5);LcdWriteData(Alarm_mh);LcdWriteData(Ala
20、rm_h); LcdWriteData(Alarm_l);LcdWriteData(0xdf); LcdWriteData('C');if(K1 = PutDown)Delay10ms(1);if(K1 = PutDown)Runmodel = Calendar;break;if(K1 = PutDown)Delay10ms(1);if(K1 = PutDown)Runmodel = Calendar;break; if(Runmodel = Calendar)/万年历模式LcdWriteCom(0x01);LcdWriteCom(0x83);for(i=0; i<8;i
21、+)LcdWriteData(Datei);Ds1302Init();LcdWriteCom(0x01);while(1) Ds1302ReadTime(); DS1302_LcdDisplay(); Runmodel = Run_Model(); if(Runmodel = Temp_test| K3 = PutDown) break; if(Runmodel = Temp_test)/温度测试模式LcdWriteCom(0x01);LcdWriteCom(0x83);for(i=0; i<11;i+)LcdWriteData(Tempi);LcdWriteCom(0xca);LcdW
22、riteData(0xdf);LcdWriteData('C'); /摄氏度while(1) LcdDisplay(Ds18b20ReadTemp();/Delay1ms(1000);/1s钟刷一次 Now_temp = Ds18b20ReadTemp(); change_temp(); if(Now_temp< Aim_temp) /如果目前温度低于目标温度,那么将开启加热模式 EA = 1; if( Now_temp> Aim_temp) /如果目前温度高于目标温度,那么将关闭加热模式 led =1; EA = 0; if(Now_temp >= Alar
23、m_temp) while(1) beep=beep; delay(10); if(Now_temp < Alarm_temp) break; if(K1 = PutDown) Delay10ms(1);if(K1 = PutDown)Runmodel = Calendar;LcdWriteCom(0x01); /清屏,这里不能用初始化!break; if(K3 = PutDown) Delay10ms(1);if(K3 = PutDown)break; /* 函数名 : LcdDisplay()* 函数功能 : LCD显示读取到的温度* 输入 : v* 输出 : 无*/void Lcd
24、Display(int temp) /lcd显示 unsigned char datas = 0, 0, 0, 0, 0; /定义数组 float tp; if(temp< 0)/当温度值为负数 LcdWriteCom(0xc3);/写地址 80表示初始地址 LcdWriteData('-'); /显示负/因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=temp;tp=temp;temp=tp*0.0625*100+0.5;/留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点/后面的数自动去掉,不
25、管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就/算由?.5,还是在小数点后面。 else LcdWriteCom(0xc3);/写地址 80表示初始地址 LcdWriteData('+'); /显示正tp=temp;/因为数据处理有小数点所以将温度赋给一个浮点型变量/如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;/留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点/后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就/算加上0.5,还是
26、在小数点后面。datas0 = temp / 10000;datas1 = temp % 10000 / 1000;datas2 = temp % 1000 / 100;datas3 = temp % 100 / 10;datas4 = temp % 10; LcdWriteCom(0xc4); /写地址 80表示初始地址LcdWriteData('0'+datas0); /百位 LcdWriteCom(0xc5); /写地址 80表示初始地址LcdWriteData('0'+datas1); /十位LcdWriteCom(0xc6);/写地址 80表示初始地址
27、LcdWriteData('0'+datas2); /个位 LcdWriteCom(0xc7);/写地址 80表示初始地址LcdWriteData('.'); /显示 .LcdWriteCom(0xc8); /写地址 80表示初始地址LcdWriteData('0'+datas3); /显示小数点 LcdWriteCom(0xc9); /写地址 80表示初始地址LcdWriteData('0'+datas4); /显示小数点 void DS1302_LcdDisplay()LcdWriteCom(0x80+0X40);LcdWriteData('0'+TIME2/16);/时LcdWriteData('0'+(TIME2&0x0f); LcdWriteData(':');LcdWriteData('0'+TIME1/16);/分LcdWriteData('0'+(TIME1&0x0f);LcdWriteDat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论