基于51单片机的电子钟闹钟12-24小时制设计报告


项 目: 基于51单片机的电子钟闹钟12-24小时制设计

设计资料清单:

百度网盘下载链接:

链接:https://pan.baidu.com/s/1QnKZRhgwCcwNBNDUlvr_zA?pwd=d0jn
提取码:d0jn

在这里插入图片描述

1 *目录*

1 目录

2 引言

2.1 设计目标

2.2 系统结构图

3 硬件设计

3.1 AT89C51最小系统

3.2 显示模块

3.3 键盘模块

3.4 时钟源DS1302

3.5 蜂鸣器模块

4 软件设计

4.1 编程语言选择

4.2 单片机程序开发环境

4.3 C51软件开发流程

5 程序代码

5.1 函数流程框图

5.2 定时器中断

6 调试

6.1 仿真调试

6.2 系统调试

6.3 仿真结果

7 总结与展望

参 考 文 献

2 *引言*

随着嵌入式技术的迅速发展和广泛应用,单片机作为其核心组成部分,在日常生活的诸多领域展现出了无可比拟的优势。尤其在智能化、微型化和功能集成化的趋势下,51系列单片机因其结构简单、成本低廉且易于学习的特点,在教育与工业应用中扮演了至关重要的角色。其中,基于51单片机制作的电子钟和万年历产品由于其高度实用的功能特性以及便捷友好的用户操作界面,受到了广大用户和工程技术人员的广泛认可和青睐。

本课程设计项目正立足于这一时代背景和技术潮流,旨在通过理论联系实践的教学方式,借助Proteus这一强大的电子电路仿真软件平台,引领学生亲自动手设计并实现一款融合了多种实用功能于一体的电子钟万年历系统。该系统不仅包含了基本的时间显示及设置功能,还具备了闹钟设定、时间制式切换(12小时/24小时)、精确日期和星期显示等功能模块,充分体现了嵌入式系统的灵活性和智能性。

在项目实施过程中,学生将深入理解51单片机内部硬件结构的工作原理,掌握如何利用编程语言对其进行有效控制,并在此基础上进行复杂的时序逻辑设计和优化。同时,从电路层面出发,学会如何合理配置外围器件以满足系统功能需求,包括DS1302实时时钟芯片的驱动以及LCD1602液晶显示屏的数据通信等。通过全面参与电子钟万年历系统的设计、调试与验证工作,学生的电路设计能力、程序编写技巧以及整体系统集成能力都将得到显著提升,从而更好地适应现代科技发展对嵌入式工程师的高要求。

2.1 *设计目标*

基于51单片机的电子钟万年历设计

1.电子钟设计能设定起始时间,按下复位键恢复初始化时间;

2.具有闹钟功能,可以通过按键设定闹钟闹铃时间;

3.有12 小时/24 小时两种制式可选;

4.能显示年月日星期;

5.使用DS1302计时,LCD1602液晶显示;

2.2 *系统结构图*

img

电源电路:电源电路是整个系统的能源来源,它为所有的组件提供电力。电源电路通常包括电源适配器、电源接口和电池等部分,能够将不同的电源形式转化为适合系统使用的稳定电压。

复位电路:复位电路是一种特殊的电路,它的作用是当系统出现故障或错误时,能够将系统恢复到初始状态。复位电路通常包括复位按钮和复位电路板等部分,当系统出现异常时,可以通过按下复位按钮来重新启动系统。

51单片机是一种常见的微控制器,它负责处理和执行系统的各种指令和任务。51单片机内部有一个处理器、一些内存和一系列的输入输出接口,可以控制各种外部设备并处理它们的数据。

LCD是一种常见的电子设备,可以显示数字和其他信息。LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。

3 *硬件设计*

3.1 *AT89C51最小系统*

AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器和128 bytes的随机存取数据存储器,期间采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C51单片机可灵活应用于各种控制领域。

AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

本系统中央控制器采用的单片机AT89C51,复位电路采用上电复位电路。外接的晶振为12MHz晶振。

img

3.2 *显示模块*

一、LCD1602简介

