数字电子钟课程设计报告.docx

上传人:b****2 文档编号:2122329 上传时间:2023-05-02 格式:DOCX 页数:15 大小:618.45KB
下载 相关 举报
数字电子钟课程设计报告.docx_第1页
第1页 / 共15页
数字电子钟课程设计报告.docx_第2页
第2页 / 共15页
数字电子钟课程设计报告.docx_第3页
第3页 / 共15页
数字电子钟课程设计报告.docx_第4页
第4页 / 共15页
数字电子钟课程设计报告.docx_第5页
第5页 / 共15页
数字电子钟课程设计报告.docx_第6页
第6页 / 共15页
数字电子钟课程设计报告.docx_第7页
第7页 / 共15页
数字电子钟课程设计报告.docx_第8页
第8页 / 共15页
数字电子钟课程设计报告.docx_第9页
第9页 / 共15页
数字电子钟课程设计报告.docx_第10页
第10页 / 共15页
数字电子钟课程设计报告.docx_第11页
第11页 / 共15页
数字电子钟课程设计报告.docx_第12页
第12页 / 共15页
数字电子钟课程设计报告.docx_第13页
第13页 / 共15页
数字电子钟课程设计报告.docx_第14页
第14页 / 共15页
数字电子钟课程设计报告.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数字电子钟课程设计报告.docx

《数字电子钟课程设计报告.docx》由会员分享,可在线阅读,更多相关《数字电子钟课程设计报告.docx(15页珍藏版)》请在冰点文库上搜索。

数字电子钟课程设计报告.docx

数字电子钟课程设计报告

 

 

课程设计

 

课程名称

单片机课程设计

题目名称

电子钟

专业班级

11电子信息科学2班

学生姓名

李小刚

学号

51102022028

指导教师

谢春祥

 

本设计是一种基于AT89C51单片机控制的数字万年历设计。

它具有多项显示和控制功能。

能用LCD实时显示当前年、月、日、星期、时间;可对时间进行调整;具有调整时间和日期时报警功能。

本设计通过一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

关键字:

AT89C51单片机、LCD液晶显示、双电源供电、

 

数字电子钟设计

一、任务设计:

1、设计任务:

利用AT89C51单片机设计一个具有如下功能的电子万年历。

2、设计要求:

●能够显示年、月、日、时、分、秒、星期;

●可更改年、月、日、时、分、秒、星期;

3.发挥部分:

●能够通过按键对时间与日期进行调整;

二、方案论证:

1.显示部分:

显示部分是本次设计的重要部分,一般有以下两种方案:

方案一:

采用LED显示,分静态显示和动态显示。

对于静态显示方式,所需的译码驱动装置很多,引线多而复杂,且可靠性也较低。

而对于动态显示方式,虽可以避免静态显示的问题,但设计上如果处理不当,易造成亮度低,有闪烁等问题。

方案二:

采用LCD显示。

LCD液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。

鉴于上述原因,我们采用方案二。

2.时钟芯片的选择:

数字时钟是本设计的核心的部分。

根据需要可采用以下两种方案实现:

方案一:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。

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

方案二:

采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5——5.5V,2.5V时耗电小于300nA。

基于时钟芯片的上述优点,本设计采用方案二完成数字时钟的功能。

3.电源模块:

方案一:

采用干电池作为系统电源。

但需经常换电池,不符合节约型社会的要求。

方案二:

采用直流稳压电源作为系统主电源。

不仅不需要经常更换电源,并且当市电停止时能够采用干电池做为系统电源,使用更加安全可靠。

基于以上分析,我们决定采用方案二

 

三、总体方案:

工作原理:

按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块、LCD显示模块、电源电路、复位电路、晶振电路几个模块,系统框图如图1所示。

主控模块采用AT89C51单片机,利用按键模块调整时间,时钟电路模块采用DS1302实时时钟实现对时间,日期的操作

四、系统硬件设计(单元电路设计及分析):

1.AT89C51最小系统:

AT89C51为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,每一条I/O线都能独立地作输出或输入。

单片机的最小系统如下图所示,18引脚和19引脚接晶振电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。

第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,31引脚为电源端。

XTAL1:

单芯片系统时钟的反向放大器输入端。

XTAL2:

系统时的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。

RESET:

重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。

如下图所示:

图2单片机最小系统

2.晶振电路

时钟振荡电路图3所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。

此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。

时钟振荡电路如图3所示。

图3AT89C51时钟振荡电路

3.复位电路:

复位电路由电阻和极性电容组成,如图4所示,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。

此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。

手动按钮复位需要人为在复位输入端RST上加入高电平。

一般采用的办法是在RST端和正电源VCC之间接一个按钮以及在RST端和地之间接一个电阻,如图所示,当人为按下按钮时,则VCC的+5V电平就会直接加到RST端,由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。

图4AT89C51复位电路

4.DS1302时钟电路:

时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。

在AT89C51中芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。

此电路采用12MHz的石英晶体。

如图5所示。

图5DS1302时钟电路

5.显示电路:

引脚说明:

引脚符号功能说明1VSS一般接地2VDD接电源(+5V

)3V液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

5R/WR/W为读写信号线,高电平

(1)时进行读操作,低电平(0)时进行写操作6EE(或EN)端为使能(enable)端,下降沿使能。

7DB0底4位三态、双向数据总线0位(最低位)8DB1底4位三态、双向数据总线

1位9DB2底4位三态、双向数据总线2位10DB3底4位三态、

双向数据总线3位11DB4高4位三态、双向数据总线4位12DB5高4

位三态、双向数据总线5位13DB6高4位三态、双向数据总线6位

