基于51单片机的数字钟的设计

时间:2024.4.5

 

自动化专业综合设计报告

设计题目:基于51单片机的数字钟的设计                        

所在实验室:     单片机仿真模拟实验室                                   

指导教师:              孙红霞                              

学生姓名      律迪迪             

班级     文自0921          学号    200990519114                  

撰写时间:     2013.3.2          成绩评定:              

一、设计目的

电子钟是一种用数字电路技术实现时、分、秒计时的装置,与机械时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命。电子钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大地方便。本设计主要采用AT89C2051单片机作为主控核心, LED动态扫描显示屏显示。数字钟是一种用数字电路技术实现时、分、秒计时的装置,另外应有校时功能和闹钟等附加功能。与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。

AT89C2051是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含2KB的可反复擦写的只读程序存储器(PEROM)和128B的随机数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C2051单片机在电子类产品中有广泛的应用。AT89C2051单片机电压可选用4-6V电压供电;显示器采用LED数码管来显示,数码管成本低廉,系统不但接口设计简单、便于控制,而且具有很好的人机界面,可以对当前的时间进行调整。

二、设计内容

用PROTEUS画出原理图,并完成下列任务:

⑴  用4只LED数码管输出显示时和分。

⑵  可通过按键设置闹钟功能,且停闹无须手工操作。

⑶  可通过按键设置分校时。

(4) 写出详细的设计报告。

(5)给出电路的原理图、源程序,仿真实现。

三、设计步骤

利用以AT89C2051为核心的芯片来实现多功能的数字钟。本次设计的多功能数字钟采用按钮方式对时间进行控制设置,采用七段数码管显示当前的时间,且时间以24小时的计时方式,在本次设计中,电路不仅具有显示时间,还可以实现对它们的调整。

该系统是利用单片机最小系统再加上数码管、时钟芯片等电路组成。基于单片机作为主控芯片很容易控制操作,况且输入输出能很好的扩展,以便于修改更正。

系统主要功能

    电子钟的主要功能有:整点报时;四只LED数码管显示当前时分;并且具有闹钟功能。

系统的硬件构成及功能

电脑钟的原理框图如图1所示。它由以下几个部件组成:单片机89C20##、电源、时分显示部件。

时分显示采用动态扫描,以降低对单片机端口数的要求,同时也降低系统的功耗。时分显示模块以及显示驱动都通过89C2051的I/O口控制。

电源部分:电源部分有二部分组成。一部分是由220V的市电通过变压、整流稳压来得到+5V电压,维持系统的正常工作。

2.1  AT89C2051单片机及其引脚说明

AT89C2051单片机是51系列单片机的一个成员,是8051单片机的简化版。内部自带2K字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,与Intel MCS-51系列单片机的指令和输出管脚相兼容。由于将多功能八位CPU和闪速存储器结合在单个芯片中,因此,AT89C2051构成的单片机系统是具有结构最简单、造价最低廉、效率最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,节省了成本,提高了系统的性价比。

AT89C2051是一个有20个引脚的芯片,引脚配置如图3所示。与8051相比,AT89C2051减少了两个对外端口(即P0、P2口),使它最大可能地减少了对外引脚下,因而芯片尺寸有所减小。

 

图2  AT89C2051引脚配置

AT89C2051芯片的20个引脚功能为:

VCC  电源电压。

GND  接地。

RST   复位输入。当RST变为高电平并保持2个机器周期时,所有I/O引脚复位至“1”。

XTAL1  反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2  来自反向振荡放大器的输出。

P1口  8位双向I/O口。引脚P1.2~P1.7提供内部上拉,当作为输入并被外部下拉为低电平时,它们将输出电流,这是因内部上拉的缘故。P1.0和P1.1需要外部上拉,可用作片内精确模拟比较器的正向输入(AIN0)和反向输入(AIN1),P1口输出缓冲器能接收20mA电流,并能直接驱动LED显示器;P1口引脚写入“1” 后,可用作输入。在闪速编程与编程校验期间,P1口也可接收编码数据。

P3口  引脚P3.0~P3.5与P3.7为7个带内部上拉的双向I/0引脚。P3.6在内部已与片内比较器输出相连,不能作为通用I/O引脚访问。P3口的输出缓冲器能接收20mA的灌电流; P3口写入“1”后,内部上拉,可用输入。P3口也可用作特殊功能口,其功能见表1。P3口同时也可为闪速存储器编程和编程校验接收控制信号。

2.2  时分显示部件

由于系统要显示的内容较简单,显示量不多,所以选用数码管既方便又经济。LED有共阴极和共阳极两种。如图7所示。