LCD1602,也称为1602液晶屏,是一种常见的字符型液晶显示模块,广泛用于各种嵌入式系统、电子设备和DIY项目中。它可以显示两行各16个字符,提供了简单而有效的文本信息显示功能。以下是关于LCD1602的一些基本说明:

\1. 显示能力: LCD1602可以同时显示两行,每行可以显示16个字符,总共可以显示32个字符。每个字符通常是由5x8个像素组成。

\2. 控制方式: LCD1602通过并行接口与外部设备进行通信。通常使用8位数据总线(D0-D7)和3位控制信号(RS、RW、EN)来传输数据和指令。

\3. 字符集: LCD1602支持标准的ASCII字符集,包括英文字母、数字、标点符号等。它还可以通过编程自定义一些自定义字符。

\4. 背光: 大多数LCD1602模块都配有背光,可以通过控制引脚来打开或关闭背光。

\5. 电源要求: LCD1602通常使用5V电源供电,但某些型号也支持3.3V电源。

\6. 接口引脚: LCD1602通常具有16个引脚,其中有8个用于数据传输(D0-D7),3个用于控制(RS、RW、EN),还有VCC、GND等引脚。

\7. 功能指令: 使用控制信号和指令,您可以控制LCD1602的各种功能,包括清屏、光标位置控制、显示开关等。

\8. 编程: 在使用LCD1602时,您需要通过微控制器(例如Arduino、STM32等)编写程序来控制它。您可以发送数据和指令以控制显示内容、光标位置和背光等。

\9. 示例应用: LCD1602广泛用于各种应用,例如温度显示、计时器、计数器、消息显示、数据监控等。它在学习嵌入式编程、电子电路和DIY项目中都非常有用。

在本设计中,LCD1602可以作为一个重要的显示和控制设备。通过与单片机的连接,我们可以实现以下应用:

1.显示数据:将时间显示在LCD1602上,方便用户查看。

2.输入数据:通过LCD1602显示和键盘接口,实现时间的调整功能。

3.人机交互界面:利用LCD1602的显示功能,构建一个简单的人机交互界面,提高用户体验。

总之,LCD1602是一种常用的液晶显示屏模块,具有低电压、微功耗的特点和多种基本操作指令集。通过与单片机的连接,我们可以实现时钟闹钟显示和调整功能。

3.3 *键盘模块*

键盘是人机交互的接口,本设计中,我们采用独立键盘。按当按键按下,与主控芯片连接的端口被降为低电平,按键松开则也升为高电平。按键采用的是Tack Switch按钮开关,它具有自动恢复的功能。当我们按下按钮时,其中的接点接通,放开按钮后,接点恢复为切断。虽然Tack Switch有4个引脚,但实际上,其内部只有一对a接点,即其中两个引脚是内部相连通的,而另外两个引脚内部也是相连通的。

本设计中4个按键实现时钟闹钟的调整,切换按键用于进入/退出设置模式。下一个按键用于切换时分,加按键控制时钟/分钟的+1,减按键控制时钟/分钟的-1。独立按键的引入使得体现了本设计的人性化,智能化,功能的强大。

img

3.4 *时钟源DS1302*

本设计中使用DS1302作为时钟的时钟源。

S1302是一款低功耗的实时时钟芯片,具有涓细电流充电能力。该芯片内含有一个具有温度补偿的晶体振荡器,一个主电源电压调节器,一个备用电源电压调节器,一个时钟/日历,以及一个可编程的31位寄存器。

DS1302采用SPI通信协议,与单片机接口简单,可以实现精确的日期和时间记录。该芯片具有掉电保护功能,即使在电源故障或关闭的情况下,也能够保持日期和时间的准确性。此外,DS1302还具有定时器中断功能,可以在特定的时间间隔内触发单片机的中断程序。

在本次单片机仿真设计报告中,我们将使用DS1302来记录日历和时间,并通过单片机控制其寄存器来实现对日期和时间的读取和设置。同时,DS1302的掉电保护功能也将有效地防止电源故障对日期和时间记录的影响。

img

3.5 *蜂鸣器模块*

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

