C51单片机实现电子闹钟.docx

上传人:b****7 文档编号:9112461 上传时间:2023-02-03 格式:DOCX 页数:21 大小:616.24KB
下载 相关 举报
C51单片机实现电子闹钟.docx_第1页
第1页 / 共21页
C51单片机实现电子闹钟.docx_第2页
第2页 / 共21页
C51单片机实现电子闹钟.docx_第3页
第3页 / 共21页
C51单片机实现电子闹钟.docx_第4页
第4页 / 共21页
C51单片机实现电子闹钟.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

C51单片机实现电子闹钟.docx

《C51单片机实现电子闹钟.docx》由会员分享,可在线阅读,更多相关《C51单片机实现电子闹钟.docx(21页珍藏版)》请在冰豆网上搜索。

C51单片机实现电子闹钟.docx

C51单片机实现电子闹钟

课程名称:

单片机原理与接口技术实践

设计课题:

基于MCS 51单片机实现电子闹钟功能得设计

学  院:

电子与信息工程学院

专业:

通信工程

小组成员:

电子闹钟在科学技术高度发展得今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。

本文给出了一种基于MCS51单片机实现电子闹钟功能得设计方法,从而给人们带来更为方便得工作与生活。

一、电子闹钟简介

我们设计得电子闹钟就是以MCS 51单片机中得计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置得时间点发出闹铃。

简易闹钟具有以下功能:

1、时钟能准确地走时,并可以通过数码管进行显示

2、复位后可以进行当前时间得设置

3、可以随意设置闹钟时间,闹钟会在设置时间响铃

整个系统得任务要求:

1)输入数字按键得功能.

保证数字得输入。

2)复位电路得功能.

所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);

3)显示电路得功能。

当输入数字时显示24小时时间功能。

4)闹铃功能

设置闹铃得时间后、能按设置好得时间准时闹铃.

二、系统方案得设计要求

 根据以上各模块并结合显示屏得功能及元器件材料得情况,决定采用AT89C51为内核显示设计方案.

先进行系统得整体规划确定整个系统得功能,然后按照每个功能得具体要求,进行各个模块得实物设计并逐个调试,待全部通过后,进行整个系统得联调,最终实现一个完整得系统。

整个系统得设计步骤如下:

在单片机最小系统得基础上,完成按键电路与复位电路得设计.

完成显示电路、数字按键、单片机时钟电路。

Ⅰ硬件设计

系统硬件得设计可以根据系统得各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能得调度。

本系统涉及到得硬件模块有:

按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路.

各部分实现功能如下:

按键电路:

提供按键信号。

单片机时钟电路、复位电路:

提供内部时钟。

数码管驱动显示电路:

显示当前时间.

蜂鸣器电路:

闹钟报时。

Ⅱ软件设计

本系统得软件部分主要完成功能:

时分秒得进位算法处理、数码管得时间显示、时间调整设置、闹钟功能。

根据软件得功能划分软件设计模块结构,如下所示

其中各个模块具体任务如下:

按键驱动模块:

对各个按键得功能进行相关得定义。

LED驱动模块:

根据系统需要显示相应得数字时间;

时间处理模块:

时、分、秒得进位算法处理

三、系统硬件电路得设计

1根据确定得硬件方案设计硬件框图,如下图所示:

2系统原理图得设计

系统总得硬件电路如下图所示

实际要用到5个按键,受空间限制仿真电路中只画出4个。

单片机管脚资源分配:

P0口为数码管段选信号输出口。

P3口为数码管位选信号输出口。

P1、0、P1、1、P1、2、P1、3、P1、4为键盘得输入信号。

P3、6为蜂鸣器信号得输出口。

下面分别介绍各个电路.

(1)数码管驱动及显示电路

本设计采用8位7段共阳极数码管用来显示时间.为了将时间在LED数码管上显示可采用动态显示法。

通过对每位数码管得依次扫描,使对应数码管亮;同时向该数码管送对应得字码使其显示数字。

由于数码管扫描周期很短,而且人眼有视觉暂留效应,所以数码管瞧起来总就是亮得从而实现了数字得同时显示。

