1、1数字显示温度计论文学校: 华侨大学学院: 信息科学与工程学院 班级:10 级 集成电路设计与集成系统组别: 自控 06 组组员:* * * 2目 录摘要3第一章 总体设计方案 31.1 系统功能概述 31.2 设计思路 31.3 总体设计框图 5第二章 硬件设计 52.1 主电路原理图 52.2 DS18B20 温度传感器52.3 DS1302 时钟电路 62.4 声光报警电路 62.5 LCD1602 显示电路 7第三章 软件设计 73.1 系统整体流程图.7第四章 总结与体会 83摘要随着现代化信息技术的飞速发展,单片机技术已经十分普及,在实时检测和自动控制的单片机应用系统中,单片机往往
2、是作为核心部件来使用。本论文介绍了一种以单片机 AT89C52 为主要控制器件,以 DS18B20 为温度传感器通过 LCD 液晶屏传送数据,实现温度显示的新型数字温度计。该数字温度计的测量范围为 0100,显示分辨率为 0.1。高、低两路限温控制点可在 0100 0C 范围内独立设置,当温度达到高、低限温控制点发出声光报警。由于采用了温度传感器 DS18B20 作为检测元件,与传统的温度计相比,本文设计的数字温度计减少了外部的硬件电路,具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。DS18B20 温度计还可以在高温报警、远距离多点测温控制等方面进行应用开发。该系统结构简单,
3、抗干扰能力强,适合于各种环境下进行现场温度测量,可广泛应用于工业控温系统、温度计、消费产品以及其它温度测控系统。关键词:单片机AT89C52;温度传感器DS18B20;数字温度计;LCD1602液晶屏显示 4第一章 总体设计方案1.1系统功能概述该系统运用了时钟芯片和温度传感器的相结合,并采用液晶屏显示,能够同时显示日历。时间以及多路温度。可以通过按键来调时 调整预设温度的上下限,并设有声光报警,但温度低于最小值或高于最高值时,会提示报警。能过按时保存温度,通过按键能够把保存的温度调取出来。 1.2设计思路:1) 、单片机的选择方 案 1: 采 用 传 统 的 STC89C52RC 作 为 电
4、 机 的 控 制 核 心 。 单 片 机 算 术 运 算功 能 强 , 软 件 编 程 灵 活 、 自 由 度 大 , 可 用 软 件 编 程 实 现 各 种 算 法 和 逻 辑 控 制 ,并 且 由 于 其 功 耗 低 、 体 积 小 、 技 术 成 熟 和 成 本 低 等 优 点 , 使 其 在 各 个 领 域 应 用广 泛 。方案 2:采用 STM32F103ZET6 微控制器(ARM cortexM3 内核) ,还带有非易失性 512k Flash 程序存储器。它是一种高性能、低功耗的 32 位 CMOS 微处理芯片,市场应用最多。其主要特点如下:512KB Flash ROM,72M
5、 的主频,片内集成 AD、DA, 以及具有 DMA、SPI 总线。由 于 本 系 统 对 CPU 运 算 速 度 要 求 不 高 , 不 需 要 执 行 很 复 杂 的 运 算 , 加 上成 本 上 和 队 员 各 自 的 技 术 特 点 考 虑 , 综 合 起 来 选 STC89C52RC 较 适 合 本 系 统的 要 求 。2) 、温度传感器的选择方案 1:温度传感器 DS18B20 是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,能直接读出被测温度,并且可根据实际要求通过简单的编程实现 912 位的数字值读数方式。DS18B20 具有独特的单线接口,仅需一个端口引脚进行通信,
6、并且多个 DS18B20 可并联在惟一的三线上,实现多点组网功能;用户还可根据需要定义报警设置,十分方便。方案 2:采用热敏电阻和 AD 转换电路来实现温度的测量综合考虑成本和转换效率以及转换精度等问题我们选用结构简单功能强大的DS18B20 型温度传感器3) 、时钟电路的选择5方案 1:DS1302 是一种高性能、低功耗、带 RAM 的实时时钟芯片,它可以对年、月、日、日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达 2.55.5V。采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据。DS1302 内部有一个 318 的用于临时性存放数据的
7、RAM 寄存器。DS1302 是 DS1202 的升级产品,与 DS1202 兼容,但增加了主电源和后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。方案 2:STC89C52 有 3 个内部定时器中断,因此我们可以直接采用单片机内部定时器来实现年月日时分秒的计时的功能综合考虑以上两种方案,由于 DS1302 的高性能低功耗且内部自带RAM,可以对年、月、日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽,编程简单,有后备电源。所以我们选用 DS1302 作为时钟芯片。4) 、温度的显示可以采用 LED 数码管来显示,LED 亮度高、醒目,但是电路复杂,占用资源多且信息量小。
8、而采用液晶显示器有明显的优点:工作电流比 LED 小几个数量级,故其功耗低;尺寸小,厚度约为 LED 的 1/3;字迹清晰、美观,寿命长,使用方便,故本设计采用 LCD1602 来显示温度。选用 LCD1602 字符型液晶显示器,因 LCD1602 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个不同的点阵字符图形,当显示是 LCD 从单片机得到此代码,并把它存储到显示数据 RAM(DDRAM)中。LCD 的字符发生器根据此代码可产生所需显示信息的 5*7 点阵图形。字符在 LCD 显示屏上的位置地址可通过数据总线,由单片机送至 LCD 指令寄存器。5)、报警电路采用红、黄、绿
9、三个 led 作为光报警信号,同时增加了一个蜂鸣器作为声报警信号1.3 总体设计框图:6第二章 硬件设计:2.1、主电路原理图2.2、DS18B20 温度传感器原理图2.2 、DS1302 原理图72.4、声光报警电路2.5、LCD1602 显示电路8第三章 软件设计3.1 系统整体流程图是否 是开始系统初始化 开 始 是否有按键按下调时 调温 读取温度按时保存温度判断温度是否过高过低显示声光报警第四章 总结与体会作为一名大二学生,在本次设计实践中,深深地体会到“工欲善其事,必先利其器”的道理,生活中无论做什么事都应该事前有充分的准备,做到心中有数,才能更好的完成任务。经过不断的学习和反复的实
10、践,辛勤努力有了回报,终于做出了一个简单的系统,虽然这个系统的功能非常的简单,而且在实际的运用中,也许还有些不足。从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更应该这样,程序只有在经常地写与读的过程中才能提高,这就是我在这次设计中的最大收获。9源代码:#include#define uint unsigned int#define uchar unsigned charsbit rs=P20; /1602sbit rw=P21; /1602sbit en=P22; /1602sbit DQ=P23; /ds18b20sbit
11、T_IO=P34;/ds1302-6sbit T_RST=P35;/ds1302-5sbit T_CLK=P36;/ds1302-7sbit menu=P30; /选择调整位sbit add=P31; /调整+sbit dec=P32; /调整-sbit H_LED=P10; /大于上限温度sbit L_LED=P12; /低于下限温度sbit light=P17; /LED 报警sbit sound=P17; /蜂鸣器报警sbit ACC0=ACC0;sbit ACC7=ACC7;/累加器 A 51 单片机原理中有介绍uchar seconde,minite,hour,day,month,y
12、ear;/秒,分,时 ,日,月,年uint tvalue1,tvalue2;/温度uchar read_Memory=0;/读温度时被标志位 1int H1=310,L1=270,H2=310,L2=270;/温度上下限uchar count=0; /对选择调整位进行计数,0 正常显示,1 调整秒,2 分,3 时,4 日,5 月,6 年uchar counter0=0,counter1=0,counter2=0;/对定时器 0,1 进行计数,没 250ms加 1,满 40(10 秒)稳定存储一次uchar P31=1,P32=1,P30=1,flag=1; /配合调整+,配合调整 -,配合选择
13、调整位,标志位uchar clk_time7=0,disdata4=0; /秒,分,时寄存器初始值,温度百位,十位,个位,十分位char number=0,number1=0; /number 表示数组的序号,number1 用于调用温度时,保存当前组号uchar Memory_seconde6=0;/此数组用于记录定点测温时间秒uchar Memory_minite6=0;/此数组用于记录定点测温时间分uchar Memory_hour6=0;/此数组用于记录定点测温时间时uchar Memory_day6=0;/此数组用于记录定点测温时间日uchar Memory_month6=0;/此数
14、组用于记录定点测温时间月uchar Memory_year6=0;/此数组用于记录定点测温时间日int Memory_tvalue16=0;/此数组用于记录定点测温 1602 第二行温度uint Memory_tvalue26=0;/此数组用于记录定点测温 1602 第一行温度 10uchar code str2=0x28,0x1A,0x6D,0x83,0x03,0x00,0x00,0xC2;/ROM1 对应1602 第二行uchar code str1=0x28,0x16,0x4F,0xA5,0x03,0x00,0x00,0xBD;/ROM2 对应1602 第一行uchar code tab
15、le=“ - - 26.5C“;uchar code table2=“ : : 28.5C“;void delay(uint ms) /一毫秒延时uint i,j;for(j=0;j0;i-) T_IO=ACC0;T_CLK=0; T_CLK=1;ACC=ACC1;/*DS1302:读取操作(下降沿)*/uchar read_byte(void)uchar i;for(i=0;i1; T_CLK = 1;T_CLK = 0;ACC7 = T_IO;return(ACC);/*DS1302:写入数据(先送地址,再写数据)*/ void write_1302(uchar addr,uchar da
16、te) T_RST=0; /停止工作T_CLK=0; T_RST=1; /重新工作write_byte(addr); /写入地址write_byte(date); T_RST=0;T_CLK=1;12/*DS1302:读取数据(先送地址,再读数据)*/uchar read_1302(uchar addr)uchar temp;T_RST=0; /停止工作T_CLK=0; T_RST=1; /重新工作write_byte(addr); /写入地址temp=read_byte();T_RST=0;T_CLK=1; /停止工作return(temp);/*DS18b20 初始化程序*/void se
17、t_18b20() /初始化DQ=1;delay1us(4);DQ=0;delay1us(500);DQ=1;delay1us(40); /*DS18b20 写数据*/void write_18b20(uchar date)/写数据uchar i;for(i=8;i0;i-)DQ=0;DQ=datedelay1us(10);DQ=1;date=date1;/*DS18b20 读数据*/uchar read_18b20() /读数据13uchar i,tempx;for(i=8;i0;i-) DQ=0;tempx=tempx1;DQ=1;if(DQ)tempx=tempx|0x80;delay1
18、us(10); return (tempx);/*DS18b20 匹配 ROM*/void Matchrom_18b20(uchar a) /匹配 ROMchar j;write_18b20(0x55); /发送匹配 ROM 命令if(a=1)for(j=0;jH1) /对应 1602 第二行温度值write_com(0x80+0x40+9); delay(1);write_data(H);15delay(1);if(counter2%2)=0) /counter 为偶数时声光报警H_LED=0; / 达到报警要求时,指示灯常亮sound=0; / 达到报警要求时,报警灯闪烁light=0;e
19、lseH_LED=0;sound=1;light=1;if(counter2%10)=0) /防干扰L_LED=1; if(tvalue2H2) /对应 1602 第一行温度值write_com(0x80+9); delay(1);write_data(H);delay(1);if(counter2%2)=0) /counter 为偶数时声光报警H_LED=0; / 达到报警要求时,指示灯常亮sound=0; / 达到报警要求时,报警灯闪烁light=0;elseH_LED=0;sound=1;light=1;if(counter2%10)=0) /防干扰L_LED=1; if(tvalue1
20、L1) /对应 1602 第二行温度值ds18b20disp(H1,1);break;case 8: L1+;if(L1990) L1=990; /对应 1602 第二行温度值ds18b20disp(L1,1);21break;case 9: H2+;if(H2990) H2=990; /对应 1602 第一行温度值ds18b20disp(H2,2);break;case 10: L2+;if(L2990) L2=990; /对应 1602 第一行温度值ds18b20disp(L2,2);break;default:break; elseswitch(count2) case 7: H1-;i
21、f(H159) time_date=0; write_sfm(0x40+6,time_date);delay(1);seconde=time_date; /液晶屏写22秒 break;case 2: if(time_date59) time_date=0;write_sfm(0x40+3,time_date);delay(1);minite=time_date; /液晶屏写分 break;case 3: if(time_date23) time_date=0;write_sfm(0x40,time_date);delay(1); hour=time_date;/液晶屏写时 break;case
22、 4: if(time_date31) time_date=1;write_sfm(6,time_date); delay(1);day=time_date;/液晶屏写日 break;case 5: if(time_date12) time_date=1;write_sfm(3,time_date); delay(1);month=time_date;/液晶屏写月 break;case 6: if(time_date59) time_date=0;write_sfm(0,time_date);delay(1);year=time_date; /液晶屏写年 break;default:break
23、; elsetime_date-;switch(count1) case 1: if(time_date4)/mstcnt 满 5 即为 250mscounter0+;mstcnt0=0; /对计数单元的清零,重新开始计数if(counter040) /定时 10s,没 10s 温度保存一次Memory_temp( );number1=number; /将当前组号存储,便于下次从该出继续存储number+;if(number=6)number=0; counter0=0; void timer1(void) interrupt 3 /定时器 1,中断 3,0.05s 中断一次uchar mstcnt1;TH1=0x3c; /手动加载计数初值TL1=0xb0;TMOD=0x11; /使用 16 位定时器mstcnt1+; /用于计算时间,每隔 50ms 加 1if(menu=1)counter1=0;if(mstcnt11)/mstcnt 满 5 即为 250mscounter2+;if(menu=0)counter1+; mstcnt1=0; /对计数单元的清零,重新开始计数if(counter110) /定时 1scounter1=0;RST( ); /长按菜单键 1 秒,显示正常温度,时间if(counter2200) /定时 1s