二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。

 

图3  LED数码管结构原理图

众所周知,LED显示数码管通常由硬件7段译码集成电路,完成从数字到显示码的译码驱动。本系统采用软件译码,以减小体积,降低成本和功耗,软件译码的另一优势还在于比硬件译码有更大的灵活性。所谓软件译码,即由单片机软件完成从数字到显示码的转换。从LED数码管结构原理可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED数码管的显示段码为1个字节。各段码位与显示段的对应关系如表1。

表1  各段码位的对应关系

需说明的是当用数据口连接LED数码管a~dp引脚时,不同的连接方法,各段码位与显示段有不同的对应关系。通常数据口的D0位与a段连接,D1位与b段连接,……D7位与dp段连接,如表1所示,表2为用于LED数码管显示的十六进制数和空白字符与P的显示段码。

注:(1)本表所列各字符的显示段码均为小数点不亮的情况。

   (2)“空白”字符即没有任何显示。

根据AT89C2051单片机灌电流能力强,拉电流能力弱的特点,我们选用共阳数码管。将AT89C2051的P1.0~P1.7分别与共阳数码管的a~g及dp相连,高电平的位对应的LED数码管的段暗,低电平的位对应的LED数码管的段亮,这样,当P0口输出不同的段码,就可以控制数码管显示不同的字符。例如:当P0口输出的段码为1100 0000,数码管显示的字符为0。

数码管显示器有二种工作方式,即静态显示方式和动态扫描显示方式。

为节省端口及降低功耗,本系统采用动态扫描显示方式。动态扫描显示方式需解决多位LED数码管的“段控”和“位控”问题,本电路的“段控”(即要显示的段码的控制)通过P1口实现;而每一位的公共端,即LED数码管的“位控”,则由P3口控制。这种连接方式由于多位字段线连在一起,因此,要想显示不同的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字段码。在这一瞬时,只有这一位在显示,其他几位则暗。在本系统中,字位线的选通与否是通过PNP三极管的导通与截止来控制,即三极管处于“开关”状态。

系统的时分显示部件由4只7段共阳LED数码管构成,前两只用于时的显示,后两只用于分的显示。值得一提的是,在设计中需要实现时与分之间的两个闪烁点,为此,将第三只LED数码管倒置摆放,这样就形成了两个很自然的闪烁点。与此同时,为了能使两点显示能够形象的表示时钟“秒”的变化,设计时,将两个点由P1.7单独控制,每隔一秒使P1.7发送一个正脉冲,从而实现了两个点的闪烁显示,闪烁周期为一秒。

系统的软件构成及功能

本系统的软件系统主要可分为主程序和定时器中断程序两大模块。在程序过程中,加入了抗干扰措施。下面对部分模块作介绍。

3.1  系统主程序设计

主程序的功能是完成系统的初始化,程序流程如图4所示。

3.2  中断程序设计

中断程序(如图5所示)完成时间计数,时间调整,误差消除等功能。中断采用AT89C2051内部T0中断实现,定时时间为125ms,当时间到达125ms×8,即1分钟时,分计数缓冲器MINBUFFER增加1,到达1小时,则时计数缓冲器HOURBUFFER增加1,并将分、时的个位、十位放入显示缓冲器。当分计数缓冲器和时计数缓冲器分别到达60min、24h时,则对它们清零,以便重新计数。在中断设计中,还通过软件实现了累计误差消除功能,使整个系统时间的精确度得到保证。

 

图4  系统主程序流程图

 

图5  定时中断程序

四、硬件图

硬件连接图以及仿真现象图

五软件程序

#define LEDS 4

#include "reg51.h"

                                   //头文件包含

                                                                                                                                           

#define uchar unsigned char                              //宏定义

#define uint  unsigned int

#define ON  1                                                //定义0为打开

#define OFF 0                                                 //定义1为关闭

#define LEDBus P1                                          //定义p1口为数码管段码口

sbit MIAO =P1^2;                                            //秒点

sbit HOU_S=P3^0;                                           //时十位位选

sbit HOU_G=P3^1;                                                 //时个位位选

sbit MIN_S=P3^2;                                           //分十位位选

sbit MIN_G=P3^3;                                           //分个位位选

sbit H_KEY=P3^5;                                          //时调整键

sbit M_KEY=P3^7;                                          //分调整键

sbit BEEP=P3^4;                 

bit  SHAN;                                                    //闪烁标志位

uchar second,minute,hour;                                 //定义秒、分、时寄存器

uchar code LEDTab[]={0x14,0xd7,0x4c,            //数码管段码表0--9

0x45,0x87,0x25,0x24,0x57,0x04,0x05};

