单片机电子钟设计报告

目录

单片机的个性化电子钟设计报告

作者:黄淀钧    吴耿彬    09电信3班

一、设计背景----------------------------------------------2

二、作品简介----------------------------------------------2

三、设计目的与意义----------------------------------------3

四、设计要求----------------------------------------------3

五、总体方案设计------------------------------------------3

5.1 硬件设计------------------------------------------3

5.1.1 总原理图----------------------------------------3

5.1.2 各模块设计--------------------------------------4

5.1.3 器件清单----------------------------------------7

5.2   软件设计----------------------------------------7

5.2.1 硬件框图----------------------------------------8

5.2.2 程序流程图--------------------------------------9

5.2.3 源程序代码--------------------------------------10

六、遇到的困难和解决办法----------------------------------18

七、参考文献----------------------------------------------18

八、附录--------------------------------------------------18

一、设计背景

电子钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。

单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。

二、作品介绍

    该作品是个性化电子钟设计,技术上主要用单片机(AT89c52)主控,8位LED数码显示,分别显示“小时-分钟-秒”。该作品主要用于24小时计时显示,能调整显示时间,能调整闹钟时间,能做秒表使用,能定时闹铃1分钟,闹钟响的时候可以手动按停。

使用方法:开机后时钟在00:00:00起开始计时。

按K1进入调时状态:按K2加1,按K3减1.再按K1进入分调整状态,加减调整同调时一样.再按K1进入秒调整状态。之后再按K1分别进入闹钟的时分秒调整状态。最后一次按K1,则返回显示状态。

三、设计目的及意义

(1)熟悉protues、keil-c软件的应用。

(2)巩固、加深和扩大51系列单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;

(3)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;

(4)对课题设计方案的分析、选择、比较、熟悉用51单片机做系统开发、研制的过程,软硬件设计的方法、内容及步骤。

四、设计要求

(1)上电以后自动进入计时状态,起始于00:00:00。

(2)设计键盘调整时间,完成时间设计,并设置闹钟。

(3)定时时间为1/100秒,采用定时器实现。

(4)采用LED数码管显示,时、分,秒采用数字显示。

(5)采用24小时制,具有方便的时间调校功能。

五、总体方案设计

5.1硬件设计

5.1.1总原理图

     如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示模块、电源模块、晶振模块、按键模块等组成

电子钟原理图

5.1.2各个模块设计

1.单片机最小系统                          AT89S52         AT89c52概述:是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051,8031的指令系统,他的运行速度要比8051快最高支持达33MHz的晶体震荡器,在此系统中使用12MHz的晶振。

AT89c52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止……

详述:AT89c52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器。一个6向量2级中断结构,全双工串行口及时钟电路。另外,AT89c52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.

2、显示模块 

LED数码管是由发光二极管构成的,亦称半导体数码管。将条状发光二极管按照共阴极(负极)或共阳极(正极)的方法连接,组成“8”字,再把发光二极管另一电极作笔段电极,就构成了LED数码管。若按规定使某些笔段上的发光二极管发光,就能显示从0~9的…系列数字。同荧光数码管(VFD)、辉光数码管(NRT)相比,它具有:体积小、功耗低、耐震动、寿命长、亮度高、单色性好、发光响应的时间短,能与TTL、CMOS电路兼容等的数显器件。+、-分别表示公共阳极和公共阴极。a~g是7个笔段电极,DP为小数点。另有一种字高为7.6mm的超小型LED数码管,管脚从左右两排引出,小数点则是独立的。                              

本系统利用6位LED数码管显示时间,共阴极结构。LED数码管由7段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。

表一 LED数码管真值表http://www.wenqi89s51.com/leddon3.gif         

3.按键模块

     本设计中主要有三个控制按键,按键功能为:

(1)P0.0为调时间模式,按P0.0进入调分状态:按P0.1加1,按P0.2减

1.再按P0.0进入分调整状态,,加减调整同调时.按P0.0进入秒调整状态。

(2)再按P0.0进入设定闹时状态 ,可进行时设定,按P0.1时加1,按P0.2时减1,再按P0.0为分调整,按P0.1分加1,按P0.0进入秒调整,再按P0.0调闹钟结束.在闹铃时可按P0.1或P0.2停闹,不按闹铃1分钟。

