找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机时分秒时钟程序设计

[复制链接]
跳转到指定楼层
楼主
·       1.本设计采用STC89C51/52或AT89C51/52或AT89S51/52单片机做为主控制器;
·       2.采用74HC573驱动数码管显示;
·       3.功能:六位数码管显示时分秒,整点半点报时,夜间只有灯光提醒
·       4.采用二十四小时制
·       5.到整点时长鸣1次,LED闪烁10次
·       6.到半点时短促鸣响1次,LED闪烁5次


使用方法:
三个按键一个是小时加,一个是分加,一个是秒清零。
开机数码管显示12.30.00是12点30分0秒的意思。


制作出来的实物图如下:


单片机源程序如下:
  1. /************************************************************
  2. 作品名字:简易声光报时时钟  
  3. 功能:六位数码管显示时分秒,整点半点报时 ,夜间只有灯光提醒   
  4. 二十四小时制
  5. 到整点时长鸣1次,LED闪烁10次  
  6. 到半点时短促鸣响1次,LED闪烁5次  
  7. 制作说明:P0接数码管段选,P2低6位接数码管位   
  8.    
  9. **************************************************************/
  10. #include<reg52.h> //头文件
  11. #define uc unsigned char //宏定义
  12. #define ui unsigned int    //宏定义
  13. sbit LED=P3^3;//定义LED
  14. sbit key1=P3^4;//定义调小时
  15. sbit key2=P3^5;//定义调分钟
  16. sbit key3=P3^6;//定义秒清零
  17. sbit beep=P3^7;//设蜂鸣器  
  18. uc min,hour,sec,led,num; //无符号字符型变量
  19. bit bdata hourLED,halfLED,hourbeep,halfbeep; //位变量
  20. uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*0,1,2,3,4,5,6,7,8,9,.*///共阴极编码
  21. void delay(ui x)//1ms延时函数
  22. {
  23.     ui i,j;
  24.     for(i=0;i<x;i++)
  25.     for(j=0;j<121;j++);
  26. }
  27. void display()//扫描显示函数,高位到低位
  28. {
  29.     P0=tab[hour/10];//给小时的十位送形
  30.     P2=0xdf;//11011111 //位选
  31.     delay(1); //延时动态扫描
  32.     P2=0xff;  //关闭位选

  33.     P0=(tab[hour%10])|0x80;//给第二位后加“点
  34.     P2=0xef;//11101111
  35.     delay(1);
  36.     P2=0xff;

  37.     P0=tab[min/10];
  38.     P2=0xf7;//11110111
  39.     delay(1);
  40.     P2=0xff;

  41.     P0=(tab[min%10])|0x80;//给第四位后加“点”
  42.     P2=0xfb;//11111011
  43.     delay(1);
  44.     P2=0xff;

  45.     P0=tab[sec/10];
  46.     P2=0xfd;//11111101
  47.     delay(1);
  48.     P2=0xff;

  49.     P0=tab[sec%10];
  50.     P2=0xfe;//11111110
  51.     delay(1);
  52.     P2=0xff;
  53. }

  54. void keyscan()//键盘扫描,开关接地
  55. {
  56.     if(key1==0)     //如果小时加按键按下
  57.     {
  58.         delay(5);  //延时去抖
  59.         if(key1==0)     //确定是否按键
  60.         {
  61.             hour++;     //小时加一
  62.             if(hour==24) //如果小时等于24
  63.             hour=0;        //小时归零
  64.         }
  65.         while(!key1) display();//判断是否松开
  66.     }
  67.     if(key2==0)      //如果分钟加按键按下
  68.     {
  69.         delay(5);  //延时去抖
  70.         if(key2==0)    //确定是否按键
  71.         {
  72.             min++; //分钟加一
  73.             if(min==60)// 如果分钟等于60
  74.             min=0;    //分钟归零
  75.         }
  76.         while(!key2) display();//判断是否松开
  77.     }
  78.     if(key3==0)//判断调整秒按键
  79.     {
  80.         delay(5);  //延时去抖
  81.         if(key3==0)    //确定是否按键
  82.         {sec=0;} //秒清零
  83.         while(!key3) display();//判断是否松开
  84.     }
  85. }
  86. void strike()//报时函数
  87. {
  88.     if((hour>6)&&(hour<22))//判断大于6点并且小于22点
  89.     {
  90.         if(sec==0)//以下判断是否整点
  91.         {
  92.             if(min==0)//如果秒和分都等于0
  93.             {
  94.                 hourbeep=1;    //那么蜂鸣器和小灯位开启
  95.                 hourLED=1;
  96.             }
  97.             else if(min==30)//如果分钟等于30
  98.             {
  99.                 if(num<10)    //闪5下响一声
  100.                 halfbeep=1;
  101.                 halfLED=1;
  102.             }
  103.         }
  104.     }
  105.     else //小于6点和大于22点的时候
  106.     {
  107.         if(sec==0)//以下判断是否整点
  108.         {
  109.             if(min==0)//如果分钟等于0
  110.             hourLED=1; //led位开
  111.             else if(min==30)//如果分钟=0
  112.             halfLED=1;//进行半点报时
  113.         }
  114.     }
  115. }

  116. void init()//初始化函数
  117. {
  118.     sec=0;//一通电,显示12:30:00,蜂鸣器响一下
  119.     min=30;
  120.     hour=12;
  121.     TMOD=0x01;//设置定时器为定时器0工作方式为1
  122.     TH0=(65536-50000)/256;    //赋初值
  123.     TL0=(65536-50000)%256;  //赋初值
  124.     EA=1; //开总中断
  125.     ET0=1; //开定时器0中断
  126.     TR0=1; //启动定时器0
  127. }

  128. void main()//主函数
  129. {
  130.     init();//初始化
  131.     while(1) //主循环
  132.     {
  133.         display(); //显示
  134.         keyscan();//扫描是否有键按下
  135.         strike();//报时函数
  136.     }
  137. }
  138. void time0() interrupt 1  //定时器中断
  139. {
  140.     TH0=(65536-50000)/256;//重赋初值
  141.     TL0=(65536-50000)%256;//重赋初值
  142.     num++;
  143.     if((num%10==0)&&(hourLED==1)) //整点报时
  144.     {
  145.         led++;
  146.         LED=~LED;//取反实现闪烁
  147.         if(led==20)    //闪10次
  148.         {
  149.             led=0;    //之后关闭闪烁
  150.             LED=1;
  151.             hourLED=0;
  152.         }
  153.     }
  154.     else if((num%10==0)&&(halfLED==1))//半点报时
  155.     {
  156.         led++;
  157.         LED=~LED; //取反实现闪烁
  158.         if(led==10)//闪5次
  159.         {
  160.             led=0; //关闭闪烁
  161.             LED=1;
  162.             halfLED=0;
  163.         }
  164.     }
  165.     if(hourbeep==1)    //蜂鸣器响标志位
  166.     {
  167.         if(num==1)
  168.         beep=0;
  169.         if(num==20)     //长响次之后
  170.         {
  171.             beep=1;      //关闭
  172.             hourbeep=0;
  173.         }
  174.     }
  175.     else if(halfbeep==1) //蜂鸣器响标志位
  176.     {
  177.         if(num<10)
  178.         beep=0;
  179.         if(num==10)     //短响之后
  180.         {
  181.             beep=1;     //关闭
  182.             halfbeep=0;
  183.         }
  184.     }
  185.     if(num==20)    //计时20次为1s时间
  186.     {
  187.         num=0;   
  188.         sec++;    //秒加一
  189.         if(sec==60)//如果秒等于60
  190.         {
  191.             sec=0; //秒归零
  192.             min++; //分钟加一
  193.             if(min==60)//如果分钟等于60
  194.             {
  195.                 min=0; //分钟归零
  196.                 hour++;    //小时加一
  197.                 if(hour==24) //如果小时等于24
  198.                 {hour=0;}//小时归零
  199.             }
  200.         }
  201.     }
  202. }

复制代码


全部资料51hei下载地址:
时分秒时钟.7z (8.5 MB, 下载次数: 23)

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

使用道具 举报

沙发
ID:628379 发表于 2019-12-2 13:21 | 只看该作者
很有帮助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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