表2.2.1DS18B20温度值格式表
LSByte
MSByte
S
S
S
S
S
(2)、DSl8B20工作过程中的协议
初始化->RoM操作命令->存储器操作命令->处理数据
①初始化单总线上的所有处理均从初始化开始
②ROM操作命令 总线主机检测到DSl8B20的存在便可以发出ROM操作命令之一。
这些命令如表2.2.2所示
表2.2.2ROM操作命令表
指令
代码
ReadROM(读ROM)
33H
MatchROM(匹配ROM)
55H
SkipROM(跳过ROM]
CCH
SearchROM(搜索ROM)
F0H
Alarmsearch(告警搜索)
ECH
③存储器操作命令如表2.2.3所示
表2.2.3存储器操作命令表
指令
代码
WriteScratchpad(写暂存存储器)
4EH
ReadScratchpad(读暂存存储器)
BEH
CopyScratchpad(复制暂存存储器)
48H
ConvertTemperature(温度变换)
44H
RecallEPROM(重新调出)
B8H
ReadPowersupply(读电源)
B4H
(3)温度转换算法及分析
由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。
温度高字节(MSByte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MSByte)低3位和低字节来保存温度值(bit0~bit10)。
其中低字节(LSByte)的低4位来保存温度的小数位(bit0~bit3)。
由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。
也就说,本系统的温度精确到了0.1度。
算法核心:
首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LSByte)取反加一变成原码。
处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
2.3报警电路部分
本系统采用蜂鸣器作为报警电路,原理图如图2.3所示,当温度超过上限值或低于下限值,或者闹钟时间到时,通过软件控制使P35=0,从而三极管8550导通,蜂鸣器发出声音报警或闹钟响。
图2.3报警电路图
2.4红外遥控部分
遥控接收使用红外接收模块1838,该接收模块是一个三端元件,具有功耗低、抗干扰能力强、输入灵敏度高的特点。
如图2.4所示,1838接AT89C2051的P3.2(外中断0).当1838V接收到遥控信号时.产生中断,处理遥控数据.处理完后返回。
图2.41838硬件接口电路图
2.5时钟电路部分
采用时钟芯片DS1302,其内含一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM指示决定采用24或12小时格式。
DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线RES(复位);I/O(数据线);SCLK(串行时钟),时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。
2.5.1DS1302的概念
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒分时日日期.月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM指示决定采用24或12小时格式.DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:
1RES复位,2I/O数据线,3SCLK串行时钟.时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信.DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW.DS1302是由DS1202改进而来,增加了以下的特性.双电源管脚用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器.它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。
2.5.2DS1302的性能指标
1.实时时钟具有能计算2100年之前的秒分时日日期星期月年的能力还有闰年调整的能力。
2.318位暂存数据存储RAM。
3.串行I/O口方式使得管脚数量最少。
4.宽范围工作电压2.0—5.5V。
5.工作电流2.0V时,小于300nA。
6.读/写时钟或RAM数据时有两种传送方式单字节传送和多字节传送字符组方式。
7.8脚DIP封装或可选的8脚SOIC封装根据表面装配。
8.简单3线接口。
9.与TTL兼容Vcc=5V。
10.可选工业级温度范围-40+85。
11.与DS1202兼容。
12.在DS1202基础上增加的特性。
如图2.5所示:
8脚接一个备份电源,保证在断电的情况下时钟仍在工作。
图2.5时钟电路
2.6电源部分
原理图如2.6所示,采用变压器参数都为30W,±18V,经过整流滤波后再通过三端稳压器7805得到+5V电压,提供给单片机及其他各模块。
图2.6电源原理图
2.7显示部分
本设计采用12864液晶显示器,它是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集,利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字,还可完成图形显示,低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多。
2.7.112864液晶显示模块概述
12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。
采用KS0107控制IC。
2.7.2指令描述
1、显示开/关设置
功能:
设置屏幕显示开/关。
DB0=H,开显示;DB0=L,关显示。
不影响显示RAM(DDRAM)中的内容。
2、设置显示起始行
功能:
执行该命令后,所设置的行将显示在屏幕的第一行。
显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。
Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。
3、设置页地址
功能:
执行本指令后,下面的读写操作将在指定页内,直到重新设置。
页地址就是DDRAM的行地址,页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信号(RST)可把页地址计数器内容清零。
DDRAM地址映像表
4、设置列地址
功能:
DDRAM的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DDRAM进行读写操作后,Y地址自动加一。
5、状态检测
功能:
读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。
BF=H:
内部正在执行操作; BF=L:
空闲状态。
RST=H:
正处于复位初始化状态; RST=L:
正常状态。
ON/OFF=H:
表示显示关闭; ON/OFF=L:
表示显示开。
6、写显示数据
功能:
写数据到DDRAM,DDRAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。
D7-D0位数据为1表示显示,数据为0表示不显示。
写数据到DDRAM前,要先执行“设置页地址”及“设置列地址”命令。
7、读显示数据
功能:
从DDRAM读数据,读指令执行后Y地址计数器自动加1。
从DDRAM读数据前要先执行“设置页地址”及“设置列地址”命令
通过单片机控制,同时显示出温度和时间。
图2.7显示部分电路图
结论
毕业论文是学习阶段一次非常难得的理论与实际相结合的机会,通过这次对基于单片机的遥控温度报警器的系统设计,使我对单片机的了解更深了一层,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际工程问题的能力,同时也提高我查阅文献资料、设计规范以及电脑制图等其他专业能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,锻炼了我的能力,认识带自己的不足;也得到了丰富的经验。
这是我们希望看到的,也是我们进行毕业设计的目的所在。
提高是有限的但提高也是全面的,正是这一次设计让我积累了在平时的学习中无法学习到实际经验,使我的头脑更好的被知识武装了起来,也形成自己的一种学习理论与实践相结合的方法与途径,必然会让我在未来的工作学习中表现出更高的应变能力,更强的沟通力和理解力。
致谢
大学三年学习时光已经接近尾声,在此我想对我的母校,我的父母、亲人们,我的老师和同学们表达我由衷的谢意。
感谢我的家人对我大学三年学习的默默支持;感谢我的母校安阳工学院给了我在大学三年深造的机会,让我能继续学习和提高;感谢安阳工学院电子信息与电气工程系的各位老师和同学们三年来的关心和鼓励。
老师们课堂上的激情洋溢,课堂下的谆谆教诲;同学们在学习中的认真热情,生活上的热心主动,所有这些都让我的三年充满了感动。
这次毕业论文设计我得到了很多老师和同学的帮助,其中我的论文指导老师丁莹亮老师对我的关心和支持尤为重要。
尽管丁老师平日里工作繁多,但我做毕业设计过程中给予我悉心的指导。
丁老师带了我们班两年的课程,在这两年中,丁老师在学习上给了我很大的帮助,使我明白实践比理论更为重要,在此谨向丁老师致以诚挚的谢意和崇高的敬意。
同时,本篇毕业论文的写作也得到了潘永山等同学的热情帮助。
感谢在整个毕业设计期间在各个方面给予过我帮助的伙伴们,在此,我再一次真诚地向帮助过我的老师和同学表示感谢!
参考文献
[1]华成英,童诗白.模拟电子技术基础(第四版).高等教育出版社,2004
[2]康华光.电子技术基础数字部分(第五版).高等教育出版社,2006
[3]黄智伟,王彦,陈文光,朱卫华.全国大学生电子设计竞赛训练教程.北京:
电子工业出版社,2007
[4]王福瑞.单片微机检测系统大全.北京:
航天航空大学出版社.1999
[5]徐惠民.单片机微型机原理接口及应用.北京:
北京邮电大学出版社.1999.2
[6]于海生.微型计算机控制技术.北京:
清华大学出版社.1999
[7]周杭慈.单片机程序设计基础.北京:
航天航空大学出版社.2003.5
[8]赵亮.单片机C语言编程与实例.北京:
人民邮电出版社.2002.9
[9]江晓安.模拟电子技术.西安:
西安电子科技大学出版社.2000
[10]张毅刚.MCS—51单片机原理及应用.哈尔滨:
哈尔滨工业大学出版社.2001
[11]赵茂泰.智能仪器原理及应用.北京:
电子工业出版社.1999
附录A系统原理图
图A1系统原理图
附录BPCB制版图
图B1PCB制版图
附录C硬件电路实物图
图C1硬件电路实物图
附录D源程序
#include
#include
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
sbitIR_GET=P3^2;//红外接收数据输入端
sbitBEEP=P3^5;//蜂鸣器驱动线
/********************************************************/
ucharcodemenu_time_index[7][3]={{2,2,13},{4,2,9},{6,2,7},{2,3,5},{4,3,3},{6,3,1},{5,4,11}};//设置时间导航
ucharcodemenu_temp_index[2][2]={{5,2},{5,3}};//设置时间导航indexcodemenu_time_index[7]={{2,2},{4,2},{6,2},{2,3},{4,3},{6,3},{5,4}};//设置时间导航
ucharcodemenu_clock_index[3][2]={{2,3},{4,3},{6,3}};//设置时间导航
bitsendtempflag=0;
ucharhdata=0x10,ldata=0x10;//分别存放数码管显示的红外编码的高四位和低四位。
ucharRXDDATA[]={0x00,0x00,0x00,0x00};//存放接收到的四组红外编码
bitircodeflag=0;
volatilebitkong=1;//全局变量,用于数码管上的两杠进行闪烁
volatilebitalarmflag=0;
volatileucharworkcode;//经过处理返回的纯数字红外编码
ucharuart_num[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','-'};
uchartimes[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//1302振荡得到的准确时间:
秒分时日月星期年
uchardisptimes[14];//准确时间:
(秒分时日月星期年)分开的个位和十位
ucharxdataolddisptimes[14]={1,1,1,1,1,1,1,1,1,1,1,1,1,1};
#include"uart.h"
#include"ds1302.h"
#include"ds18b20.h"
#include"LCD12864P.C"
/********************************************************
**函数声明专区
********************************************************/
voidDelayUS(uintnum);
voiddelay100us(ucharx);
voidbeep();
ucharworkIRcode(uchar*pp);
voidsendircode();
voiddisplaytime();
voidGDRAMCLOCK(ucharrow,uchar*time);
voidset1616pic(ucharx,uchary,ucharsign,uchartt);
voidset1616num(ucharcurr,uchar*ptime);
voidgudidisptime(uchar*time);//time指针是处理好的十位个位分开的时间数组。
voidgudidisptemp(uchar*tempc);
voidgudidispclock(uchar*clock);
ucharchecktemp(uchar*pp);
uchartime_compare();
/********************************************************/
voidmain()
{
bitone_sign;
bitonealarmflag=0;
ucharrun_sign,tempdata,timenum,timelcdxy,we;
uchari,curr_menu_id,checkflag;
uchar*pmenu;
ucharstimetopc;
ucharoutflag;
delayms(500);
alarmflag=0;//默认闹铃关闭
TMOD|=0X01;//选择定时器0工作在模式1,即16位定时器
TH0=(65536-49000)/256;//装49ms的初值
TL0=(65536-49000)