电子万年历报告书文档格式.docx
《电子万年历报告书文档格式.docx》由会员分享,可在线阅读,更多相关《电子万年历报告书文档格式.docx(46页珍藏版)》请在冰点文库上搜索。
3.2子程序的设计……………………………………………………………………………12
3.2.1DS18B20温度子程序……………………………………………………………………13
3.2.2读、写DS12C887子程序………………………………………………………………15
四、指标测试……………………………………………………………………………………17
4.1测试仪器…………………………………………………………………………………17
4.2硬件测试…………………………………………………………………………………17
4.3软件测试……………………………………………………………………………………17
4.4测试结果分析与结论………………………………………………………………………18
4.4.1测试结果分析…………………………………………………………………………18
4.4.2测试结论………………………………………………………………………………18
五、心得体会……………………………………………………………………………………19
参考文献………………………………………………………………………………………20
附录一:
系统电路图……………………………………………………………………………21
附录二:
系统程序清单…………………………………………………………………………22
附录三:
系统使用说明书………………………………………………………………………34
附录四:
实物图片………………………………………………………………………………35
一、设计要求与方案论证
1.1 设计要求
可以显示年、月、日、星期、时、分、秒的功能;
具有温度计功能;
c具有手动校准功能;
d可用普通3V干电池供电;
1.2系统基本方案选择和论证
1.2.1单片机芯片的选择方案和论证
方案一:
采用89C51芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,当需要修改或对程序的新增功能烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:
采用AT89S52,片内ROM全都采用FlashROM;
能以3V的超底压工作;
同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
综合考虑,所以选择采用AT89S52作为主控制系统芯片。
1.2.2显示模块选择方案和论证
方案一:
采用LED液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,但是价格昂贵,需要的接口线多,所以在此设计中不采用LED液晶显示屏。
方案二:
采用LCD显示屏,虽然价格较LED液晶便宜,接线也相对简易,但显示效果非常单一,且在光线过强或过弱的条件下均不易看清显示数据,所以不采用此方案。
方案三:
采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。
方案四:
采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。
最大优点是可以在室内光线阴暗的条件下远距离看清其显示数据。
综合考虑以上方案,所以采用了LED数码管作为显示模块。
1.2.3时钟芯片的选择方案和论证
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
所以不采用此方案。
采用DS12C887时钟芯片实现时钟,DS12C887芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,最大优点是其内部带有锂电池,具有掉电保护功能,且能保持10年之久。
1.2.4温度传感器的选择方案与论证
使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。
。
此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。
采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。
另外,数字式温度传感器还具有测量精度高、测量范围广等优点。
1.3电路设计最终方案决定
综上各方案所述,对此次作品的方案选定:
采用AT89S52作为主控制系统;
DS12C887提供时钟;
数字式温度传感器为DS18B20;
LED数码管动态扫描作为显示。
二、系统的硬件设计与实现
2.1电路设计框图
2.2系统硬件概述
本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;
时钟电路由DS12C887提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS12C887内部有一个31*8的用于临时性存放数据的RAM寄存器。
可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;
温度的采集由DS18B20构成;
显示部份由17个数码管,4个74HC573锁存器构成。
使用动态扫描显示方式对数字的显示。
2.3主要单元电路的设计
2.3.1单片机主控制模块的设计
AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。
如图-1所示
图-1主控制系统
2.3.2时钟电路模块的设计
AD0~AD7:
复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的数据信息。
AS:
地址选通输入脚,在进行读写操作时,AS的上升沿将AD0~AD7上出现的地址信
息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论是否有效,
DS12C887都将执行该操作。
DS:
数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。
在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外
部读取。
在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁存在DS12C887中;
当MOT接GND时,选用Intel工作模式,在该模式中,该引脚是读允许输入脚,即Read
Enable。
R/W:
读/写输入端,该管脚也有2种工作模式,当MOT接VCC时,R/W工作在
Motorola模式。
此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W为高电平时为读操作,R/W为低电平时为写操作;
当MOT接GND时,该脚工作在Intle模式,此时该作为写允许输入,即WriteEnable。
CS:
片选输入,低电平有效。
IRQ:
中断请求输入,低电平有效,该脚有效对DS12C887内的时钟、日历和RAM中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的应用中,RESET可以直接接
VCC,这样可以保证DS12C887在掉电时,其内部控制寄存器不受影响。
图-2DS12C887的引脚图
2.3.3温度采集模块设计
如图-3所示。
采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。
图-3DS18B20温度采集
2.3.4电路原理及说明
图-4DS12C887读/写时序图
表-2DS12C887的日历、时间寄存器
此外,DS12C887还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS12C887与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;
另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
2.3.5显示模块的设计
如图-5所示,采用动态扫描显示,由17个数码管,1个74HC573接到共阳数码管的位控制,再用3个锁存器分别控制三行数码管段选位。
4个锁存器采用分时复用的方法共用P0口。
图-5LED动态扫描显示
三、系统的软件设计
3.1程序流程框图
图-A主程序流程图
图-B计算阳历程序流程图
图-C时间调整程序流程图
3.2子程序的设计
3.2.1DS18B20温度子程序
///////////////////DS18B20温度模块/////////
////延时函数
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=30;
y>
y--);
}
voiddly(uintt)
{
for(;
t>
t--);
}
///********************温度************///
voidreset()
ucharpresence=1;
while(presence)
DQ=1;
_nop_();
_nop_();
DQ=0;
dly(50);
dly(6);
presence=DQ;
dly(45);
presence=~DQ;
//////写一个字节
voidwrite_byte(ucharval)
uchari;
for(i=8;
i>
i--)
DQ=val&
0x01;
val=val/2;
}
///////读一个字节
ucharread_byte(void)
ucharvalue=0;
value>
>
=1;
if(DQ)value|=0x80;
return(value);
}
//////温度读取函数
voidread_temp()
uchara,b;
uchartflag;
//负号标志
uintt=0;
//读取的温度
reset();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
//读取高字节
b=read_byte();
//读取低字节
write_byte(0x44);
//处理读取温度t
t=b;
t<
<
=8;
//值左移8位
t=t|a;
//合并高低位数值
if(t<
0xfff)//判断温度是为正还是为负
tflag=1;
//温度为正数
else
{
tflag=0;
//温度为负数
t=~t+1;
//负值换算
t=t*(0.625);
//温度扩大10倍,精确到1位小数
tempdata[1]=t%1000/100;
//十位数
tempdata[2]=t%100/10;
//个位数
tempdata[3]=t%10;
//小数位
if(tempdata[0]==1);
elseif(tflag)
tempdata[0]=0x20;
//符号位
else
tempdata[0]='
-'
;
voidSmgshow()//显示温度十位
P0=0x00;
wei=1;
P0=0x08;
//选通第4位
wei=0;
P0=0xff;
l2=1;
P0=led[tempdata[2]];
//显示温度个位
delay(5);
P0=0xff;
l2=0;
P0=0x04;
//选通第3位
P0=led[tempdata[1]];
//显示温度十位
3.2.2读/写DS12C887子程序
voidwrite_ds(ucharadd,uchardate)//写数据函数
{dscs=0;
dsds=1;
dsrw=1;
dsas=1;
P2=add;
dsas=0;
dsrw=0;
P2=date;
dscs=1;
ucharread_ds(ucharadd)//读数据函数
uchards_date;
dsirq=0;
dscs=0;
//读地址
dsds=0;
ds_date=P2;
dsirq=1;
returnds_date;
}
四.指标测试
4.1测试仪器
序号
名称
型号
1
PC机
联想笔记本(旭日120)
2
直流稳压电源
3
V8通用单片机仿真器
V8/L
4
数字万用表
5
ISP在线编程器
4.2硬件测试
电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。
在电子万年历的设计调试中遇到了很多的问题。
回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:
LED数码管的断码错乱,原因出于没有认真看清a、b、c等引脚信息。
解决:
重新排列74HC573的输出端,相应接入LED数码管,即可解决出现的断码或乱码。
对万年历修改时间或日期时,有时LED数码管被屏蔽掉,造成不亮现象。
在进入调时程序时,在调时前将当前时间读入调时程序,然后在子程序中不断扫描。
4.3软件测试
电子万年历是多功能的数字型,可以看当前日期(阴、阳历),时间,还有温度的仪器。
电子功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。
最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。
在软件的调试过程中主要遇到的问题如下:
1、烧入程序后,LED数码管显示闪动,而且亮度不均匀。
首先对调用的延时进行逐渐修改,可以解决显示闪动问题。
其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令(即消隐),最后解决了此问题。
2、加入温度的程序后,进行修改时间、日期时相应的数码管位没有按要求闪动。
解决:
由于DS18B20是串行通信数据,只用一个口线传输,在处理采集的模拟信号时需要一定的时间,当把万年历的程序相接入时,会对延时有很大的影响。
所以在调用温度子程序时,只是间隔一段时间(如2秒钟)读取一次温度值,最终解决了此问题。
4.4测试结果分析与结论
4.4.1测试结果分析
(1)在测试中遇到发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏。
(2)LED数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。
查看烧写的程序是否正确无误,对程序进行认真修改。
4.4.2测试结论
经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力,同时在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固.
五、心得体会
在整个设计过程中,发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。
较好的完成了作品。
达到了预期的目的,在最初的设计中,发挥“三个臭皮匠,顶个诸葛亮”的作用。
相互学习、相互讨论、研究。
完了最初的设想。
在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。
反而达到事半功倍的效果。
对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。
程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路,反而得心应手。
在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。
也练就了我们的耐心,做什么事都在有耐心。
在本次制作中我们都学到了很多很多东西,这是最重要的。
感谢电工电子实验室给我们提供了一个展现自己的舞台,给我们一次难得煅炼的机会,使得我们的动手能力和专业技能都有了很大的提高。
参考文献
【1】刘勇编数字电路电子工业出版社2004
【2】杨子文编单片机原理及应用西安电子科技大学出版社2006
【3】王法能编单片机原理及应用科学出版社2004
【4】刘笃仁、韩保君编传感器原理及应用技术机械工业出版社2003.8
【5】李朝青主编单片机原理及接口技术北京航空航天大学出版社2005.10
系统总电路图
系统总程序清单
#include<
bbs.h>
ds18b20.c>
ds12c887.c>
smgshow.c>
key.c>
voidinit()
wei=0;
l1=0;
l2=0;
l3=0;
dsas=0;
dsrw=0;
dsirq=0;
//init_time();
//设定时钟初值
read_temp();
//读出温度初值
Smgshow();
/////////