温度显示的数字时钟设计课程设计报告.docx

上传人:b****7 文档编号:9289783 上传时间:2023-02-04 格式:DOCX 页数:51 大小:761.50KB
下载 相关 举报
温度显示的数字时钟设计课程设计报告.docx_第1页
第1页 / 共51页
温度显示的数字时钟设计课程设计报告.docx_第2页
第2页 / 共51页
温度显示的数字时钟设计课程设计报告.docx_第3页
第3页 / 共51页
温度显示的数字时钟设计课程设计报告.docx_第4页
第4页 / 共51页
温度显示的数字时钟设计课程设计报告.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

温度显示的数字时钟设计课程设计报告.docx

《温度显示的数字时钟设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《温度显示的数字时钟设计课程设计报告.docx(51页珍藏版)》请在冰豆网上搜索。

温度显示的数字时钟设计课程设计报告.docx

温度显示的数字时钟设计课程设计报告

温度显示的数字时钟设计课程设计报告

 

“电子系统设计”

课程设计报告

 

设计课题:

电子系统课程设计

专业班级:

11级电本1班

姓名:

学号:

2011041513

设计时间:

评阅意见

 

物理与机电工程学院

多功能数字时钟

一、设计任务与要求

设计任务:

本项目拟设计基于单片机的数字时钟和数字温度计,并将时间和温度显示在液晶显示器上。

根据主要功能要求,该设计利用51单片机实现了电子时钟、温度的显示以及设置闹铃等功能。

主要功能要求:

1.以24h计数方式。

2.时钟要求可以显示时间:

年、月、日、时、分、秒。

3.可调整显示日期、时间,具有整点报时功能,具有闹铃设置功能。

4.显示当前屋内温度,温度显示稳定。

二、系统设计方案

2.1设计与论证

按照系统的设计功能要求,本时钟温度系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟、温度的存储和查询及显示。

按照系统的设计功能要求,初步确定系统由主控单元、时钟模块、测温模块、显示模块、键盘接口模块共五个模块组成。

2.1.1主控模块选择

方案一:

纯硬件电路系统,各功能采用分离的硬件电路模块实现。

用时序逻辑电路实现时钟功能,用555定时器实现闹钟的设定。

但这种实现方法可靠性差、控制精度低,灵活性小、线路复杂、安装调试不方便,而且不方便实现对系统的扩展。

 

方案二:

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。

AT89C51是一种带2K字节闪烁可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除100次。

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

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

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

故选择此方案。

2.1.2时钟模块选择

方案一:

由单片机实现时钟功能。

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

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

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

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

所以不采用此方案。

方案二:

采用DS1302时钟芯片。

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

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

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

复位(RST)、I/O数据线、串行时钟(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机通过串口通讯将初始时间数据送入单片机内部,但这给时间的调整带来一定不便,不能随时随地的调整时间。

方案二:

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

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

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

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

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

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

采用阵列式键盘。

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

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

由于本系统所使用的按键不多(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,可以通过串行接口与单片机进行通信。

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

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

复位(RST)、I/O数据线、串行时钟(SCLK)。

3.4DS18B20温度计电路 

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

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

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

第六、七、八个字节用于内部计算.DS18B20它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达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个不同的点阵字符图形,这些字符有:

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

 

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

总原理图

仿真图

PCB图

实物图

四、软件部分设计

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

18B20温度计流程图

程序设计(节选):

#include

#include

//#include"LCD1602.h"

//#include"DS1302.h"

#defineuintunsignedint

#defineucharunsignedchar

sbitDS1302_CLK=P1^7;//实时时钟时钟线引脚

sbitDS1302_IO=P1^6;//实时时钟数据线引脚

sbitDS1302_RST=P1^5;//实时时钟复位线引脚

sbitwireless_1=P3^0;

sbitwireless_2=P3^1;

sbitwireless_3=P3^2;

sbitwireless_4=P3^3;

sbitbeep=P3^4;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year,hide_m,hide_f,hide_h;

sbitSet=P2^0;//模式切换键

sbitUp=P2^1;//加法按钮

sbitDown=P2^2;//减法按钮

sbitout=P2^3;//立刻跳出调整模式按钮

sbitDQ=P1^0;//温度传送数据IO口

sbitdd=P3^7;

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

uchartemp_value;//温度值

ucharm,f,h,mo,d,y,w,kaiguan,h=12,f=30;

ucharTempBuffer[5],week_value[2],nao[8];

voidnaotime();

ucharcodetone[]={212,212,190,212,159,169,212,212,190,212,142,159,

212,212,106,126,159,169,190,119,119,126,159,142,159,0};

ucharcodelon[]={9,3,12,12,12,24,9,3,12,12,12,24,

9,3,12,12,12,12,12,9,3,12,12,12,24,0};

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidmusic()

{

uinti,j,k=0,m;

for(m=0;m<26;m++)

{

for(i=0;i

{

beep=~beep;

for(j=0;j

}

delay(10);

k++;

}

}

voidshow_time();//液晶显示程序

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

voidLCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_COMMAND,0x38);

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>0;i--)

{

DS1302_IO=ACC0;//相当于汇编中的RRC

DS1302_CLK=1;

DS1302_CLK=0;

ACC=ACC>>1;

}

}

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

{

unsignedchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1;//相当于汇编中的RRC

ACC7=DS1302_IO;

DS1302_CLK=1;

DS1302_CLK=0;

}

return(ACC);

}

voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:

DS1302地址,ucData:

要写的数据

{

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);//地址,命令

DS1302InputByte(ucDa);//写1Byte数据

DS1302_CLK=1;

DS1302_RST=0;

}

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

{

unsignedcharucData;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr|0x01);//地址,命令

ucData=DS1302OutputByte();//读1Byte数据

DS1302_CLK=1;

DS1302_RST=0;

return(ucData);

}

 

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

{

unsignedcharReadValue;

ReadValue=Read1302(DS1302_SECOND);

Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_MINUTE);

Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_HOUR);

Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_DAY);

Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_WEEK);

Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_MONTH);

Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_YEAR);

Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

}

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

{if(hide_year<2)//这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22

{

Time->DateString[0]='2';

Time->DateString[1]='0';

Time->DateString[2]=Time->Year/10+'0';

Time->DateString[3]=Time->Year%10+'0';

}

else

{

Time->DateString[0]='';

Time->DateString[1]='';

Time->DateString[2]='';

Time->DateString[3]='';

}

Time->DateString[4]='/';

if(hide_month<2)

{

Time->DateString[5]=Time->Month/10+'0';

Time->DateString[6]=Time->Month%10+'0';

}

else

{

Time->DateString[5]='';

Time->DateString[6]='';

}

Time->DateString[7]='/';

if(hide_day<2)

{

Time->DateString[8]=Time->Day/10+'0';

Time->DateString[9]=Time->Day%10+'0';

Time->DateString[10]='';

Time->DateString[11]='';

}

else

{

Time->DateString[8]='';

Time->DateString[9]='';

Time->DateString[10]='';

Time->DateString[11]='';

}

if(hide_week<2)

{

week_value[0]=Time->Week%10+'0';//星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示

}

else

{

week_value[0]='';

}

week_value[1]='\0';

Time->DateString[10]='\0';//字符串末尾加'\0',判断结束字符

}

voidTimeToStr(SYSTEMTIME*Time)//将时,分,秒数据转换成液晶显示字符放到数组TimeString[];

{

if(hide_hour<2)

{

Time->TimeString[0]=Time->Hour/10+'0';

Time->TimeString[1]=Time->Hour%10+'0';

}

else

{

Time->TimeString[0]='';

Time->TimeString[1]='';

}

Time->TimeString[2]=':

';

 

if(hide_min<2)

{

Time->TimeString[3]=Time->Minute/10+'0';

Time->TimeString[4]=Time->Minute%10+'0';

}

else

{

Time->TimeString[3]='';

Time->TimeString[4]='';

}

Time->TimeString[5]=':

';

if(hide_sec<2)

{

Time->TimeString[6]=Time->Second/10+'0';

Time->TimeString[7]=Time->Second%10+'0';

Time-

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

当前位置:首页 > 高等教育 > 文学

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

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