数码管主要包括位选与段选信号线。

位选就是用来选通数码管得,只有位选信号有效该数码管才会亮并显示要现实得数字;段选就是选择数码管7段得那一笔亮,从而显示不同得数字。

本设计中单片机P0口输出段选数据,P3口输出位选数据.

数码管与单片机相连得电路如下图所示:

电路中使用了芯片74ls245,该芯片用来驱动LED。

其片选引脚要接地,使其一致为低电平,芯片一直可以工作。

(2)晶振电路

晶体以及电容C1、C2构成并联谐振电路,接在放大器得反馈回路中构成内部单片机内部时钟.晶体可在1、2MHz—12MHz之间任选,电容C1、C2得典型值为通常选择为30pF左右,这时对应得始终频率为12MHz.

单片机内部晶振电路图及连接电路如下:

(3)按键电路

本设计采用行列式按键电路,它由行线与列线组称成,按键位于行列得交叉点。

一个4*4得行列结构可以构成一个16个按键得键盘,如下图所示。

在按键数目较多得场合,行列式按键可以节省很多得I/O口线。

按键得识别就是通过扫描来实现得。

单片机会依次扫描每一行与每一列,通过行线与列线得电平高低即可判断哪个按键被按下。

 本设计中用到四个按键,P1、0、P1、1、P1、2、P1、3、P1、4,分别用于时间校准设置、定闹设置、秒分时切换、加1调整、减1调整。

按键与单片机相连电路如下:

由原理图可以明显瞧出,当按键未被按下时,对应引脚为高电平;按键被按下时为低电平。

通过扫描即可辨别哪一个按键被按下。

本题画出得虽然就是独立按键,但就是内部驱动依然就是行列式按键得驱动,这里只就是为了画图方便。

(4)复位电路

当按下复位键时单片机进入复位状态,可以进行时间得设置等。

电路图如下所示:

四、系统软件部分得设计

本设计得软件系统用来配合硬件电路实现特定得功能。

程序主要包含键盘扫描模块、时间处理模块、与数码管显示程序3大部分.

程序大致流程如下:

        

          

       

              

     

            

1、时间处理模块

单片机晶振频率为12MHz,一个机器周期等于12个振荡脉冲周期,因此机器时序频率就是振荡频率得1/12,即1MHz,所以一个机器周期为1μs。

本设计用得就是计时器0得方式1,对于方式1,计数个数M与计数初值N得关系为M=2^16–N,定时时间t与计数个数M与初值N得关系为t =M*机器周期=(2^16-N)*时钟周期*12。

计时过程中,秒sec等于60时清零,分min加一;分min等于60时清零,小时hour加一;当小时大于24时,置为0。

时分秒得进位算法代码如下:

voidtimecontrol()     

     sec++;

      if(sec==60)    //秒sec到60清零,分min加一

  {

         sec=0;

           min++;

         if(min==60)//分min到60清零,时hour加一

          {

                  min=0;

               hour++;

                if(hour==24)//小时hour等于24时清零

               hour=0;

            }

     }

}

定时器得先关设置:

voidmain()

