找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4246|回复: 1
收起左侧

单片机可调式电子钟程序+Proteus仿真与调试+设计文档分享

[复制链接]
ID:343749 发表于 2019-4-15 13:57 | 显示全部楼层 |阅读模式
电子时钟是一种具有实际应用价值的电子设备,在日常生活中应用广泛。基于单片机的电子钟有按键电路、显示电路和单片机基本电路组成。本文应用常用的51内核单片机设计了间可调、带声光报时、运行简单的电子时钟,并充分应用 Proteus 仿真软件对其进行了仿真,验证了本设计的可行性。

1 概述
1.1引言
1.2设计原理
1.3整体设计
1.4开发与运行环境
2 主要器件的选型3
3最小系统电路设计
3.1单片机最小系统
3.2按键部分电路
3.3闹钟电路
3.4数码管及其译码部分电路
4 系统软件设计
    4.1主程序流程设计
    4.2主程序及定义变量并初始化
    4.3计算月份天数程序
    4.4数码管输出显示程序
5系统仿真与调试
5.1调试步骤
5.2仿真图如图所示
6设计经验总结
参考文献
附    录
附录A:源程序
附录B:系统设计原理图
附录C:元器件列表

随着生活压力的增大,我们经济的飞速发展,快生活已经悄悄地侵入了我们的世界,同时,已经成为我们人际交往等生活中必要地素质体现,从而对时间的要求提高了,同时显示的视觉感美感也进一步提高了,要求显示的更加直观了更加精确了,同时也需要准时提醒的功能了。

电子钟是当前市面上十分普及的计时装置,它成本低廉,计时准确,而且由于其显示装置可以发光,因此夜间也清晰可见,它的性价比是比较高的,现在人们尤其是在青年人群中,使用电子计时装置的人数已经大大超过了传统的上弦表。本设计采用的是目前市面上比较普遍的 STC89C52 单片机,它是一款 8 位的处理器,即数据是以 8 位来运算和处理的。虽然现在有很多单片机比 51 单片机    性能好,但是价格却很昂贵,这显然不符合我们制作电子时钟追求高性价比的初衷,而且选用的这款 STC89C52 单片机的抗干扰能力强,体积小,对于电子设计初学者来说也是比较容易的。这款单片机结合数码管、独立按键、11.0592MHz 晶振、74HC573 锁存器、数码管等器件,通过在万用板上的焊接,或者将元件焊在事先设计制作好的 PCB 板上,就完成了一个电子钟的制作。该设计能准确显示年、月、日、时、分、秒,具有闹钟响铃的功能,设计的产品寿命长,误差低的特点。

1.2设计原理

单片机、晶振电路、复位电路构成了单片机最小系统,通过串行通信接口与PC机相连,将时钟数值送往LED数码管显示。定时/计数器、数据存储器是单片机内部的两大部件,其中定时/计数器用来产生时钟的最小时间单位———               秒,数据存储器中3个单元用来存储时、分、秒的数值。

时间先从秒单元累加,当60秒到来向分单元进1,且秒单元清0 ;当60分到来向时单元进1 ,且分单元清0 ;当24时到来,时单元清0。数据存储器三个单元的数值将会送到 LED数码管实时显示。

1.3整体设计

该设计要实现的主要功能如下:

打开电源后默认显示如下:

时间显示:00:00:00

闹钟显示:00:01:01

日历显示:2018 年 6 月 8日

星期显示:星期 5

其中时间、星期、日历、都是可以通过按键可以调控的,闹钟也是可以通过按键进行定时的,定的时间到了通过蜂鸣器进行报警。按照整体的设计要求,使用五大模块相结合的设计构造,有液晶 LED展示数字,按键手动调整控制模块、闹钟与蜂鸣、声音报警模块。具体的思路框图如图 1 所示。



  1.4开发与运行环境

本设计以C语言为开发语言,在Keil uVISION4软件平台上进行C程序的编辑,连接和调试,最终与Proteus仿真软件相结合,进行相关的电路仿真及修改。 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