4.晶振模块

下图所示为时钟电路原理图,在AT89c51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。

晶振电路             

5.1.3 器件清单             表二 元件清单与封装

5.2 软件设计 

5.2.1 硬件框图

根据以上的电子钟的设计要求可以分为以下的几个硬件电路模块:单片机模块、数码显示模块、晶振模块、电源模块与按键模块等,模块之间的关系图如下面得方框电路图所示。

5.2.2 程序流程图

(1)总体流程图

(2)时钟调整模式

 

                                             否

 

                                 是

 

(3)闹钟模式

5.2.3 源程序代码

#include<reg51.h>

#define uchar unsigned char

uchar time,hour,min,sec;

uchar hhs,mms,sss;

uchar hhg,mmg,ssg;

uchar key1num;

uchar naomiao,naofen,naoshi;

uchar naomiaog,naomiaos,naofeng,naofens,naoshig,naoshis;

uchar led[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};

uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

sbit key1=P0^0;

sbit key2=P0^1;

sbit key3=P0^2;

sbit keynaozhong=P2^0;

void delay(int z)

{

int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void display0(uchar hhs,uchar mms,uchar sss,uchar hhg,uchar mmg,uchar ssg)

{   ssg=sec%10;

    sss=sec/10;

    mmg=min%10;

    mms=min/10;

    hhg=hour%10;

    hhs=hour/10;

    P1=led[ssg];

    P3=table[7];

    delay(1);

    P1=0x00;

    P1=led[sss];

    P3=table[6];

    delay(1);

    P1=0x00;

    P1=0x02;

    P3=table[5];

    delay(1);

    P1=0x00;

    P1=led[mmg];

    P3=table[4];

    delay(1);

    P1=0x00;

    P1=led[mms];

    P3=table[3];

    delay(1);

    P1=0x00;

    P1=0x02;

    P3=table[2];

    delay(1);

    P1=0x00;

   

    P1=led[hhg];

    P3=table[1];

    delay(1);

    P1=0x00;

    P1=led[hhs];

    P3=table[0];

    delay(1);

    P1=0x00;

   

}

void display1(uchar naoshis,uchar naoshig,uchar naofens,uchar naofeng,uchar naomiaos,uchar naomiaog)

{   naomiaos=naomiao/10;

    naomiaog=naomiao%10;           

    naofens=naofen/10;

    naofeng=naofen%10;         

    naoshis=naoshi/10;

    naoshig=naoshi%10;

    P1=led[naoshis];

    P3=table[0];

    delay(1);

    P1=0x00;           

    P1=led[naoshig];

    P3=table[1];

    delay(1);

    P1=0x00;       

    P1=0x02;

    P3=table[2];

    delay(1);

    P1=0x00;           

    P1=led[naofens];

    P3=table[3];

    delay(1);

    P1=0x00;           

    P1=led[naofeng];

    P3=table[4];

    delay(1);

    P1=0x00;           

    P1=0x02;

    P3=table[5];

    delay(1);

    P1=0x00;           

    P1=led[naomiaos];

    P3=table[6];

    delay(1);

    P1=0x00;           

    P1=led[naomiaog];

    P3=table[7];

    delay(1);

    P1=0x00;

}

void keyscan()

{

    if(key1==0)

    {

      delay(5);

      if(key1==0)

      {

        key1num++;

        while(!key1)

        if(key1num<=3)

        {display0(hhs,mms,sss,hhg,mmg,ssg);}

        else        {display1(naomiaog,naomiaos,naofeng,naofens,naoshig,naoshis);};

        if(key1num==1){TR0=0;}

        if(key1num==2){TR0=0;}

        if(key1num==3){TR0=0;}

if(key1num==4){TR0=0;}

        if(key1num==4){TR0=0;}

        if(key1num==6){TR0=0;}

        if(key1num==7){key1num=0;TR0=1;}}}

    if(key1num!=0)

    {

    if(key2==0)

    {

      delay(5);

      if(key2==0)

      {

        while(!key2)

        if(key1num<=3)

        {display0(hhs,mms,sss,hhg,mmg,ssg);}

        else

        {display1(naomiaog,naomiaos,naofeng,naofens,naoshig,naoshis);};

        if(key1num==1)

        {

          hour++;

          if(hour==24)

          hour=0;

          display0(hhs,mms,sss,hhg,mmg,ssg);

        }

        if(key1num==2)

        {

          min++;

          if(min==60)

          min=0;

          display0(hhs,mms,sss,hhg,mmg,ssg);

        }

        if(key1num==3)

        {

          sec++;

          if(sec==60)

          sec=0;

          display0(hhs,mms,sss,hhg,mmg,ssg);

        }

        if(key1num==4)

        {

          naoshi++;

        if(naoshi==24)

          naoshi=0;

          display1(naoshis,naoshig,naofens,naofeng,naomiaos,naomiaog);

        }

        if(key1num==5)

        {

          naofen++;

        if(naofen==60)

          naofen=0;

          display1(naoshis,naoshig,naofens,naofeng,naomiaos,naomiaog);

        }

        if(key1num==6)

        {

          naomiao++;

        if(naomiao==60)

          naomiao=0;

          display1(naoshis,naoshig,naofens,naofeng,naomiaos,naomiaog);}}}

       if(key3==0)

       {

         delay(5);

         if(key3==0)

         {

           while(!key3)

           if(key1num<=3)

           {display0(hhs,mms,sss,hhg,mmg,ssg);}

           else

           {display1(naomiaog,naomiaos,naofeng,naofens,naoshig,naoshis);};

           if(key1num==1)

           {

             hour--;

             if(hour==-1)

             hour=23;

             display0(hhs,mms,sss,hhg,mmg,ssg);

           }

           if(key1num==2)

           {

             min--;

             if(min==-1)

             min=59;

             display0(hhs,mms,sss,hhg,mmg,ssg);

           }

           if(key1num==3)

           {

             sec--;

             if(sec==-1)

             sec=59;

             display0(hhs,mms,sss,hhg,mmg,ssg);

           }

        if(key1num==4)

        {

          naoshi--;

        if(naoshi==-1)

          naoshi=23;

          display1(naoshis,naoshig,naofens,naofeng,naomiaos,naomiaog);

        }

        if(key1num==5)

        {

          naofen--;

        if(naofen==-1)

          naofen=59;

          display1(naoshis,naoshig,naofens,naofeng,naomiaos,naomiaog);

        }

        if(key1num==6)

        {

          naomiao--;

        if(naomiao==-1)

          naomiao=59;

          display1(naoshis,naoshig,naofens,naofeng,naomiaos,naomiaog);}}}}}

void TIMER0 (void) interrupt 1

{

 {

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    time++;

    if(time>=20)

    {

    time=0;

    sec++;

        if(sec==60)

        {

            sec=0;

            min++;

       

        if(min==60)

        {

            min=0;

            hour++;

       

        if(hour==24)

        {

            hour=0;}}}}}

         {if((sec==naomiao)&&(min==naofen)&&(hour==naoshi))

        {

            keynaozhong=1;

           

        }

        if(key2==0||key3==0)

        {keynaozhong=0;}

        if((hour==naoshi)&&(sec==naomiao)&&(min-naofen>=1))

        {keynaozhong=0;}}}

void init()

{

    TMOD=0x01;

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    EA=1;

    ET0=1;

    TR0=1;

    hour=00;

    min=00;

    sec=00;

    naoshi=00;

    naofen=00;

    naomiao=06;

    keynaozhong=0;

}

void main()

{

    init();

   while(1)

    {

      keyscan();

      if(key1num<4)  

      {display0(hhs,mms,sss,hhg,mmg,ssg);}

      else

      {display1(naoshis,naoshig,naofens,naofeng,naomiaos,naomiaog);}

    }  

       

}

六、遇到的困难和解决的办法

由于用到了单片机的P0口,仿真的时候没有加上上拉电阻,所以导致有些用到P0口的按键没有作用。后来检测程序发现没问题后就检测仿真图,尝试接了三个上拉电阻之后就可以实现之前的功能了。

七、参考文献

1.   李建忠编著 《单片机原理及应用》 西安电子科技大学出版社 20##年

八、附录

     

相关推荐