14DB7高4位三态、双向数据总线7位(最高位)(也是busyflang)电路接口说明:

AT889C51的P0口作为数据的输出端,P3.5和P3.6,P3.7作为控制信号的输出端。

如图7所示。

图7显示电路

5、软件设计

5.1编程语言及编程软件的选择本设计选C语言作为编程语言。

C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。

而汇编语言使用起来并没有这么方便。

本设计选用了keil作为编程软件,KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

5.2时间的显示ML016L和1602一样,都是两行十六列的液晶显示屏。

通过程序对ML016L进行初始化后,通过写指令和写数据的操作就可以再液晶屏上显示出对应的数据,而时钟数据则是从DS1302获取。

这样可以显示出时间。

六、程序:

#include"DS1302.h"

#include"SMC1602.h"

#include"KeyScan.h"

#include"KeyProcess.h"

#defineTIME1H0x3C

#defineTIME1L0xB0//定时器1溢出时间:

50ms

#defineSCANPORTP2//4×4键盘扫描端口,低4位是行线,高4位是列线。

 

//<<<<<<<<<<<<<<<防抖动标志<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

bitb_KeyShock=0;//键盘防抖动标志位。

//当按键中断产生时,首先判断此位。

//0--执行键盘扫描及键码处理程序;1--不执行。

bitb_KillShock=0;//防抖标志清除位:

0--不清除;1--清除。

unsignedcharuc_KillCount=1;//抖动标志清除计数,使用定时器1。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<<键盘扫描开启标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

bitb_KeyScan=0;//0--不扫描;

//1--扫描。

/<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

TIMEstCurrentTime;//存储从DS1302获取的时间,以及显示字符串。

bitb_TimeRefresh=0;//定时刷新标志。

unsignedcharuc_TimeRefresh=0;//定时刷新计数。

voidmain()

{

vdInitialize();//初始化LCD。

vDSInitialize();//初始化DS1302。

SCANPORT=0x0F;//初始化键盘。

vWriteCMD(0x81);

vShowChar("Date:

");

vWriteCMD(0xC1);

vShowChar("Time:

");

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

IT0=1;//中断方式:

下降沿。

EX0=1;//开启外部中断。

 

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

TH1=TIME1H;

TL1=TIME1L;

TR1=1;//开启定时器1

ET1=1;//开定时器1中断

EA=1;

while

(1)

{

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if(b_TimeRefresh==1)//没900ms执行1次,刷新LCD时间显示。

{

b_TimeRefresh=0;//恢复标志。

vDSGetTime(&stCurrentTime);//获取当前时间并将其存入指定数组。

vDateString(&stCurrentTime);//生成日期字符串。

vTimeString(&stCurrentTime);//生成时间字符串。

vWriteCMD(0x86);//向LCD写入当前时间。

vShowChar(stCurrentTime.ucaDateString);

vWriteCMD(0xC6);

vShowChar(stCurrentTime.ucaTimeString);

}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<键盘扫描及键码处理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if(b_KeyScan==1)//如果有按键按下,则进行按键扫描和键码处理。

{

b_KeyScan=0;

vKeyProcess(ucKeyScan());

}

}

}

//*************************************************************************************************

//**

//*******************************外部中断0,用于开启键盘扫描及键码处理*******************

//**

//*************************************************************************************************

voidvINT0(void)interrupt0

{

if(b_KeyShock==0)

{

b_KeyScan=1;//开启键盘扫描标志。

b_KeyShock=1;//设置防抖动标志。

}

elseb_KeyShock=0;//如果有抖动则不执行键扫描,恢复防抖动标志。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if(b_KeyShock==1)

b_KillShock=1;//如果防抖动标志位开启则开启防抖动标志清除位,

//300ms后清除防抖动标志。

}

//*************************************************************************************************

//**

//*****************定时器1中断,用于计时功能和防抖动标志清除以及显示报告*****************

//**

//*************************************************************************************************

voidvTimer1(void)interrupt3

{

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if(b_KillShock==1)

{

if(uc_KillCount==16)//当防抖动标志位为1时,计时300ms后清除抖动标志位。

{

b_KeyShock=0;

b_KillShock=0;

uc_KillCount=1;

}

elseuc_KillCount++;

}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if(uc_TimeRefresh==18)//900ms刷新显示1次。

{

b_TimeRefresh=1;

uc_TimeRefresh=0;

}

else

uc_TimeRefresh++;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1溢出时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

TH1=TIME1H;

TL1=TIME1L;

}

九、设计心得体会:

通过这次课程设计,我对单片机的理论知识有了进一步的掌握,对单片机的原理和实际应用有了更多地理解和掌握。

我对单片机的C语言编程有了更深刻的认识和更扎实的掌握,通过不断修改,不断尝试,对程序各个模块的函数都有了一个非常深入的掌握。

在收获知识的同时,还培养了独立思考、动手制作的能力,在各种其它能力上也都有了提高。

更重要的是,在课程设计里,我学会了很多学习的方法,而这是以后最实用的,真的是受益匪浅。

十、参考资料:

[1]谢维成单片机原理与应用及C51程序设计.清华大学出版社.2009.7

[2]徐淑华,程退安等.单片微型机原理及应用.哈尔滨:

哈尔滨工业大学出版社.2005.1

[3]孙余凯.精选实用电子电路260例.北京:

电子工业出版社.2007.6

[4]殷春浩,崔亦飞.电磁测量原理及应用.徐州:

中国矿业大学出版社.2003.7

[5]《LCD1602A数据手册》

[6]《DS1302数据手册》

[7]《DS18B20数据手册》

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

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2