完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx

上传人:b****8 文档编号:22128139 上传时间:2023-02-02 格式:DOCX 页数:32 大小:748.42KB
下载 相关 举报
完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx_第1页
第1页 / 共32页
完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx_第2页
第2页 / 共32页
完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx_第3页
第3页 / 共32页
完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx_第4页
第4页 / 共32页
完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx

《完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。

完美升级版温度显示的数字时钟设计毕业论文报告Word文件下载.docx

由于将多功能8位CPU和闪烁存储器组合在单个芯片中。

单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,相较于方案一为更优方案。

故选择此方案。

2.1.2时钟模块选择

由单片机实现时钟功能。

单片机内部具有定时器,可方便实现定时功能。

通过计算可知,使定时器每25ms产生一次中断,当产生40次中断后秒单元将加一,以此类推,从而实现时、分、秒的走时,并加以显示。

但由于系统晶振误差、温漂、中断响应时间的不确定性及定时器重新装载时间常数所带来的误差,决定它不能用来作为时钟的时间基准。

采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。

所以不采用此方案。

采用DS1302时钟芯片。

该芯片内含一个实时时钟日历和31字节静态RAM,可以通过串行接口与单片机进行通信。

实时时钟日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AMPM标志位决定采用24或12小时时间格式。

DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根IO线:

复位(RST)、IO数据线、串行时钟(SCLK)。

采用DS1302可以提高计时精度,更重要的就是DS1302可以在很小的后备电源下继续计时,并可编程选择充电电流来对后备电源进行充电,可以保证后备电源基本不耗电。

比较两种方案,用软件实现时钟固然可以,但是程序运行需占用大量的CPU资源,会影响记时的准确度。

而用专用时钟芯片可以实现准确记时。

故采用专用时钟芯片DS1302来实现时钟功能,即选择方案二。

2.1.3测温模块选择:

可以采用热敏电阻来实现温度的测量,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差。

且由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。

对于检测到的温度的精确度不能够得到保证。

故不作选择。

采用数字温度传感器DS18B20。

它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

DS18B20测量温度,输出信号全数字化,便于单片机处理及控制,单总线的数据传输,省去传统的测温方法的很多外围电路,系统的结构可以做得较为紧凑。

故采用数字温度传感器DS18B20,即方案二。

2.1.4显示模块选择:

使用多个数码管LED显示。

LED数码管是利用二极管发光显示数字和字母,具有亮度大、接口设计比较容易,价格相对较便宜等优点。

但是由于它工作电流较大、不能显示汉字,显示的信息量有限,若在此题目中应用就会受到很大的限制。

将导致硬件电路复杂化,也会占用较多的线路板面积,也会给软件设计实现上带来困难,并且整个电路的功耗也会较大。

采用液晶显示器LCD1602作为显示输出。

该芯片可显示16×

2个字符,可显示字符较多。

另外,l602芯片编程和电路设计比较简单,1602液晶显示器有微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点。

系统采用方案二,设计选用1062液晶板。

2.1.5键盘接口模块:

DS1302必须设定初始时间才能正常工作,顾本系统必须有初始时间输入电路。

可以考虑通过PC机通过串口通讯将初始时间数据送入单片机内部,但这给时间的调整带来一定不便,不能随时随地的调整时间。

采用独立按键,按键均采用低电平有效连接方式。

用来用作调节时钟以及闹铃。

几个按键可以对时钟进行设置调节,并调节设置闹铃,当时间与设置的时间一致是闹铃报警,即蜂鸣器响。

键盘接口是单片机应用系统中最常用的接口之一,键盘的类型很多,常用的有独立式键盘和矩阵式键盘。

采用独立式按键电路,每个键单独占有一根IO接口线,每个IO口的工作状态互不影响,此类键盘采用端口直接扫描方式。

但是当按键较多时占用单片机的IO数目较多。

采用阵列式键盘。

此类键盘是采用行列扫描方式,当按键较多时可以降低占用单片机的IO口数目。

因为本设计需要的键盘比较少,所以采用独立式的应用中,当然需要解决键盘消抖的问题,一般使用的是软件消抖的方法。

由于本系统所使用的按键不多(4个按键足以满足设置要求)因此采用1*4键盘,采用独立式按键电路。

2.2系统总体方案论证:

综上所述,该系统用主芯片为AT89C51的单片机控制实现,为了满足单片机系统的实时控制的需求,采用实时钟芯片DS1302,使用独立式按键进行时间的调整和定时,温度传感器使用DS18B20。

显示时间和温度使用LCD1602显示。

当单片机上电,单片机就初始化。

单片机接收并处理来自DS18B20传过来的数据在液晶上显示当时的室内温度,液晶还显示当前的时间,日期。

当需要设置闹钟或调整时间时,又检测按键是否按下,以便对时间进行修正、设置闹钟时间,最后进入循环。

如下图:

系统设计结构图

三、单元电路分析与设计

3.1时钟电路

系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。

51单片机内部有一个用于构成振荡器的高增益反相放大器。

引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。

这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。

外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。

3.2复位电路

复位是由外部的复位电路来实现的。

片内复位电路是复位引脚RST通常采用上电自动复位和按键手动复位两种方式,此电路系统采用的是按键手动复位电路,高电平时复位。

3.3DS1302时钟电路

DS1302内含一个实时时钟日历和31字节静态RAM,可以通过串行接口与单片机进行通信。

3.4DS18B20温度计电路 

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2PPRAM,后者存放高温度和低温度触发器TH、T和结构寄存器。

暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。

第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。

第六、七、八个字节用于内部计算.DS18B20它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位AD转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

以上特点使DS18B20非常适用于远距离多点温度检测系统。

DS18B20测温原理 

在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:

首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。

考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算:

Ts=(Tz-0.25℃)+(CD-Cs)CD

3.5按键电路

独立按键用来用作调节时钟以及闹铃。

按键均采用低电平有效连接方式。

按键有6个,分别实现为时间调整键、时间增加,时间减少、时间确认按键、复位键、闹铃时间设置键。

3.6显示电路

LCD1602液晶显示器属于工业字符型液晶,能够同时显示16x02即32个字符(2行16列)。

LCD1602液晶模块内部的字符发生内存(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

LCD1602与单片机之间通过3根控制线和8位并行数据IO线实现交互,电路下图所示。

总原理图

仿真图

PCB图

实物图

四、软件部分设计

系统运行流程图主函数流程图

18B20温度计流程图

程序设计(节选):

#include<

REG51.H>

intrins.,=P2^2;

减法按钮

sbitout=P2^3;

立刻跳出调整模式按钮

sbitDQ=P1^0;

温度传送数据IO口

sbitdd=P3^7;

chardone,count,temp,flag,up_flag,down_flag,key;

uchartemp_value;

温度值

voiddelay(uintz)

{

uintx,y;

for(x=z;

x>

0;

x--)

for(y=110;

y>

y--);

}

voidmusic()

uinti,j,k=0,m;

for(m=0;

m<

26;

m++)

for(i=0;

i<

lon[k]*20;

i++)

beep=~beep;

for(j=0;

j<

tone[k]3;

j++);

delay(10);

k++;

voidshow_time();

液晶显示程序

初始化LCD************************************************************

voidLCD_Initial()

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);

8位数据端口,2行显示,5*7点阵

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);

开启显示,无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);

清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);

AC递增,画面不动

}SYSTEMTIME;

定义的时间类型

SYSTEMTIMECurrentTime;

#defineAM(X)X

#definePM(X)(X+12)转成24小时制

#defineDS1302_SECOND0x80时钟芯片的寄存器位置,存放时间

#defineDS1302_MINUTE0x82

#defineDS1302_HOUR0x84

#defineDS1302_WEEK0x8A

#defineDS1302_DAY0x86

#defineDS1302_MONTH0x88

#defineDS1302_YEAR0x8C

voidDS1302InputByte(unsignedchard)实时时钟写入一字节(内部函数)

unsignedchari;

ACC=d;

for(i=8;

i>

i--)

DS1302_IO=ACC0;

相当于汇编中的RRC

DS1302_CLK=1;

DS1302_CLK=0;

ACC=ACC>

>

1;

unsignedcharDS1302OutputByte(void)实时时钟读取一字节(内部函数)

1;

相当于汇编中的RRC

ACC7=DS1302_IO;

return(ACC);

voidWrite1302(unsignedcharucAddr,unsignedcharucDa)ucAddr:

DS1302地址,ucData:

要写的数据

DS1302_RST=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);

地址,命令

DS1302InputByte(ucDa);

写1Byte数据

unsignedcharRead1302(unsignedcharucAddr)读取DS1302某地址的数据

