当前位置:文档之家› 基于AT89C52的电子万年历设计报告

基于AT89C52的电子万年历设计报告

目录

摘要 (3)

关键词 (3)

一、设计任务与要求 (3)

二、方案设计与论证 (3)

方案一 (3)

方案二 (4)

方案三 (4)

三、硬件单元电路设计与参数计算 (5)

1. 主控制系统 (5)

2. 时钟振荡电路 (5)

3. 复位电路 (6)

4. DS1302时钟电路 (7)

5. 按键电路 (8)

6. 显示电路 (8)

7. 蜂鸣器电路 (9)

四、软件设计与流程图 (9)

五、总原电路及元器件清单 (13)

1. 总原理图 (13)

2. PCB制板图 (13)

3.整体电路仿真图以及仿真结果分析 (14)

4.元件清单 (14)

六、安装与调试 (15)

1. 电路安装 (15)

2. 电路调试 (15)

3. 软件调试 (16)

七、性能测试与分析 (16)

八、结论与心得 (16)

九、参考文献 (16)

十、程序清单 (17)

摘要:随着社会的快速发展,时间的流逝,从观察太阳、摆钟到现在的单片机

电子钟,人类不断研究,不断创造新纪录,单片机电子万年历已成为当今人类准确、快速获取时间信息的重要工具之一。本设计的电子万年历以AT89C52单片机为控制核心,采用Dallas公司的DS1302实时时钟构成时钟电路,能够实现时间和日期的显示,还增加了闹钟报时的功能。设计详细地分析设计原理和制作的全过程。

关键词:单片机;实时时钟;DS1302;12864,wt588d语音模块;

一、设计任务:

设计一个具有多功能的电子万年历。

二、基本要求:

1、能够显示阳历年、月、日、星期、小时、分、秒。

2、显示模块采用LCD液晶显示,要求能用按键调整时间。

3、能显示阴历月、日,在显示阴历时间时能标明是否为闰年。

3、具有定时报警功能,能够进行整点和半点的语音报时。

4、具有闹钟设定的功能。

发挥部分:

1、掉电存储功能,可存储掉电前用户定时设置。

2、具有日程管理,可以设定指定日期的日程,可以设置日成的提醒时间,

并可用语音进行提示。

3、可以保存30个日程设定,每个日程的提醒采用音乐提醒至少有5首歌曲

进行选择播放,提示音乐具有重复播放的功能。

三、方案设计与论证

方案一:

按照系统设计的功能的要求,初步确定系统由主控模块、时钟模块、显示模块、语音模块各键盘接口模块共5个模块组成,电路系统构成框图如图1所示。主控芯片使用52系列AT89C52单片机,时钟芯片使用美国DALLAS公司推出的一款高性能、低功耗、带RAM的实时时钟DS1302。采用DS1302作为计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备电源(2.5V--5.5V 电源,在2。5V时耗电小于300nA)下继续计时,而且DS1302可以编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本功不耗电。显示模块采用普通的共阳LED数码管,键输入采用查询法实现功能调整。

语音模块主控模块

AT89C52

键盘扫描电

路路

LED显示电路

时钟电路(DS1302)

图1 电子万年历电路系统构成框图

方案二:

按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块,LCD 显示模块,语音模块,电源电路、复位电路、晶振电路几个模块,系统框图如图2所示。主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间和设定闹钟,显示模块采用LCD12864,时钟电路模块采用DS1302实时时钟实现对时间,日期的操作。

图2 基于AT89C52单片机的电子万年历系统框图

方案三:

按照系统设计的要求和功能,将系统分为主控制器模块、显示模块、按键开关模块、蜂鸣器电路模块。系统框图如图3所示,主控制模块采用AT89C52单片机为控制中心,显示模块采用液晶LCD12864显示,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通过按键盘开关实现对时间、日期的调整。

图3 基于AT89C52单片机的电子万年历总体设计框图

方案论证:上面提到的三个方案中,在电路原理方面大致相同,都能够达到设计任务与要求,在方案一款方案二中使用外部的时钟芯片DS1302来实现日期和时间的操作,方案三中则利用了单片机自身的定时器功能;在方案二和方案三

单片机 AT89C52

复位电路

晶振电路

按键电路

LCD1602显示模块

蜂鸣器电路