压电式蜂鸣器是一种利用压电陶瓷作为电声转换器件的蜂鸣器。它的核心部件是压电陶瓷片,当压电陶瓷片受到压力时,会产生电荷,从而产生机械变形,进而产生机械振动和声波。

压电式蜂鸣器的特点是声音大、频率范围广、可靠性高,且可以制成各种形状,广泛应用于电子设备、汽车、玩具、报警器等领域的发声器件。同时,压电式蜂鸣器也具有低功耗、无射频噪声等优点,使其在某些特定应用中具有不可替代的地位。单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。如蜂鸣器电路下图所示,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的正极接到三极管的发射极E,三极管的基极B经过限流电阻R2后由单片机的引脚控制,当输出低电平时,三级管QS截止,没有电流流过线圈,蜂鸣器不发声;当输出高电平时,三级管导通,这样蜂鸣器的电流形成回路,发出声音。

img

4 *软件设计*

完整的控制系统由硬件系统和软件系统组成,前一章主要阐述了系统的硬件电路的设计方案,若要充分发挥系统的设计功能,则需要支持硬件平台的软件程序,即烧写到单片机内部的程序。本设计利用51单片机为控制中心,采用的的是AT89C51芯片,开发环境是Keil uVisin4 软件,这款开发环境是目前51单片机系统的主流软件,使用的非常频繁。

4.1 *编程语言选择*

由于整个程序比较复杂,且计算量较大,用到了较多的浮点数计算,所以程序的编写采用了C语言。

对于大多数单片机,使用C语言这样的高级语言与使用汇编语言相比具有如下优点:

不需要了解处理器的指令集,也不必了解存储器结构。

寄存器分配和寻址方式由编译器进行管理,编程时不需要考虑存储器的地址和数据类型等细节。

指定操作的变量选择组合提高了程序的可读性。

可使用与人的思维更相近的关键字和操作函数。

与使用汇编语言相比,程序的开发和调试时间大大缩短。

C语言的库文件提供了许多标准的例程。

通过C语言可实现模块化编程技术,从而可将已编制好的程序加到 新程序中。

C语言可移植性好且非常普及,C语言编译器几乎适用于所有的目标系统,己完成的项目可以很容易的转换到其它的处理器或环境中与汇编语言相比,C语言在功能上、结构性、可读性、可移植性、可维护性上有明显的优势,易学易用。

4.2 *单片机**程序**开发环境*

本文设计开发环境是Keil uVision4,是目前嵌入式比较流行的开发环境,Keil uVision4美国Keil Software公司开发的集成开发环境(IDE)集齐编译、连接和调试一体化软件。Keil uVision4不仅提供了完整的Windows开发环境界面,支持C/C++语言开发,而且其C语言编辑效率很高,能够使开发者非常便利地利用C语言进行研发。如图4-1 Keil uVision4开发界面图。其中Keil有以下特点:

Keil同时支持WINXP和WIN7等多种操作系统,提供了丰富的库函数和功能强大的开发工具;

Keil可以完成从编辑、编译、连接、调试和最后进行仿真的一整套研发过程;

img

4.3 *C51**软件开发流程*

C51开发首先需要建立“Project”工程,点击Keil uVision4界面中菜单中“Project”,选择“New uVision Project”,为新建的工程命名后点击保存;然后选择开发单片机芯片的型号,本工程选择AT89C51,这样就完成了“Project”的建立;当工程建立完毕后,点击“Source Group”,可以往里面添加.c文件,点击Add就可以编辑了该文件了,也可以把常用的.c文件拷贝到建立的“Project”目录下面,最后一个完成的工程软件就建立完毕了。具体工程开发如下图所示。

img

5 *程序**代码*

5.1 *函数流程框图*

Main.c完成了定时器的初始化,按键检测,主函数流程图:

img

主要代码段