void delay(uchar t);                                               //延时函数

void init();                                                       //初始化函数

void display();                                                 //显示函数

void min_tiao();                                               //分调整函数

void beer();

void hou_tiao();                                               //时调整函数

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

函 数 名:main

功    能:主函数

说    明:

入口参数:无

返 回 值:无

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

void main()

{

       init();                                                       //调用初始化函数

       while(1)                                                   //主程序循环

       {

              if(!H_KEY) hou_tiao();                      //如果时调整键按下(为0),调用时调整函数

              if(!M_KEY) min_tiao();                            //如果分调整键按下(为0),调用分调整函数

      if(minute==0) beer();

              display();                                           //调用显示函数

       }

}

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

函 数 名:init

功    能:初始化函数

说    明:初始化定时器及中断

入口参数:无

返 回 值:无

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

void init()

{

       TMOD=1;TH0=0X3C;TL0=0XB0;              //定时器0模式1,50毫秒

       ET0=1;TR0=1;EA=1;                                //开定时器0中断、启动定时器0、开总中断

}

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

函 数 名:display

功    能:显示函数

说    明:

入口参数:无

返 回 值:无

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

void display()

{

       LEDBus=LEDTab[minute%10];                  //分个位送数码管显示

       MIAO=SHAN;                                         //秒点闪烁

       MIN_G=ON;                                            //打开分个位位选

       delay(1);                                                  //显示1毫秒

       MIN_G=OFF;                                           //关闭分个位位选

       LEDBus=LEDTab[minute/10];                    //分十位送数码管显示

       MIAO=SHAN;                                         //秒点闪烁

       MIN_S=ON;                                             //打开分十位位选

       delay(1);                                                  //显示1毫秒

       MIN_S=OFF;                                           //关闭分十位位选

       LEDBus=LEDTab[hour%10];                     //时个位送数码管显示

       HOU_G=ON;                                           //打开时个位位选

       delay(1);                                                  //显示1毫秒

       HOU_G=OFF;                                          //关闭时个位位选

//     if(hour/10)                                               //如果时十位为0,不显示十位数字

//     {

              LEDBus=LEDTab[hour/10];                //时十位送数码管显示

              HOU_S=ON;                                     //打开时十位位选

              delay(1);                                           //显示1毫秒

              HOU_S=OFF;                                   //关闭时十位位选

//     }

}

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

函 数 名:min_tiao

功    能:分调整

说    明:

入口参数:无

返 回 值:无

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

void min_tiao()

{

       while(!M_KEY) display();                         //等待分调整键松开

       second=0;minute++;                                  //秒清零、分加1

       if(minute==60)

       minute=0;                            //如果分等于60,分变0

}

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

函 数 名:hou_tiao

功    能:时调整

说    明:

入口参数:无

返 回 值:无

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

void hou_tiao()

{

       while(!H_KEY) display();                          //等待时调整键松开

       second=0;hour++;                                     //秒清零,时加1

       if(hour==24) hour=0;                                //如果时等于24,时变0

}

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

函 数 名:delay

功    能:延时函数

说    明:

入口参数:t:延时时间长短

返 回 值:无

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

void delay(uchar t)

{

       uchar i;                                                    //定义变量

       for(;t>0;t--)                                              //如果t大于0,t减1(外层循环)

              for(i=124;i>0;i--);                              //i等于124,如果i大于0,i减1

}

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

函 数 名:timer0

功    能:定时器0中断函数

说    明:

入口参数:无

返 回 值:无

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

void timer0() interrupt 1                                          //定时器0(中断1)

{

       uchar tim1,tim2;                                       //定义临时变量

       TL0=TL0+0XB0;TH0=0X3C;                     //重装定时器初值

       tim1++;                                                    //每中断一次tim1加1

       if(tim1==10)                                            //中断10(0.5秒)

       {                                                                                                                                  

              SHAN=!SHAN;                                 //闪烁标志取反

              tim1=0;tim2++;                                 //tim1清零,tim2加1

              if(tim2==2)                                       //到了1秒

              {

                     tim2=0;second++;                       //tim2清零,秒加1

                     if(second==60)                           //如果秒到60

                     {                                                                                                                    

                            second=0;minute++;             //秒变0,分加1

                            if(minute==60)                    //如果分到60

                            {

                                   minute=0;hour++;         //分变0,时加1

                                   if(hour==24) hour=0;    //如果时到24,时变0

                            }

                     }

              }

       }

}

 

void beer()

{ if(minute==0)

   BEEP=1;

       delay(3);

       BEEP=!BEEP;

}