主控模块

AT89C52

复位电路 晶振电路

按键扫描模块

LCD12864显示模块

时钟电路 (DS1302)

语音模块wt588d

语音模块

在显示模块上都使用液晶显示屏LCD12864作为显示,方案一则使用LED数码管作为显示,采用LED数码管动态扫描,数码管的价格适中,对于显示数字较好,而且使用单片机的端口也较少;采用LCD12864液晶显示屏,液晶显示屏的显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED

数码管来说要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,价格也相应的会提高,而且不利于控制,对于LCD12864,随着现在制造的发展,价格也在下降,同时它所使用的端口也不很多,能够清晰的显示,比较适合显示大量的数字,但LCD12864显示模块的屏幕面积相对于12864要小,不足以显示所有内容,故选择DS12864作为显示模块。DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,同时可以对秒、时、分、日、月、年以及润年补偿的年进行计数,而且在掉电时能够在外部纽扣电池的供电下继续工作,不会因为掉电后,其时间就要重新设置,方案三中使用定时器的功能,当在掉电的时候就会使时间和日期回到原来设定的初始值,同时直接采用单片机定时计数提供秒信号,使用程序实现年时间和日期,采用此种方案,节约成本,但是实现的时间误差较大,所以不采用这种方案。

通过对上述方案的论证分析,本次设计选择方案二,采用AT89C52作为主控制系统,DS1302提供时钟,LCD12864液晶作为显示模块

四、硬件单元电路设计与参数计算

1、主控制系统

单片机中央处理系统的方案设计,我们选用具有ATMEL公司的AT89C52单片机作为中央处理器,如图4所示。该单片机除了拥有MCS-51系列单片机的所有优点外,内部还具有8K的在系统可编程FLASH存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。整个系统结构紧凑,抗干扰能力强,性价比高。是比较合适的方案。

图4 AT89C52主控制系统

2、时钟振荡电路

时钟振荡电路图5所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度,对于AT89C52其工作频率为0至33MHz,在这个范围内单片机能够正常的工作。

图5 AT89C52时钟振荡电路

3、复位电路

复位电路由电阻和极性电容组成,如图6所示,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。手动按钮复位需要人为在复位输入端RST上加入高电平。一般采用的办法是在RST端和正电源Vcc之间接一个按钮和一个电阻,如图所示,当人为按下按钮时,则Vcc 的+5V电平就会直接加到RST端,由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间,由图可知充电时间为:T=2.3RC=2.3*10*10-6*5.1*103=0.1173s ,保证系统能够

可靠地复位。

图6AT89C52复位电路

4、DS1302时钟电路

时钟电路主要由时钟芯片DS1302、备用电池、晶振等几部分组成,如图7所示。DS1302采用3线串行接口,占用引脚少,内部集成了可编程日历时钟,用户可以根据需要通过单片机的控制来自行设置,支持双电源供电,可以使用外部主电源和备用电源,备份电源能够使时钟芯片继续工作。

图7DS1302时钟电路

5、按键电路

按键电路由四个轻触开关组成,如图8所示。按键用来调整时间和设定闹钟,其一端直接接到单片机的端口,另一端接地,当按下按键时,相应的端口变为低电平,通过检测这一低电平就可以判断是哪个键按下,从而作相应的操作。

图8 按键电路

6、蜂鸣器电路

蜂鸣器电路由一个220欧的电阻,三极管8550,及蜂鸣器组成,如图10所示。通过控制三极管的导通和截止来实现蜂鸣器的响与不响。

图10 蜂鸣器电路

7.wt588模块

按键控制模式触发方式灵活,可随意设置任意按键为脉冲可重复触发、脉冲不可重复触发、无效按键、电平保持不可循环、电平保持可循环、电平非保持可循环、上一曲不循环、下一曲不循环、上一曲可循环、下一曲可循环、音量+、音量-、播放/暂停、停止、播放/停止等15种触发方式;

一线串口控制模式及三线串口控制模式可通过MCU发码端控制语音播放、停

止、循环播放和音量大小,或者直接触发0~219地址位的任意语音。 管脚图及描述:

1234567891011121314

15

16171819202122232425262728NC NC NC NC NC NC RE SE T DAC PWM+PWM-P14P13P16GND

P15