2 主要器件的选型

STC89C52单片机:本设计中采用型号为STC89C52的单片机,STC89C52是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含6个中断源,3个16位可编程定时计数器,2个全双工串行通信口,片内含8KB的可反复擦写的Flash只读程序存储器(ROM)和256B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-52指令系统。STC89C52兼容MCS51指令系统,提供以下标准功能8K字节Flash闪速存储器,256字节内部RAM,32个I|O口线,3个16位定时器计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时STC89C52可以降至0HZ的静态逻辑系操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时器计数器,串行通信接口,以及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件工作,直到下一个硬件复位。

数码管:分段式显示器(LED数码管)由7条线段围成8字型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。LED数码管有共阳、共阴之分。

RESPACK-8排阻:即8个阻值为10K的电阻

电解电容CAP-ELEC:电解电容是一种按结构、制作工艺划分的电容种类。通常,电解电容是一种有极性的电容。电解电容的阳极采用可钝化的金属材料,比如铝、钽、铌、钛等;介电材料为阳极金属材料表面生成的致密氧化物薄膜;电解电容的阴极材料为电解质。电解电容的主要特点是,在相同的体积下,可以得到比普通电容大得多的电容量(假设耐压相等)。

晶振CRYSTAL:石英晶体谐振器(英文:quartz crystal unit或quartz crystal resonator,常简写成Xtal),简称石英晶体或晶振,是利用石英晶体(又称水晶)的压电效应,用来产生高精度振荡频率的一种电子元件,属于被动元件。该元件主要由石英晶片、基座、外壳、银胶、银等成分组成。根据引线状况可分为直插(有引线)与表面贴装(无引线)两种类型。现在常见的主要封装型号有HC-49U、HC-49/S、GLASS、UM-1、UM-4、UM-5与SMD。

与开关BUTTON、22pf的电容CAP等

3 最小系统电路设计

3.1单片机最小系统

本设计采用 AT89C52 为核心控制器件。单片机想要工作,需要有时钟电路、供电电路及复位电路配合。AT89C52 为常用的时钟电路采用内部时钟电路,配 合 外 部 12M 晶 振 和 电 容 与 XTAL1 和XTAL2 连接组成,为单片机提供基本的机器周期脉冲。单片机复位电路为手动复位电路,当单片机发生异常工作时可通过复位按钮让单片机复位。AT89C52 是一个低电压,高性能 CMOSX8 位单片机,兼容标准 MCS -51 指令系统,所以编程简单。AT89C52 单片机由于其控制结构简单,标准编程,价格低廉在电子行业中有着广泛的应用。AT89C52有 40 个引脚,32 个外部双向输入/输出(I/O)端口, AT89C52 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。单片机最小系统如图 2 所示。

3.2按键部分电路

开关采用一种常开型按键开关,在常态时开关触点处于断开状态,只有按下按键时点闭合短路,所以可以用万用表检测开关的管脚排列、好坏和质量。

按键是利用机械触点的合、断来实现键的闭合与释放,由于弹性作用,机械触点在闭合及断开瞬间会有抖动的过程,从而使键输入电压的信号也存在抖动现象。

抖动时间的长短与开关的机械特性有关,一般为5~10ms,稳定闭合期时间的长短由按键的动作决定,一般为几百毫秒到几秒。为了保证按键按动一次,CPU对键闭合仅作一次按键处理,必须去除抖动的影响。

去除抖动的方法一般有硬件和软件两种:

硬件方法就是在按键输出通道上添加去抖动电路,从根本上避免电压抖动的产生,去抖动电路可以是双稳态电路或者滤波电路。

软件方法通常是在检测到有键按下时延迟10~20ms的时间,待抖动期过去后,再次检测按键的状态,如果仍然为闭合状态,才认为是有键按下,否则认为是一个扰动信号。按键释放的过程与此相同,都要利用延时进行消抖处理。由于人的按键速度与单片机的运行速度相比要慢很多,所以,软件延时的方法简单可行,而且不需要增加硬件电路,成本低,因而被广泛采用。