首先,设置了定时器0的工作模式为方式1(16位定时/计数器),并配置了定时器初值以实现每50毫秒中断一次。开启定时器0中断允许,并打开总中断开关,以便系统能响应定时器产生的中断。初始化LCD1602液晶显示器,并向其写入预设的字符串内容。程序中通过Ds1302Init()函数对DS1302实时时钟芯片进行初始化。主循环中首先检测按键状态,如检测到“12,24切换”键,则切换时钟显示格式(12小时制或24小时制)。根据当前时钟数据与闹钟设定的时间进行比较,决定是否激活蜂鸣器报警。对按键进行处理:当按下不同功能键时,根据当前操作模式(cixu变量表示)递增或递减对应的日期/时间参数,并更新DS1302实时时钟芯片中的相应寄存器。调整年、月、日、星期、时、分、秒以及闹钟时和闹钟分等时间信息时,均确保数值在有效范围内。每次按键操作完成后,都需要重新初始化DS1302实时时钟芯片,以确保新的设置生效。

//主函数void main(){ uchar i,j,k; TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0X3C; //定时50ms TL0=0Xb0; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 init_1602();//LCD初始化 write_string(1,0,hang1); write_string(2,0,hang2);// Ds1302ReadTime();//启动DS1302 TIME[0]=0; Ds1302Init(); while(1) { if(!key5)//12,24切换 { moshi=!moshi; while(!key5); } //判断 k=0; i=(shi/10<<4)+shi%10; j=(fen/10<<4)+fen%10; if((TIME[2]==i)&&(TIME[1]==j))//闹钟 { beep=0; } else { beep=1; } //按键检测 if(!key1)//功能 { cixu=0; mode=!mode; while(!key1); } if(!key2)//next { if(cixu<8) cixu++; else cixu=0; while(!key2); } if(!key3)//加 { switch(cixu) { case 0: //年 i=(TIME[6]>>4)*10+(TIME[6]&0X0F); if(i<99) i++; TIME[6]=(i/10<<4)+i%10; Ds1302Init(); break; case 1: //月 i=(TIME[4]>>4)*10+(TIME[4]&0X0F); if(i<12) i++; TIME[4]=(i/10<<4)+i%10; Ds1302Init(); break; case 2: //日 i=(TIME[3]>>4)*10+(TIME[3]&0X0F); if(i<30) i++; TIME[3]=(i/10<<4)+i%10; Ds1302Init(); break; case 3: //星期 i=(TIME[5]>>4)*10+(TIME[5]&0X0F); if(i<7) i++; TIME[5]=(i/10<<4)+i%10; Ds1302Init(); break; case 4: //时 i=(TIME[2]>>4)*10+(TIME[2]&0X0F); if(i<23) i++; TIME[2]=(i/10<<4)+i%10; Ds1302Init(); break; case 5: //分 i=(TIME[1]>>4)*10+(TIME[1]&0X0F); if(i<59) i++; TIME[1]=(i/10<<4)+i%10; Ds1302Init(); break; case 6: //秒 i=(TIME[0]>>4)*10+(TIME[0]&0X0F); if(i<59) i++; TIME[0]=(i/10<<4)+i%10; Ds1302Init(); break; case 7: //闹钟,时 if(shi<23) shi++; break; case 8: //闹钟,分 if(fen<59) fen++; } while(!key3); } if(!key4)//减 { switch(cixu) { case 0: //年 i=(TIME[6]>>4)*10+(TIME[6]&0X0F); if(i>0) i–; TIME[6]=(i/10<<4)+i%10; Ds1302Init(); break; case 1: //月 i=(TIME[4]>>4)*10+(TIME[4]&0X0F); if(i>1) i–; TIME[4]=(i/10<<4)+i%10; Ds1302Init(); break; case 2: //日 i=(TIME[3]>>4)*10+(TIME[3]&0X0F); if(i>1) i–; TIME[3]=(i/10<<4)+i%10; Ds1302Init(); break; case 3: //星期 i=(TIME[5]>>4)*10+(TIME[5]&0X0F); if(i>1) i–; TIME[5]=(i/10<<4)+i%10; Ds1302Init(); break; case 4: //时 i=(TIME[2]>>4)*10+(TIME[2]&0X0F); if(i>0) i–; TIME[2]=(i/10<<4)+i%10; Ds1302Init(); break; case 5: //分 i=(TIME[1]>>4)*10+(TIME[1]&0X0F); if(i>0) i–; TIME[1]=(i/10<<4)+i%10; Ds1302Init(); break; case 6: //秒 i=(TIME[0]>>4)*10+(TIME[0]&0X0F); if(i>0) i–; TIME[0]=(i/10<<4)+i%10; Ds1302Init(); break; case 7: //闹钟,时 if(shi>0) shi–; break; case 8: //闹钟,分 if(fen>0) fen–; } while(!key4); } }}