P03P02P01P00VCC BU SY VDD NC NC GND D-D+VDD-US B

WT588D-U

8.AT24C02

AT24C02是一个2K 位串行CMOS E2PROM , 内部含有256个8位字节,CATALYST 公司的先进CMOS 技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC 总线接口进行操作,有一个专门的写保护功能。

封装引脚

引脚标号 简述 功能描述 1 NC NC 空 2 NC NC 空 3 NC NC 空 4 NC NC 空 5 NC NC 空 6 NC NC 空 7 RESET RESET 复位脚

8 DAC DAC DAC 音频输出脚,需外接功放才能驱动扬声器 9 PWM+ PWM+ PWM+音频输出脚,跟PWM-组合可直接驱动扬声器 10 PWM- PWM- PWM-音频输出脚,跟PWM+组合可直接驱动扬声器 11

P14

SPI-FLASH_DI

烧写程序数据输入脚(利用外部下载器下载时用到)

管脚图:

引脚图:

管脚名称功能

A0、A1、A2 器件地址选择

SDA 串行数据、地址

SCL 串行时钟

WP 写保护

VCC +1.8V~6.0V 工作电压

VSS 地

功能:

AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,由于A0、A1和A2可以组成000~111八种情况,即通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上,通过进行不同的配置进行选择器件。

五、软件设计与流程图

1、程序流程图

主程序首先初始化定时器、LCD12864及DS1302,然后就开始查询按键,有键按下则开始调整时间和设置闹钟,若没有按下,则执行下面的时间、日期及闹钟时间的显示,最后依次循环这些相同的操作,相应流程图如图11所示:

图11 程序主流程图

按键的检测主要是通过查询的办法来实现,利用按键进行间调整及闹钟设置,首先检测K1键是否按下,当K1键按下时,并且K2键按下时,则设置初始的默认时间;当K1按下,并且K4按下时,则是开启闹钟功能;若只是K3按下则开始设置时间及日期,同时被选择的时间和日期开始闪烁,第一次按下K3时,设置年份,若按下K1,则是减1操作,按下K2是加1操作,设置好年后,第二次按下K3时,则是设置月份,按K1减,按K2则加1,依次循环下去,则可以将时间和日期设置完毕;而当按下K4时,则是设置闹钟时间,第一次按下K4,设置时,按K1时减1,按K2时加1,第二次按下时,设置分,同样的操作,按K1分减1,按K2分加1,程序流程图12所示:

开始

初始化

按键是否按

显示时间、日期及闹钟时间

时间、日期、闹钟设定

结束

图12 时间调整及闹钟设置程序流程图

六、总原电路及元器件清单

1、总原理图

基于AT89C52单片机的电子万年历硬件电路图如图13所示,系统由AT89S52单片机,按键扫描电路、显示电路、时钟电路、晶振电路、复位电路、电源指示电路及蜂鸣器输出电路。

图13 基于AT89C52的电子万年历电路原理图

4、元件清单

基于AT89C52单片机的电子万年历元件清单如表1所示。

表1 基于AT89C52单片机的电子万年历元件清单

元件名称型号数量/个用途

单片机AT89C52 1 控制核心

时钟芯片DS1302 1 实时时钟

晶振12MHz 1 晶振电路

晶振32.768kHz 1 时钟电路

电容30pF 2 晶振电路

电解电容10uF/25V 1 复位电路

按键开关6*6*6 5 按键/复位电路

电阻1K 1 电源指示电路

电阻 5.1K 1 复位电路

电阻220 2 限流/复位电路

滑动变阻器1M 1 LCD12864背光调

三极管S8550 1 蜂鸣器电路

发光二极管红色 1 电源指示电路

蜂鸣器有源蜂鸣器 1 蜂鸣器电路

纽扣电池CR2025/3V 1 时钟电路

纽扣电池座CR2025 1 时钟电路

排座间距2.54mm 16 显示电路

LCD LCD12864 1 显示电路

排针间距2.54mm 2 电源接口

独石电容104 1 电源接口

电源Vcc +5V 1 提供+5V电源

七、安装与调试

1、电路安装

用Proteus 画好电路图后,然后将各元件焊在电路板上,依照高矮,将剩余的元件安装在电路板上,并依次焊接好.当焊接完成后.剪去引脚,并测试电路焊接后是否有短路.