unsignedcharucData;

DS1302InputByte(ucAddr|0x01);

地址,命令

ucData=DS1302OutputByte();

读1Byte数据

return(ucData);

voidDS1302_GetTime(SYSTEMTIME*Time)获取时钟芯片的时钟数据到自定义的结构型数组

unsignedcharReadValue;

ReadValue=Read1302(DS1302_SECOND);

Time->

Second=((ReadValue&

0x70)>

4)*10+(ReadValue&

0x0F);

ReadValue=Read1302(DS1302_MINUTE);

Minute=((ReadValue&

ReadValue=Read1302(DS1302_HOUR);

Hour=((ReadValue&

ReadValue=Read1302(DS1302_DAY);

Day=((ReadValue&

ReadValue=Read1302(DS1302_WEEK);

Week=((ReadValue&

ReadValue=Read1302(DS1302_MONTH);

Month=((ReadValue&

ReadValue=Read1302(DS1302_YEAR);

Year=((ReadValue&

voidDateToStr(SYSTEMTIME*Time)将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]

{if(<

2)

TimeString[3]=Time->

Minute10+'

0'

;

TimeString[4]=Time->

Minute%10+'

else

TimeString[3]='

'

TimeString[4]='

TimeString[5]='

:

'

if((dat);

*************ds18b20写一个字节****************

voidWriteOneChar(uchardat)

unsignedchari=0;

for(i=8;

DQ=0;

DQ=dat&

0x01;

delay_18B20(5);

DQ=1;

dat>

=1;

**************读取ds18b20当前温度************

voidReadTemp(void)

unsignedchara=0;

unsignedcharb=0;

unsignedchart=0;

Init_DS18B20();

WriteOneChar(0xCC);

跳过读序号列号的操作

WriteOneChar(0x44);

启动温度转换

delay_18B20(100);

thismessageisweryimportant

WriteOneChar(0xBE);

读取温度寄存器等(共可读9个寄存器)前两个就是温度

a=ReadOneChar();

读取温度值低位

b=ReadOneChar();

读取温度值高位

temp_value=b<

<

4;

temp_value+=(a&

0xf0)>

voidtemp_to_str()温度数据转换成液晶字符显示

TempBuffer[0]=temp_value10+'

十位

TempBuffer[1]=temp_value%10+'

个位

TempBuffer[2]=0xdf;

温度符号

TempBuffer[3]='

C'

TempBuffer[4]='

\0'

voidnaoz()

if(=0,=0,=1;

if(Down==0||wireless_3==1)

mdelay(8);

switch(count)

{case1:

temp=Read1302(DS1302_SECOND);

读取秒数

temp=temp-1;

秒数减1

down_flag=1;

数据调整后更新标志

if(temp==0x7f)小于0秒,返回59秒

temp=0x59;

break;

case2:

temp=Read1302(DS1302_MINUTE);

读取分数

分数减1

if(temp==-1)

小于0秒,返回59秒

case3:

temp=Read1302(DS1302_HOUR);

读取小时数

小时数减1

temp=0x23;

case4:

temp=Read1302(DS1302_WEEK);

读取星期数

星期数减1

if(temp==0)

temp=0x7;

case5:

temp=Read1302(DS1302_DAY);

读取日数

日数减1

temp=31;

case6:

temp=Read1302(DS1302_MONTH);

读取月数

月数减1

temp=12;

case7:

temp=Read1302(DS1302_YEAR);

读取年数

年数减1

temp=0x85;

default:

while(Down==0);

while(wireless_3==1);

voidDownkey1()降序按键

Down=1;

{

mdelay(8);

kaiguan=1;

naotime();

count=count+1;

Setkey按一次,count就加1

key=1;

进入调整模式

while(dd==0);

}

voidkeydone()按键功能执行

{ucharSecond;

if(flag==0)关闭时钟,停止计时

{Write1302(0x8e,0x00);

写入允许

temp=Read1302(0x80);

Write1302(0x80,temp|0x80);

Write1302(0x8e,0x80);

禁止写入

flag=1;

Setkey();

扫描模式切换按键

docount=1,调整秒

outkey();

扫描跳出按钮

Upkey();

扫描加按钮

Downkey();

扫描减按钮

if(up_flag==1||down_flag==1)数据更新,重新写入新的数据

Write1302(0x8e,0x00);

写入新的秒数

up_flag=0;

down_flag=0;

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

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1