5.2 *定时器中断*

定时器里完成时钟读取,LCD显示刷新。

void Timer0() interrupt 1 //定时器0中断{ if(t<10) t++; else { t=0; flag=!flag; Ds1302ReadTime();//读取时间 xian(); } TH0=0X3C; //定时50ms TL0=0Xb0;}

6 *调试*

6.1 *仿真调试*

仿真图中通过P选择需要的元器件,选取所需的元器件放到仿真原理图,方便连线的用线直接连起来,接线麻烦的使用网路符号链接。最后就需要整体观察了,主要看有没有与其它管脚相连在一起了。

6.2 *系统调试*

在搭建调试平台后,需要对软件程序进行调试,若程序调试没有问题,接下来开始验证系统功能是否满足要求,若功能有问题,需要继续调试程序,反复进行,直到所有功能都满足为止。

软件调试步骤如下:

(1)在Keil uVision4软件中先创建一个工程:单击菜单栏中的“工程”,输入新建工程名,并保存;然后单片机型号是“AT89C51”。

(2)新建用户源文件:在新建的空白文本中编写程序源代码,编码完成保存文件并文件拓展名“mian.c”,新文件创建完成。

(3)程序编译和调试:单击编译按钮,系统会对文件进行运行,在输出窗口中可看到提示信息,如果有错误信息,则须按提示找出错误并改正,直到提示没有错误且实物功能均符合要求为止(Warning不需要管)。

6.3 *仿真结果*

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。

img

显示时间的情况下,按下切换键进入设置模式,设置的变量闪烁,默认先设置年份,通过按键加和按键减调整,通过下一个按键切换设置月份,设置月份时同样通过加减键调整。如此类推设置日期,星期,时分秒。

设置好时钟后按下切换按键设置闹钟。同样通过按键加减调整闹钟时间,通过下一个按键切换设置时钟/分钟。

按下12/24小时制切换可以切换时制。上午显示AM,下午显示PM,方便区分时间。

7 *总结与展望*

在完成系统时我们遇到了很多困难,从一开始电路设计不够优化导致温度读不到,显示不正常等问题。后来查阅资料一点点丰富我们的设计。在整个设计过程中,我们充分发挥团队精神,分工合作,发挥人的主观能动性,自主学习,学到了许多没学到的知识,较好的完成了作品。相互学习、相互讨论研究,共同进步,完了最初的设想。在设计电路时虽然没什么大问题,但从中也知道了电路设计在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。反而达到事半功倍的效果。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路,反而得心应手。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一个脚印。此次课设也练就了我们的耐心,让我们认识到了学习基础知识的重要性,当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。总之,通过此次单片机课程设计我们的能力得到了全方位的提高。

参 考 文 献

[1] 张建民. 单片机原理及应用[M]. 3版. 北京: 机械工业出版社, 2016.

[2] 王静霞.单片机应用技术(C语言版)[M]. 北京:电子工业出版社, 2017.

[3] 周兴华. AT89S51/AT89C51单片机原理与实践教程[M]. 北京: 北京航空航天大学出版社, 2010.

[4] 夏继强. 单片机实验与实践教程[M]. 北京: 北京航空航天大学出版社, 2001.

时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。总之,通过此次单片机课程设计我们的能力得到了全方位的提高。

参 考 文 献

[1] 张建民. 单片机原理及应用[M]. 3版. 北京: 机械工业出版社, 2016.

[2] 王静霞.单片机应用技术(C语言版)[M]. 北京:电子工业出版社, 2017.

[3] 周兴华. AT89S51/AT89C51单片机原理与实践教程[M]. 北京: 北京航空航天大学出版社, 2010.

[4] 夏继强. 单片机实验与实践教程[M]. 北京: 北京航空航天大学出版社, 2001.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值