其中第一个按键控制选择需要的钟位,第二个按键控制加一调节,第三个按键控制减一调节。

3.3闹钟电路

该设计的默认闹钟电路当00:01:01时,蜂鸣器发出 500 Hz 的声音,该声音为一首《祝你平安》,由于是由方波输出,故音质较差。时钟的初始值为00:00:00,为了在尽快时间看到效果,故将本次设计将闹钟的默认时间定为00:01:00。

3.4数码管及其译码部分电路

数码管是四位共阳极数码管,即每位数码管上的 8 个 8 个发光二极管以共阳极方式连接,那么数码管的 8 位段选码只要在相应位置低电平即可使某一二极管亮,若要显示“8.”那么段选码应为“0x00”,这样才能使每位数码管上的 8 个发光二极管都被点亮,数码管的 8 个段选引脚是分别接到 P0.0 到 P0.7 引脚的,因此控制 P0 口的输出信号来控制数码管的段选。由于 6 位数码管的每位的 8 个段选都是连在一起的,因此在段选引脚上输入的信号会被同时送到 6 个数码管上去。所以为了实现四位数码管可以显示不同的数字,则必须要用扫描的方式使各位数码管轮流显示。6 位数码管有 6 个位选引脚,将它们分别接到单片机的 P2.0到 P2.5 引脚上去。这样通过控制 P2 口低四位的输出电平的高低即可控制哪一位数码管点亮。比如将 P2.0 引脚置为低电平,则显示“分钟的十位”的数码管允许通入段选信号,将 P2.3 引脚置为低电平,则显示“秒的个位”的数码管允许通入段选信号。这样通过比较快速的扫描,即可实现 6 位数码管轮流被位选导通。由于人眼的视觉暂留效应,因此以很快的速度扫描的话,人眼会认为是四个数码管一起在亮。利用这个原理,我在程序中设定大约是每 10us 就换一个位显示,保证人眼看到是一起亮的。

4 系统软件设计

4.1主程序流程设计