六仿真结果

实现了用4只LED数码管输出显示24小时制的时和分。 可通过按键设置分校时。有清零和整点报时的功能

七心得体会

这次仿真实现了电子钟设计的任务,对所学的知识进行了巩固,练习了汇编软件、仿真软件。感谢学院在我们即将踏入社会时,给我们这次理论联系实际的机会,通过这次课程设计,我们更好地将已经学过的知识进行巩固,也很感谢孙红霞老师对我的设计的不厌其烦的细心指点。

通过这段时间对专业基础理论的学习与巩固,通过查阅一些有关专业资料的学习,使自己对专业知识有了进一步的理解。虽然在此过程中感觉有点不是太顺利,但从毕业设计过程中,我的确学到了很多东西,在巩固专业知识的同时也让我学到了坚持和努力,让我受益匪浅。课程设计能提高我们的设计、掌握技术知识的能力。为我们踏上社会奠定扎实的基础。

时光如梭,大学四年即将结束。感谢母校对我大学四年来的照顾,也很感谢老师们的精心教导。在以后的日子里我还会利用现在已经学习的内容更深入地学习,也会用好现在的所学在以后的工作中发挥自己的能力,时刻铭记老师的教导,并在实践中不断提高完善自己。

八如何扩展、深入

 本次课程设计的最大遗憾在于没有实现闹钟功能。虽然硬件安装了这个部分,但是软件的软肋造成了本次实验的缺陷。其实电子种的显示时间和调时仅仅是最基本的,电子钟还可以加入掉电保护和显示日期的功能,让数字电子时钟更加完善。即使这样,本次实验也是让我受益匪浅,为后续的课程设计墓定了良好的基础。

更多相关推荐:
基于单片机数字温度计开题报告

云南大学旅游文化学院毕业设计论文开题报告课题名称基于单片机数字温度计设计院系云南大学旅游文化学院信科系专业电子信息工程学号学生姓名指导教师职称助教题目类型应用研究20xx年12月6日一选题依据二研究设计实施方案...

基于单片机的数字温度计设计开题报告

大学综合性设计实验开题报告学生专业同组人指导老师20xx年4月1国内外现状及研究意义随着科技的不断发展现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长而如何准确而又迅速的获得这些参数就需要受制于现...

开题报告基于单片机的电子体温计的设计

本科毕业设计论文开题报告题目基于单片机的电子温度计的设计课题类型设计实验研究论文学生姓名学号专业班级学院电气工程学院指导教师薛树功开题时间20xx年3月日20xx年3月12日一毕业设计论文内容及研究意义价值设计...

开题报告基于DS18B20数字温度计的设计--

XXXX大学综合电子课程设计开题报告设计项目基于DS18B20的数字温度计的设计指导教师XX专业班级XX级电子信息工程项目负责人XXX项目组成员XXX制表信息与计算机工程学院电子信息系20xx年6月23日一立论...

基于单片机的数字温度计设计

攀枝花学院专业基础综合实验报告基于单片机的数字温度计设计摘要在日常生活及工农业生产中经常要检测温度传统的方式是采用热电偶或热电阻其硬件电路和软件调试比较复杂制作成本较高近年来随着科技的飞速发展单片机的应用正不断...

基于单片机的数字温度计设计开题报告(封杰)

苏州市职业大学毕业设计开题报告

基于单片机数字温度计开题报告

毕业设计论文开题报告课题名称院系专业学号学生姓名指导教师职称基于单片机数字温度计设计20xx年9月6日一选题依据二研究设计实施方案三前期工作四研究基础条件五指导教师意见六开题小组意见七系意见

基于at89c52单片机的数字电压表设计开题报告

岭南师范学院本科生毕业设计论文开题报告1指导教师审阅并接受二级学院和学校检查2

基于单片机的温度传感器设计 开题报告

天津理工大学本科毕业设计开题报告

开题报告---数字温度计的设计

毕业设计论文开题报告学生姓名史玉柱学号20xx4460系部理工系专业年级20xx级电子信息工程设计论文题目数字温度计的设计指导教师覃业梅20xx年11月28日开题报告填写要求1开题报告含文献综述作为毕业设计论文...

基于51单片机数字电子称设计开题报告

贵阳学院毕业设计论文开题报告表1234

基于单片机的数字电压表开题报告

重庆邮电大学移通学院毕业设计论文开题报告设计论文题目数字式电压表的设计学生姓名系别自动化系专业电气工程与自动化班级独立撰写并于毕业设计论文开始后一周内完成

基于单片机的数字温度计设计开题报告(21篇)