2、电路调试

在测试中遇到LCD12864不能够显示出时间和日期,经过检查才发现是LCD12864的背光没有调好,通过调节接在LCD12864上3脚上的滑动变阻器,改变所给的电压,可以清晰地看见了LCD能够显示。

对于DS12864在测试过程中发其上电不久就发热,在检查电路过程中,不是因为发现芯片短路,最终检查发现原来是DS12864的引脚接法不正确,给+5V的应该是芯片的脚,给后备电池的是1脚,当换过来之后,芯片就不发热了,而且可以正常显示出我们要显示的时间和日期。

3、软件调试

在软件调试过程中,当按下按键调节时间和日期后,时间不能继续在加,后来分析了程序才发现,是在设置好时间和日期时我们暂停了时钟,在设置完后没有启动时钟,所以时间和日期就不能够继续走,在那里停止了,发现这个原因后,我在设置完时间后就开启时钟,时间和日期就能够正确显示了。

八、性能测试与分析

上电测试,LCD12864能够正确显示时间和日期,第一次K3按钮,开始设置年,再按K1,年减1,按K2,年加1,按二次K3,设置月,按K1,月减1,按K2,月加1,按三次K3,设置日,按K1,日减1,按K2,日加1,按四次K3,设置时,按K1,时减1,按K2,时加1,按五次K3,设置分,按K1,分减1,按K2,分加1,按第五次,设置时间完成。闹钟设置,按下K4,开始设置闹钟,按第一次,设置分,按K1,时减1,按K2,时加1,按第二次设置分,按K1,分减1,按K2,分加1,设置好闹钟后,按组合键K1+K4开启闹钟功能,当到闹钟时间后,蜂鸣器响,闹钟时间为1分钟,

在对电路测试后,电路达到了所需的功能。

通过对电路的多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力及对电路的分析能力,同时在软件的编程方面得到了更高的提高,对编程能力得到加强,同时对所学的知识得到了大的提高与巩固。

九、结论与心得

在这学期的课程序设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教学长,以及不懈的努力,不仅培养了独立思考、动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在程序设计里,我们学会了很多学习的方法。而这是以后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学的交流过程中,互动学习,将知识融会贯通,提高自己与人交流的能力,提高自己的团队意思。老师给我们提出了许多革新非常的好,让我们能够有更多的发挥空间,提高了自己开发创新的能力。

十、程序清单

程序清单如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int

void Conversion(bit,unsigned char,unsigned char,unsigned char);

uchar tt=1;

bit c_moon;

bit cenbit=1;

bit w;

sbit rs=P1^4;

sbit rw=P1^5;

sbit e=P1^6;

sbit psb=P1^7;

sbit busy=P0^7;//lcd busy bit

sbit DS1302_CLK=P2^0;

sbit DS1302_IO=P2^1;

sbit DS1302_RST=P2^2;

sbit scl=P3^0;

sbit sda=P3^1; //实时时钟复位线引脚

bit c_moon;

sbit speak=P3^7;

//bit cenbit=1;

sbit SetKey=P1^0;//按键功能:设置

sbit SureKey=P1^1;//按键功能:确认

sbit PlusKey=P1^2;//按键功能:加

sbit ReduceKey=P1^3;//按键功能:减

unsigned char

sec,min,hour,day,month,year,cen,week,next,aa,bb,cc,dd,mm,nn,yy,rr,ss, ff,tt,qq,temp0,LunarMonth,LunarDay,LunarYear;

int temp;

uchar TempBuffer[8],week_value[3];

uchar

hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数

void DisplayLunarYearD();

void delay_50us(uint t)

{

uchar j;

for(;t>0;t--)

for(j=12;j>0;j--);

}

void delay_50ms(uint t)

{

uint j;

for(;t>0;t--)

for(j=5500;j>0;j--);

}

void start()

{

sda=1;

scl=1;

delay_50us(1);

sda=0;

delay_50us(2);

}

void stop()

{

sda=0;

scl=1;

delay_50us(1);

sda=1;

delay_50us(2);

}

void response()

{ uchar i;

while((sda==1)&&i<255)

i++;// 给应答信号sda=0;错误(while((sda==0)|i<255)i++;)程序进入while死循环

scl=1;

delay_50us(1);

scl=0;//没有这一步出错,如果没有sda将保持0状态,一直处于应答中。程序停止。

delay_50us(1);

}