4.2主程序及定义变量并初始化
#include <absacc.h> //包含头文件
#include <reg52.h> //包含头文件
#define uchar unsigned char //数据类型定义
定义变量并初始化
uchar n=31; //定义月份天数变量并初始化
uchar ms=0; //定义毫秒变量并初始化
uchar h1=0,m1=0,s1=0; //定义计时时、分、秒变量并初始化
uchar h2=0,m2=1,s2=1; //定义定时时、分、秒变量并初始化
uchar year=18,month=6,day=8; //定义年、月、日变量并初始化
uchar wday=5; //定义星期变量并初始化
uchar *h=&h1,*m=&m1,*s=&s1; //定义显视位变量并初始化
uchar *p; //定义调节指针
uchar k1=0,k2=0,k3=0,k4=0,k5=0; //定义控制变量并初始化
uchar counter=0; //定义铃声节拍变量并初始化
uchar count=0; //定义铃声音符变量并初始化
sbit sound=P1^0; //定义铃声输出位
uchar a[8]={1,2,3,4,5,6,7}; //定义显视输出位数组并初始化
4.3计算月份天数程序
电子钟上电后从 00:00:00 开始计时。同时日历星期也同时开始计时,每满24小时日历与星期就同时加一,该电路只设计两个按钮,简单方便,功能齐全。
* 函数名称:mon()
* 功 能:计算并返回每个月的天数
* 入口参数:month
* 出口参数:无
uchar mon(uchar month) //计算并返回每个月的天数
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:return 31;break; //1,3,5,7,8,10,12月每月31天
case 4:
case 6:
case 9:
case 11:return 30;break; //4,6,9,11月每月30天
case 2: return leap(year);break;//返回二月份的天数
default:break;
由于又平年瑞年之分,所以二月份天数较为特别,单独给二月份编的程序如下:
* 函数名称:leap()
* 功 能:计算二月份天数
* 入口参数:year
* 出口参数:无
uchar leap(uchar year) //判断是否闰年并返回二月份的天数
{ //闰年返回29,平年返回28
year+=2000;
if(year%4==0)
{if(year%100==0)
{if(year%400==0)
return 29;
else return 28;
}
else return 29;
}
else return 28;
}
这样就使得月份的功能更为精准,市场上很多的电子钟往往忽视了这个细节,虽然每四年才会出错,但也会应使用,这里本着精益求精的原则,实现一款能区分平年瑞年的电子钟。
4.4数码管输出显示程序
* 函数名称:d3()
* 功 能:数码管输出显示
* 入口参数:无
* 出口参数:无
  1. void d3(void) //显示输出
  2. {
  3. uchar sel=0x80,i ; //定义sel为位选通变量并初使化
  4. if(k2) //判断是否处于调时状态
  5. {
  6. if(k2==4)a[0]=a[1]=a[4]=a[6]=a[7]=10; //星期显示设置
  7. if(k1&&(k3--==0)) k3=255; //设置位调节闪烁初值
  8. }
  9. for(i=0;i<=8;i++) //循环显示八个数码管
  10. {
  11. P2=0xff; //清屏
  12. P0=tt[a[i]]; //输出显示数值
  13. if(k1&&(k3>200)) //判断是否闪烁
  14. if (k1==1&&(i==6||i==7))P2=0xff; //时位闪烁
  15. else if(k1==2&&(i==3||i==4))P2=0xff; //分位闪烁
  16. else if(k1==3&&(i==0||i==1))P2=0xff; //秒位闪烁
  17. else P2=~sel; //非闪烁状态
  18. else P2=~sel; //非闪烁状态
  19. sel=sel>>1; //显示位移位
复制代码

5 系统仿真与调试

Proteus 软件是一种混合电路仿真软件,Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

5.1调试步骤

1)在KEIL软件中编写程序,完成后,单击“项目”下的“编译”,产生“.hex”文件。

(2)打开pro t e us软件,画上硬件电路图,保存。

(3)双击AT89C52芯片,在program file中加入“.hex”文件,按确定。

(4)调试运行。

5.2仿真图如图所示

显示时间为凌晨16分

显示闹钟为在凌晨1分1秒时响

显示日历为18年6月8日

显示星期为星期5

6、设计经验总结

此设计使用数字进行清晰的显示,将所需要的信息如时间、年份、月份和当时的温度与湿度等得到的信息在液晶显示屏上展示出来,同时还可以手动对时间以及闹钟进行设定。此设计使用 5V 的电压作为电源来供电,利用的是以 STC89C52 单片机为主要控制系统,耗能低。设计的多功能智能电子钟易于阅读,液晶显示清晰,设计电路所用元器件少且简单,成本低,同时展示的功能比较齐全,优点多,根据现在科学技术和电子测量仪器的不断完善,其市场需求是非常乐观的。

简易电子钟是基于 STC89C51 单片机的一个最小系统设计,在完成原理电路图的设计之后,要进行的是焊接工作。要准备焊锡在万用板上焊接,焊接过程中要注意防止出现虚焊、漏焊、错焊等问题。在焊接好后,不要忙于通电,首先要检测有没有短路,万一有短路就通电,将会很麻烦,容易烧毁电路板或元器件,更容易引发安全隐患,应确保无短路再通电。本电子钟所需的元器件购买的成本价很低,并且在制作过程中有助于理解 51 单片机的性能及应用方法,同时用 Keil C51 软件编写程序有助于锻炼程序编写能力。同时设计这个简易电子时钟使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练,培养了我运用所学知识解决实际问题的能力。



附录B:系统设计原理图

0.png


全部资料51hei下载地址:

电子钟程序及仿真.zip (87.17 KB, 下载次数: 63)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2019-4-17 03:41 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表