{

    TMOD=0x01;                   //定时器0工作在方式1

    TH0=(65536—45872)/256;        //装初值,50ms

     TL0=(65536-45872)%256;

     EA=1;              //总中断允许

     ET0=1;            //T0中断允许

      TR0=1;                //开定时器0

     while

(1)

     {

        keyscan_settime();

          keyscan_time();     

         buz();    

      }

2、数码管显示模块

本设计中以P0口作为数码管得段选输出,P3口为位选信号输出。

由于所用数码管为共阳极连接,所以要点亮得数码管位选端为高电平1、

位选信号得I/O口声明

#include<reg51、h>

#defineucharunsignedchar

#defineuintunsignedint       

sbits1=P3^0;          //数码管位选控制端得定义

sbits2=P3^1;

sbit s3=P3^2;

sbit s4=P3^3;

sbits5=P3^4;

sbits6=P3^5;

sbits7=P3^6;

段码表:

ucharcodemum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0—9编码

数码管显示函数如下:

voiddisplay(ucharzs,ucharzm,ucharzh)       //数码管显示函数

{       

  s1=1;ﻩ//P3即S系列输出位选信号

  P0=mum[zh/10];   //P0输出段选信号,显示小时得十位    

  delayms(5);

  s1=0;

  

  s2=1;

  P0=mum[zh%10]&0x7f;      // 显示时得个位加上小数点

  delayms(5);

  s2=0;

  

  s3=1;

  P0=mum[zm/10];        //显示分得十位

  delayms(5);

  s3=0;

  

  s4=1;

  P0=mum[zm%10]&0x7f;         //分得个位加上小数点

  delayms(5);

  s4=0;

  

  s5=1;

  P0=mum[zs/10];       //秒得十位

  delayms(5);

  s5=0;

   

  s6=1;     

  P0=mum[zs%10];//秒得个位

  delayms(5);

  s6=0;

3、键盘扫描模块

 首先要声明各个按键得功能以及对应得I/O口,然后驱动程序将对按键进行扫描以识别被按下得键.

按键对应I/O口声明

/*k1设置时间,k2定时,k3时分秒选择,k4加数字,k5减数字。

*/

sbit k1=P1^0;       

sbitk2=P1^1;

sbit k3=P1^2;

sbitk4=P1^3;

sbitk5=P1^4;

键盘扫描以进行时间设置

void keyscan_settime()            //时间设置模块

     ucharst,mt,ht;

      if(k1==0)

     {

        delayms(10);   //延迟一段时间再次扫描以达到软件消抖得目得

          if(k1==0)

           {

           st=sec,mt=min,ht=hour;

          TR0=0;            //关闭定时器

           while(k1==0)    //等待用户按键

         {

               display(st,mt,ht);              

                if(k3==0)

              {

                    delayms(10);

                     if(k3==0)       

                    {

                     while(!

k3);

                  ss++;

                 if(ss==3)    ss=0;

                       }

                }

                  /*通过ss选择时分秒设置*/

              if(k4==0)          //加数

                      {

                           delayms(10);

                       if(k4==0)

                       {

                           while(!

k4);

                           switch(ss)

                            {

                          case0:

st++;if(st==60)st=0;break;

                           case1:

mt++;if(mt==60)mt=0;break;

                        case 2:

ht++;if(ht==24)ht=0;break;     

                         default:

;                               

                          }

                         }    

                      }

               if(k5==0)        //减数

                     {

                         delayms(10);

                           if(k5==0)

                          {

                       while(!

k5);

                         switch(ss)

                         {

                    case0:

if(st>0)st——;

                                   else      st=0;break;

                           case1:

if(mt>0)mt-—;

                                     else     mt=0;break;

                        case 2:

if(ht〉0)ht——;

                                     else     ht=0;break;      

                       default:

;

                           }                                                                                      

                           }      

                    }

                     }

               TR0=1;      //设置完毕,开启定时器

               sec=st,min=mt,hour=ht;                                

                 }                               

          }          

           display(sec,min,hour);

}

用户定闹钟时间模块

voidkeyscan_time()        //用户定时模块

    if(k2==0)

     {

          delayms(10);          

          if(k2==0)

         {

           s=sec;m=min;h=hour;

          while(k2==0)       //开始定时设置

         {

              display(s,m,h);

               if(k3==0)

                   {

                    delayms(10);

                   if(k3==0)       

                    {

                 while(!

k3);

                      ss++;

                     if(ss==3)     ss=0;

                     }

             }

             /*通过ss选择时分秒设置*/

                if(k4==0)           //加一

                   {

                           delayms(10);

                        if(k4==0)

                           {

                     while(!

k4);

                         switch(ss)

                           {

                          case0:

s++;if(s==60)s=0;break;

                        case1:

m++;if(m==60)m=0;break;

                      case 2:

h++;if(h==24)h=0;break;     

                         default:

;                                 

                         }

                              }    

                   }

               if(k5==0)         //减一

                     {

                           delayms(10);

                        if(k5==0)

                         {

                            while(!

k5);

                      switch(ss)

                       {

                         case 0:

if(s〉0)s--;

        

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

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1