基于89C52的带温度显示的多功能数字钟总结报告Word文档下载推荐.docx
《基于89C52的带温度显示的多功能数字钟总结报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于89C52的带温度显示的多功能数字钟总结报告Word文档下载推荐.docx(40页珍藏版)》请在冰点文库上搜索。
![基于89C52的带温度显示的多功能数字钟总结报告Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/c74fb503-f2e5-4e87-95f4-7e4d3d7b6cc8/c74fb503-f2e5-4e87-95f4-7e4d3d7b6cc81.gif)
可以通过几个按键对当前的时间进行调整,对闹钟进行随意设置。
其原理框图如下图2.2所示
图2.2数字钟原理框图
2.2方案比较
我们可以看到,方案一使用的基于Altera公司出品QuartusII软件以及相应的实验平台完成的多功能数字计时器,由于时钟的计时范围是00:
00:
00---23:
59:
59,所以我们需要设计模六十和模二十四的计数器组成时钟计时电路。
校分、校时、清零电路需要输入一些控制信号给时钟计时电路,当然这些控制信号是由开关提供的。
要实现整点报时功能,一个报时控制电路是必不可少的。
万年历电路需要由计时电路提供计时脉冲,脉冲输送给一个由模30、模12、模100级联而成计时电路。
整个过程不仅涉及到的分频计数器较多,还要用到大量的开关控制显得相当复杂且容易出错。
而方案二是采用最近几年比较普遍的STC89C52RC单片机芯片实现。
基于STC公司的ST89C52单片机,使用Dallas的一线制数字温度计DS18B20作为温度传感器,实时时钟芯片DS1302提供当前日期和时间数据,并将实时的日期和温度数据字符型液晶显示器LCD1602上显示。
之所以选择这个芯片,是因为STC单片机降低成本,提升性能,原有程序直接使用,硬件无需改动。
并且其抗干扰性强,加密性强,超低功耗,可以远程升级,内部有专用复位电路,价格也较便宜,一般的利用STC系列的单片机芯片加上一些外围的供电电路,复位电路,下载电路,特定功能电路等就能实现特定的功能。
由于这些特点使得STC系列单片机的应用日趋广泛。
所以本设计方案选用方案二。
3系统器件的选择
3.1温度传感器的选择
由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。
这里采用DALLAS公司的数字温度传感器DS18B20作为测温元件。
3.1.1DS18B20简单介绍:
DALLAS最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。
DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。
温度测量范围为-55~+125摄氏度,可编程为9位~12位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
被测温度用符号扩展的16位数字量方式串行输出;
其工作电源既可以在远端引入,也可以采用寄生电源方式产生;
多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
3.1.2DS18B20内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20温度传感器主要用于对温度进行测量,数据可用16位符号扩展的二进制补码读数形式提供,并以0.0625℃/LSB形式表示。
表1是部分温度值对应的二进制温度表示数据。
表1部分温度值
3.1.3DS18B20测温原理
在正常测温情况下,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.2DS1302时钟芯片
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月、年,一个月小于31天时可自动进行调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力,因此广泛应用于测量系统中。
DS1302是由DS1202改进而来的,增加了以下的特性:
双电源管脚用于主电源和备份电源供应,Vcc1为课编程涓流充电电源,附加七个字节存储器。
它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域。
其外部引脚分配如图所示:
引脚号
引脚名称
功能
1
Vcc2
主电源
2,3
X1,X2
震荡源,外接32.768kHz晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行数据输入端
8
Vcc1
后备电源
3.3STC89C52单片机芯片
STC89C52是STC公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,可灵活应用于各种控制领域。
其主要功能有:
与MCS-51产品指令系统完全兼容;
4k字节可重擦写Flash闪速存储器;
1000次擦写周期;
全静态操作:
0Hz-24MHz;
三级加密程序存储器;
128×
8字节内部RAM;
32个可编程I/O口线;
2个16位定时/计数器;
6个中断源;
可编程串行UART通道;
低功耗空闲和掉电模式。
其引脚图如下图所示:
图3.6STC89C52引脚图
3.4液晶显示LCD1602
HS1602是目前最常用的字符液晶之一。
具有16×
2能够显示所有英文大小写字母,0到9十个数字以及一些常用的符号。
该液晶在4.5V到5.5V电压范围内都能正确工作,平均工作电流为2mA。
液晶HS162共16个管脚.RS为寄存器选择信号,RW为读写选择信号,通过这两种信号的不同组合可对液晶进行读写命令和读写数据的操作。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个HS162是目前最常用的字符液晶之一。
具有16ⅹ2能够显示所有英文大小写字母,0不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
在操作液晶时,先要对液晶进行初始化,即进行最初是的命令设置。
要设置液晶的工作方式设置,显示状态设置,输入方式设置等。
最后再向液晶写入数据,即写入想要显示字符的ASCII码。
4软件设计与仿真
本设计软件仿真部分用的是仿真软件PROTUES。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐,是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。
4.1软件设计流程
本次设计的系统软件设计主要包括主程序设计和温度采集子模块程序设计、日历日期数据子模块程序、按键控制子模块程序和LCD液晶显示子模块程序设计等。
主程序主要完成器件的初始化,并判断有无按键按下,并根据判断的结果调用相应的子模块程序;
而温度采集子模块程序和日历日期数据子模块程序完成相应的数据采集、处理和保存,按键处理子模块程序完成日期和闹钟的设置,而液晶显示子模块只要把上述子模块储存的数据送去显示即可。
系统总的流程图如下图所示:
图4.1主程序流程
4.2.1温度采集流程
DS18B20在进行温度采集时,必须首先进行初始化,然后发ROM操作指令,再发存储器操作指令,最后才能传输数据。
每次对器件进行读写操作时,必须严格按照DS18B20的时序要求。
因为温度数据在DS18B20中是以2的补码形式存放的,且低4位为小数部分,4位到10位为整数部分,其余为符号位,因此在读出2个字节的温度数据后,首先求一次补码得到原码,再将数据分离为整数温度值和小数温度值,整数部分的值可通过数据交换指令得到,而小数温度值部分可通过查表得到。
因为在液晶显示器上显示的是字符的ASCII码,因而还要转换为BCD,在加30H转换为ASCⅡ码。
其流程图如下所示:
图4.3温度采集流程
4.2.2日期数据处理流程
对时钟芯片的操作主要包括2个方面:
一是将芯片中的日期等数据读出来,二是在进行日期等设置时将设置的数据写入芯片,这也是按键处理时的主要内容。
无论是读数据还是写数据,都要满足DS1302对时序的要求。
而对芯片各个数据部分的访问是通过地址进行的,且读和写的地址不一样。
读出的数据同样要转为ASCII码,然后储存起来,等待送去显示。
其流程图如下图所示:
图4.4日期数据处理
4.3proteus仿真实验
应用protues仿真软件先找好所需原件,然后按照设计好的电路图连接线路,之后在单片机里考入写好的程序,进行仿真。
仿真图如下所示:
时钟电路:
测温电路:
显示电路:
仿真结果:
5.PROTEL电路原理图、PCB板
5.1原理图设计系统
Protel99SE是一个易于使用的具有大量元件库的原理图编辑器,主要用于原理图的设计。
它可以为印制电路板设计提供网络表。
该编辑器除了具有强大的原理图编辑功能以外,其分层组织设计功能、设计同步器、丰富的电气设计检验功能及强大而完善的打印输出功能,使用户可以轻松完成所需的设计任务。
5.2印制电路板设计系统
它是一个功能强大的印制电路板设计编辑器,具有非常专业的交互式布线及元件布局的特点,用于印制电路板(PCB)的设计并最终产生PCB文件,直接关系到印制电路板的生产。
包含一个具有专业水准的PCB信号完整性分析工具、功能强大的打印管理系统、一个先进的PCB三维视图预览工具。
5.3实物图
6.系统调试
单片机系统调试之前首先应该确认电源电压是否正常。
用万用表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,常用的5V。
接下来就是检查复位引脚电压是否正常。
分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。
显示电路的调试:
在这里主要是1602液晶显示器。
检查它与单片机的连线:
设计是RS接的P3.7口,要保证它为高电平。
EN接口接单片机的P3.5端,也要保证它为高电平;
读写信号低电平有效;
编写一段显示程序,烧录到单片机看是否能正常显示。
DS1302电路调试:
该电路包含DS1302芯片,主电源、备用电源、晶振等部分。
在与单片机连接的过程中需要注意以下几点:
1.清楚DS1302与单片机连接的管脚,本设计定义为:
DS1302的SCLK连接P3.2,I/O口连接P3.3,RST连接P3.4;
2.注意电源正负极的连接;
3.DS1302接32.768KHZ的晶振,该晶振体型比较小,在焊接时要小心,同时也要尽量使晶振离DS1302是X1、X2引脚近距离焊接。
4.编写DS1302的时钟程序看是否能够正确显示时间。
按键电路调试:
按键电路比较简单,故调试起来也很容易。
如果确保按键焊接正确,只需把DS1302的程序写进单片机,再按下设置键,如果在秒的位置有光标出现,则说明可用。
按下上(下)调键,如果日的位置有加(减)的操作,则上(下)调按键可用。
温度传感器的调试:
温度传感器的调试只需在确保电路焊接正确的情况下,把显示温度的程序写进单片机,然后看液晶显示器上显示的温度是否是当前的室温,如果能够正确显示当前室温,那么说明电路一切完好。
7.总结与体会
为了做好这个电子综合设计,我们三个人早早的就组好队开始动手做。
但过程比较曲折,遇到了不少困难,还好最后终于把实物做出来了,挺有成就感的。
下面总结一下我们的设计过程:
1.本次设计在刚开始调试的时候,由于没有经验,感觉无从下手。
于是我们三个人分工上网查资料,就在这查的过程中,我们对电子设计有了自己的认识和理解,大概了解了一个数字钟的设计过程。
之后我们把自己搜索的资料汇总在一起,开始进行软件的仿真。
2.用protues进行仿真时,开始什么都不会,都是上网一点一点查每个原件的名称,边查边学。
就这样,我们学会了protues软件的基本使用方法。
3.仿真图连出来后就需要程序了,这是一个难点。
由于底子薄,基础差,我们基本上是从零学起单片机的C语言编程。
在网上下了别人写好的程序,一点一点看。
慢慢的有一些懂了,就试着去改,改完了放到自己的电路图上,不能用就接着改。
到最后,一些简单的程序我们也都会编了。
4.仿真做好后开始做实物。
去电子市场买好原件,焊电路。
为了保证准确性,我们每焊完一根线就用万用表测量看接通了没有,相邻的管脚也用万用表测量以免短路,有些管脚处要接三四根线我们三个人互相配合一人拿根导线由一个人焊,焊好后把程序考到单片机里,结果显示屏什么都不显示。
我们就开始查故障,改程序。
发现原来仿真和实物有着不小的区别,仿真能做出来,实物不一定就能出来。
例如与显示屏连接的10k欧的滑动变阻器要去掉,有些芯片的管脚在原理图上找不到我们就到网上查到这个芯片的每个管脚的用途以及接法然后接上。
有些虽然看似很小的问题,但检错起来一点都不容易,需要反复的分析,不断的试验。
就这样不断的试验,再修改,在试验,直到程序完全正确,可以显示出我们想要的答案为止。
这次的多功能电子钟的显示通过不断的修改和调试,最终达到了我们想要的效果。
它能够正常显示时间、日期、星期和温度。
但是对于调整时间的功能,那三个功能键总是时灵时不灵的,我们检查了硬件和软件都没能发现故障在那里,没能解决这个问题也是这次电子综合设计实验的一个遗憾。
通过本次设计,我们对单片机有了更深刻的认识,也从实践的例子中去感受到了单片机设计给我们设计带来的改变与进步。
我们不仅掌握KeiluVision2和protues软件的使用,与此同时,我们还对电子设计的思路有了更多的认识。
这次对多功能数字钟的设计与制作,让我了解设计电路的程序,也了解了关于多功能数字钟的原理与设计理念。
在此次的多功能数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和具体的使用方法。
总之是受益匪浅。
这为自己今后进一步深化学习,积累了一定宝贵经验,撰写设计的过程也是专业知识的学习过程,它使我运用已有的专业知识,对其进行设计,分析和解决问题,把知识转化为能力的训练。
8.参考文献
[1]《电子技术综合设计教程》,袁小平,机械工业出版社;
[2]《MCS-51系列单片机实用接口技术》,李华北,北京航空航天大学出版社;
[3]彭小军.用单片机实现电子钟[J].新余高专学报,2004年4月第9卷第2期;
[4]《Proteus教程:
电子线路设计制版与仿真》,朱清慧,清华大学出版社,2011第2版;
9.附录
1.所需原件列表:
元件
规格
数量
单片机
STC89C52
排阻
10k
LCD
LMO160
电阻
10
电容
30PF
2
1uF
3
开关
按键开关
电池盒
四节
万能板
15*9cm
晶振
12MHZ
32K
导线
2m
焊锡
较好
电池
5号
温度传感器
DS18B20
时钟芯片
DS1302
2.程序:
DS18B20子程序:
sbitDQ=P2^0;
//定义DQ引脚为P2.0
/*******************************延时函数*******************************/
voidDS18_delay(intuseconds){
ints;
for(s=0;
s<
useconds;
s++);
}
/*******************************复位函数*******************************/
unsignedcharow_reset(void)
{
unsignedcharpresence;
DQ=0;
//将DQ线拉低
DS18_delay(29);
DQ=1;
//DQ返回高电平
DS18_delay(3);
//等待存在脉冲
presence=DQ;
//获得存在信号
DS18_delay(25);
//等待时间隙结束
return(presence);
//返回存在信号,0=器件存在,1=无器件
/******************************位写入函数****************************/
voidwrite_bit(charbitval)
//将DQ拉低开始写时间隙
if(bitval==1)DQ=1;
//如果写1,DQ返回高电平
DS18_delay(5);
//在时间隙内保持电平值,
}
/****************************字节写入函数******************************/
voidds18write_byte(charval)
unsignedchari;
unsignedchartemp;
for(i=0;
i<
8;
i++){//写入字节,每次写入一位
temp=val>
>
i;
temp&
=0x01;
write_bit(temp);
/****************************位读取函数*******************************/
unsignedcharread_bit(void)
//将DQ拉低开始读时间隙
//thenreturnhigh
3;
i++);
//延时15μs
return(DQ);
//返回DQ线上的电平值
/****************************字节读取函数******************************/
unsignedcharDSread_byte(void)
unsignedcharvalue=0;
i<
i++){//读取字节,每次读取一个字节
if(read_bit())value|=0x01<
<
//然后将其左移
DS18_delay(6);
return(value);
/*******************************读取温度函数***********************/
unsigned
intReadTemperature(void)
unsignedcharget[10];
unsignedchartemp_lsb,temp_msb;
unsignedintt;
unsignedchark;
ow_reset();
ds18write_byte(0xCC);
//跳过ROM
ds18write_byte(0x44);
//启动温度转换
ds18write_byte(0xBE);
//读暂存器
for(k=0;
k<
2;
k++){get[k]=DSread_byte();
temp_msb=get[1];
//Signbyte+lsbit
temp_lsb=get[0];
//Tempdatapluslsb
t=temp_msb*256+temp_lsb;
t=t&
0x0ff0;
if(t<
0xff&
&
t>
0xf0)
t=(-1)*t;
returnt>
4;
主程序:
#include<
reg51.h>
#include"
DS18B20_3.H"
#defineuintunsignedint
#defineucharunsignedchar
uchara,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
//flag用于读取头文件中的温度值,和显示温度值
#defineyh0x80//LCD第一行的初始位置
#defineer0x80+0x40//LCD第二行初始位置
//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbitrs=P3^7;
sbiten=P3^5;
sbitrw=P3^6;
sbitled=P2^6;
//LCD背光开关
//DS1302时钟芯片与C51之间的引脚连接定义
sbitIO=P3^3;
sbitSCLK=P3^2;
sbitRST=P3^4;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
//校时按键与C51的引脚连接定义
sbitkey1=P2^2;
//设置键
sbit