找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14028|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机制作电子闹钟设计方案及原理与实现过程

[复制链接]
跳转到指定楼层
楼主
(一)设计任务
  1、采用四位LED动态显示小时、分单元。
  2、具有自动整点报时功能。
  3、可以通过四个开关设定修改时间,保证准确性。
  4、通过LED灯的显示,实现整点报时。
(二)设计方案
   显示时、分,打开电源时,应当显示的数据为00:00,秒钟通过右边的LED灯的闪烁来显示,每闪烁一次代表计时一秒,然后电路会自动开始计时。电路中应当有时、分的时间调整按钮。当显示数据变为00:00时,而不是24:00。时间调整按钮按下时间小于1s时,时钟进入休眠状态;大于1s时,进入时间调整状态,每按1次,显示值加1。K1~K4每按一下,开关状态取反。当闹钟开关k1开启,则显示闹钟设置时间,且中间蓝色LED指示灯亮(蓝色LED灭则显示时钟时间),K2进行小时+1设置,K3进行分钟+1设置,若开关k4开启,则允许闹钟开启,当时间到达闹钟设定时间时,左边闹钟的绿色LED灯闪烁,进行报时,闪烁延时一分钟后熄灭。
程序执行后工作LED指示灯闪动,表示程序开始执行,LCD显示“00:00”,按下操作键K1~K4动作如下:
  (1) K1—显示闹钟设置的时间。
  (2) K2—时调整
  (3) K3—分调整
  (4) K4—闹铃ON/OFF的状态设置,ON闹钟开启,OFF闹钟关闭。

(三)设计原理
  本设计中实现的是4位数的显示。一般来说,控制多位数码管常采用的方法是扫描显示法,即各位数码管共用输入数据,但各数码管的显示控制线则单独控制。  用扫描显示法来完成多位数字显示设计,程序执行时,先使要显示的数字位数对应的数码管允许点亮;然后,将要显示的数据输出到数码管;显示时间到了之后,再切换到下一个数码管来显示,秒钟通过右边LED闪烁来显示,每一秒闪一下。  报时方面设计采取使用左边的LED灯闪烁进行报时,灯闪烁一分钟后熄灭。
(四)硬件电路设计
  电路设计:由以上的分析知,电路中除了单片机之外,还需要4个数码管,4个开关按钮,三个LED闪关灯和三个电阻
   





(五)程序设计及流程图
流程图:

单片机源程序如下:
  1. #include<reg52.h>
  2. unsigned char code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
  3. unsigned int num,tt;
  4. unsigned char ALARM,ALA_SWITCH,ALA_SHI,ALA_FEN,SHI,FEN,num1,num2,num3,num4;  
  5. sbit K1=P1^0;
  6. sbit K2=P1^1;
  7. sbit K3=P1^2;
  8. sbit K4=P1^3;
  9. sbit GLED=P0^0;
  10. sbit RLED=P0^1;
  11. sbit CLOCK_ADJ=P0^2;
  12. void delay(unsigned int a);
  13. void display(unsigned char a,unsigned char b);
  14. void readkey();
  15. void main()
  16. {      
  17.         RLED=0;
  18.         ALARM=0;
  19.         ALA_SWITCH=0;
  20.         CLOCK_ADJ=1;
  21.         ALA_SHI=12;
  22.         ALA_FEN=0;
  23.         SHI=0;
  24.         FEN=0;
  25.         num=0;
  26.         tt=0;
  27.         TMOD=0x01;      
  28.         EA=1;
  29.         ET0=1;
  30.         TR0=1;
  31.         TH0=(65536-50000)/256;//50ms
  32.         TL0=(65536-50000)%256;
  33.         while(1)
  34.         {               
  35.                 if(tt>=10)  
  36.                 {        RLED=!RLED;
  37.                         tt=0;
  38.                         num++;
  39.                         if(num>=120)
  40.                                 {
  41.                                  num=0;
  42.                                  FEN++;
  43.                                  }
  44.                         if(FEN>=60)
  45.                                 {
  46.                                  FEN=0;
  47.                                  SHI++;
  48.                                  }
  49.                         if(SHI>=24) SHI=0;               
  50.                 }
  51.                 if(ALA_SHI>=24)ALA_SHI=0;
  52.                 if(ALA_FEN>=60)ALA_FEN=0;
  53.                 if(SHI==ALA_SHI&&FEN==ALA_FEN)ALARM=1;
  54.                 else ALARM=0;
  55.                 readkey();
  56.                 if(CLOCK_ADJ==1)display(SHI,FEN);
  57.                 if(CLOCK_ADJ==0)display(ALA_SHI,ALA_FEN);      
  58.         }
  59. }
  60. void delay(unsigned int a)
  61. {
  62.         unsigned int x,y;
  63.         for(x=a;x>0;x--)
  64.                 for(y=100;y>0;y--);
  65. }        
  66. void time0() interrupt 1
  67. {
  68.         TH0=(65536-50000)/256;
  69.         TL0=(65536-50000)%256;
  70.         tt++;
  71.         if(ALARM==1&&ALA_SWITCH==1)GLED=!GLED;
  72.                
  73. }

  74. void display(unsigned char a,unsigned char b)
  75. {               
  76.         num1=a/10;
  77.         num2=a%10;
  78.         num3=b/10;
  79.         num4=b%10;
  80.       
  81.         P3=0xFF;
  82.         P2=table[num1];
  83.         P3=0x0E;                                             
  84.         delay(2);
  85.       
  86.         P3=0xFF;
  87.         if(num%2==0)
  88.         P2=table[num2]|0x80;
  89.         else P2=table[num2];
  90.         P3=0X0D;
  91.         delay(2);
  92.       

  93.         P3=0xFF;
  94.         P2=table[num3];
  95.         P3=0X0B;
  96.         delay(2);      
  97.       
  98.         P3=0xFF;
  99.         P2=table[num4];
  100.         P3=0X07;
  101.         delay(2);      
  102. }

  103. void readkey()
  104. {
  105.                 if(K1==0)
  106.                 {
  107.                         delay(5);
  108.                         delay(5);
  109.                         if(K1==0)CLOCK_ADJ=!CLOCK_ADJ;
  110.                         while(!K1) ;     
  111.                         delay(5);
  112.                         delay(5);                       
  113.                 }      
  114.                 if(K2==0)
  115.                 {
  116.                         delay(5);
  117.                         delay(5);
  118.                         if(K2==0)
  119.                         {
  120.                                 if(CLOCK_ADJ==1)SHI++;
  121.                                 if(CLOCK_ADJ==0)ALA_SHI++;
  122.                         }
  123.                         while(!K2);
  124.                         delay(5);
  125.                         delay(5);
  126.                 }
  127.                 if(K3==0)
  128.                 {
  129.                         delay(5);
  130.                         delay(5);
  131.                         if(K3==0)
  132.                         if(CLOCK_ADJ==1)FEN++;
  133.                         if(CLOCK_ADJ==0)ALA_FEN++;
  134.                         while(!K3) ;
  135.                         delay(5);
  136.                         delay(5);      
  137.                 }
  138.                 if(K4==0)
  139.                 {
  140.                         delay(5);
  141.                         delay(5);
  142.                         if(K4==0)
  143.                         {
  144.                         GLED=1;
  145.                         ALA_SWITCH=!ALA_SWITCH;
  146.                         }
  147.                         while(!K4);
  148.                         delay(5);
  149.                         delay(5);
  150.                 }               
  151. }
复制代码

(六)设计方案的改进
  1、本系统只采用了4个数码管,而是通过LED灯闪烁来实现秒的计数,电路中可多加两个数码管,来显示秒的计时,来提高电子闹钟的准确性。
  2、我们可以把LED灯闪烁报时换成蜂鸣器音乐报时,这样更能实现“闹钟”报时功能,使我们更能感知到。
  3、数码显示管可以外加一些三极管,电阻和电容,让电路设计更合理。

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:243873 发表于 2017-10-29 15:47 | 只看该作者
谢谢
回复

使用道具 举报

板凳
ID:243986 发表于 2017-10-29 19:44 | 只看该作者
好文章
回复

使用道具 举报

地板
ID:244062 发表于 2017-10-30 00:25 来自手机 | 只看该作者
学习受教了
回复

使用道具 举报

5#
ID:391591 发表于 2019-1-8 16:10 | 只看该作者
还是那句话, mcu直接驱动数码管合适吗?
回复

使用道具 举报

6#
ID:476064 发表于 2019-4-2 16:38 来自手机 | 只看该作者
谁知道这个怎么设置时间的?没看懂
回复

使用道具 举报

7#
ID:505337 发表于 2019-4-5 15:01 来自手机 | 只看该作者
第一个元件是什么,求解
回复

使用道具 举报

8#
ID:505337 发表于 2019-4-7 21:35 来自手机 | 只看该作者
仿真电路出现仿真线程已终止怎么回事啊,大神们,求解
回复

使用道具 举报

9#
ID:505337 发表于 2019-4-25 13:07 来自手机 | 只看该作者
zsf333666 发表于 2019-4-2 16:38
谁知道这个怎么设置时间的?没看懂

你多按几次按键就明白,多试几次
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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