void write24c02(uchar date)

{ uchar temp,i;

temp=date;

for(i=0;i<8;i++)

{ scl=0;

sda=temp&0x80;

delay_50us(1);

scl=1;

delay_50us(1);

temp=temp<<1;

}

scl=0;

delay_50us(1);

sda=1;

delay_50us(1);

}

uchar read24c02()

{ uchar k,i;

scl=0;

delay_50us(1);

sda=1;//仅仅是释放数据线,可有可无

for(i=0;i<8;i++)

{

scl=1;

delay_50us(1);

k=k<<1;

if(sda)

k++;

scl=0;

delay_50us(2);

}

return k;

}

void write_24c02add(uchar address,uchar date)

{ start();

write24c02(0xa0);

response();

write24c02(address);

response();

write24c02(date);

response();

stop();

}

uchar read_24c02add(uchar address)

{ uchar a;

start();

write24c02(0xa0);

response();

write24c02(address);

response();

start();

write24c02(0xa1);

response();

a=read24c02();

stop();

return a;

}

void WriteDs1302Byte(unsigned char temp)

{

unsigned char i;

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

{

DS1302_IO=temp&0x01;

DS1302_CLK=0;

DS1302_CLK=1;

temp>>=1;

}

}

void WriteDs1302(unsigned char address,unsigned char dat) {

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

delay_50us(1);

WriteDs1302Byte(address);

WriteDs1302Byte(dat);

DS1302_RST=0;

}

unsigned char read_byte()

{

uchar i;

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

{

if(DS1302_IO)

temp0=temp0|0x80;

DS1302_CLK=1;

DS1302_CLK=0;

temp0=temp0>>1;

}

return temp0;

}

unsigned char ReadDs1302(unsigned char address) {

unsigned char temp;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

WriteDs1302Byte(address);

temp=read_byte();

DS1302_RST=0;

DS1302_CLK=1;

return temp;

}

void InitDS1302()

{

unsigned char Second;

Second=ReadDs1302(0x80);

if(Second&0x80)

{ WriteDs1302(0x8e,0x00);

delay_50us(5);

WriteDs1302(0x8c,0x10);

//写入年份10年

delay_50us(5);

WriteDs1302(0x8a,0x06);

//写入星期6

delay_50us(5);

WriteDs1302(0x88,0x11);

//定入月分11月

delay_50us(5);

WriteDs1302(0x86,0x6);

//写入日期6日

delay_50us(5);

WriteDs1302(0x84,0x17);//写入小时17点

delay_50us(5);

WriteDs1302(0x82,0x43);

delay_50us(5);

WriteDs1302(0x80,0x00);//写入秒30秒

delay_50us(5);

WriteDs1302(0x8e,0x80);//控制命令,WP为1,禁止写操作 }

}

code unsigned char YearCode[597]={

0x04,0xAe,0x53,//19010

0x0A,0x57,0x48,//19023

0x55,0x26,0xBd,//19036

0x0d,0x26,0x50,//19049

0x0d,0x95,0x44,//19051 2

0x46,0xAA,0xB9,//19061 5

0x05,0x6A,0x4d,//19071 8

0x09,0xAd,0x42,//19082 1

0x24,0xAe,0xB6,//1909

0x04,0xAe,0x4A,//1910

0x6A,0x4d,0xBe,//1911

0x0A,0x4d,0x52,//1912

0x0d,0x25,0x46,//1913

0x5d,0x52,0xBA,//1914

0x0B,0x54,0x4e,//1915

0x0d,0x6A,0x43,//1916

0x29,0x6d,0x37,//1917

0x09,0x5B,0x4B,//1918

0x74,0x9B,0xC1,//1919

0x04,0x97,0x54,//1920

0x0A,0x4B,0x48,//1921

0x5B,0x25,0xBC,//1922

0x06,0xA5,0x50,//1923

0x06,0xd4,0x45,//1924

0x4A,0xdA,0xB8,//1925

0x02,0xB6,0x4d,//1926

0x09,0x57,0x42,//1927

0x24,0x97,0xB7,//1928

相关主题
文本预览
相关文档 最新文档