单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

有闹钟功能的单片机数字钟制作 带原理图,PCB工程,代码

  [复制链接]
跳转到指定楼层
楼主
自己做的第一个数字钟,有闹钟功能。新手五分,求大神指导

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


板子不超过10*8cm
不能用芯片,用三极管控制数码管
有闹钟功能
显示时分秒
有蜂鸣器
按键不超过六个(除复位外)
进入设置时时钟停止
使用12分频

单片机源代码如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define numport P0              //段选
  5. #define placeport P2                         //位选                  
  6. uint hour=23,minut=59,second=59;    //时,分,秒
  7. uint hour1=0,minut1=0;     //闹钟
  8. uint tc0time;          //定时计数器0溢出次数
  9. uint numcode[]={0xC0,0xF9,0xA4, 0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf};           //零到九               
  10. uint numplace[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};     //数码管数字从右到左第一至四位
  11. uint keyt;
  12. uchar pattern=0;  //0:时钟模式 ,1:设置时,2设置分
  13. uchar npattern=0;  //0正常1闹钟时2闹钟分
  14. uchar alt=0,altt=0;

  15. sbit buzzer=P1^0;
  16. sbit key1=P1^4;  //时钟
  17. sbit key2=P1^5;  //减一
  18. sbit key3=P1^6;  //加一
  19. sbit key4=P1^7;  //闹钟
  20. sbit led1=P1^1;
  21. sbit led2=P1^2;
  22. sbit led3=P1^3;
  23. bit al=0;
  24. bit alttt;



  25. void key(void)    //按键判断
  26. {
  27.         if(key1==0)
  28.         {
  29.                 keyt++;
  30.                 if(keyt==5)
  31.                 {
  32.                         keyt=0;
  33.                         if(buzzer==1&&al==1){buzzer=0;al=0;led1=1;led2=1;led3=1;}else{
  34.                         if(npattern==0)
  35.                         {
  36.                                 pattern++;
  37.                                 if(pattern!=0){led1=0;};
  38.                                 if(pattern==3){pattern=0;led1=1;led2=1;led3=1;second=0;};
  39.                                 if(pattern==1){led2=0;led3=1;}
  40.                                 if(pattern==2){led3=0;led2=1;}
  41.                         }else{al=0;npattern=0;led2=1;led3=1;}
  42.                         }
  43.                 }
  44.         }
  45.         if(key2==0)
  46.         {
  47.                 keyt++;
  48.                 if(keyt==5)
  49.                 {
  50.                         keyt=0;
  51.                         if(buzzer==1&&al==1){buzzer=0;al=0;led1=1;led2=1;led3=1;}else{
  52.                         if(pattern==1){hour++;};
  53.                     if(pattern==2){minut++;};
  54.                     if(npattern==1){hour1++;if(hour1==24){hour1=0;};};
  55.                     if(npattern==2){minut1++;if(minut1==60){minut1=0;};};        
  56.                         }
  57.                 }
  58.         }
  59.         if(key3==0)
  60.         {
  61.                 keyt++;
  62.                 if(keyt==5)
  63.                 {
  64.                         keyt=0;
  65.                         if(buzzer==1&&al==1){buzzer=0;al=0;led1=1;led2=1;led3=1;}else{
  66.                         if(pattern==1)
  67.                         {
  68.                                 if(hour==0)
  69.                                 {
  70.                                         hour=23;
  71.                                 }else{hour--;}
  72.                         }
  73.                     if(pattern==2)
  74.                         {
  75.                                 if(minut==0)
  76.                                 {
  77.                                         minut=59;
  78.                                 }else{minut--;}
  79.                         }
  80.                         if(npattern==1)
  81.                         {
  82.                                 if(hour1==0)
  83.                                 {
  84.                                         hour1=23;
  85.                                 }else{hour1--;}
  86.                         }
  87.                     if(npattern==2)
  88.                         {
  89.                                 if(minut1==0)
  90.                                 {
  91.                                         minut1=59;
  92.                                 }else{minut1--;}
  93.                         }
  94.                   }
  95.                 }
  96.         }
  97.         if(key4==0)
  98.         {
  99.                 keyt++;
  100.                 if(keyt==5)
  101.                 {
  102.                         keyt=0;
  103.                         if(buzzer==1&&al==1){buzzer=0;al=0;led1=1;led2=1;led3=1;}else{
  104.                         if(pattern==0)
  105.                         {
  106.                                 npattern++;
  107.                                 if(npattern==3)
  108.                                 {
  109.                                         npattern=0;
  110.                                         led2=1;led3=1;
  111.                                         al=1;
  112.                                 }
  113.                                 if(npattern==1){led2=0;led3=1;}
  114.                                 if(npattern==2){led3=0;led2=1;}
  115.                         }
  116.                   }
  117.                 }
  118.         }
  119. }

  120. void delay (unsigned int a)                                                    //1ms延时
  121. {
  122.    while(a--)
  123.    {  
  124.       unsigned char i, j;
  125.           i = 12;
  126.           j = 169;
  127.           do
  128.           {
  129.                  while (--j);
  130.           }while (--i);
  131.    };
  132. }
  133. void delayu (unsigned int a)                //@12.000MHz
  134. {
  135.     while(a--)
  136.      {
  137.               unsigned char i, j;
  138.         i = 2;
  139.         j = 39;
  140.         do
  141.            {
  142.                 while (--j);
  143.             } while (--i);
  144.       };
  145. }
  146.       
  147. void Timer0Init(void)                                                                    //1毫秒@12.000MHz
  148. {
  149.     IE=0x83;                                                                    //中断开关设定:打开总中断开关,允许定时计数器中断0工作
  150.     TCON=0x10;                                                                  //中断控制寄存器设定:允许T/C0产生中断,关闭其他中断
  151.         TMOD=0x01;                                                                  //设置T/C0的工作方式为16位计数器
  152.         TL0 = 0x18;                                                                             //设置定时初值
  153.         TH0 = 0xfc;                                                                               //设置定时初值
  154. }      

  155. void numprintf(uchar a,uchar b,uchar c)                                                 //数码管输出函数
  156. {
  157.         uint i=0;
  158.         uint f[8];
  159.         f[2]=10;
  160.         f[5]=10;                                                                  //一到四位数字
  161.         f[0]=a/10;f[1]=a%10;                                                        //时位的数字
  162.         f[3]=b/10;f[4]=b%10;                                                        //分位的数字
  163.         f[6]=c/10;f[7]=c%10;
  164.         while(i<=7)
  165.         {
  166.                 placeport=numplace[i];
  167.                 numport=numcode[f[i]];
  168.                 delayu(1);
  169.                 numport=0xff;
  170.                 i++;
  171.         }        
  172. }

  173. void time(void)                                                                 //时间计算函数
  174. {
  175.         if(second>=60){second=0;minut++;};
  176.         if(minut>=60){minut=0;hour++;};
  177.         if(hour>=24){hour=0;};
  178.         if(tc0time==200){second++;tc0time=0;}
  179.         tc0time++;
  180. }

  181. void alarm(void)
  182. {
  183.         if(al==1)
  184.         {
  185.                 if(hour==hour1&&minut==minut1){buzzer=1;}
  186.                 else{buzzer=0;}
  187.         }
  188. }

  189. void tc0(void) interrupt 1 using 1                                              //1ms级别定时,1t模式
  190. {
  191.         TL0 = 0xb0;                                                                            //重新装初始值
  192.         TH0 = 0x3c;                                                                            //重新装初始值
  193.         time();
  194.         if(pattern==1||pattern==2){tc0time=0;};
  195.         alarm();
  196.         key();
  197.         if(buzzer==1&&al==1)
  198.         {
  199.                 alt++;
  200.                 altt=alt/5;
  201.                 if(altt/2==0){alttt=0;}else{alttt=1;};
  202.                 if(alttt==0)
  203.                 {
  204.                         led1=0;
  205.                         led2=0;
  206.                         led3=0;
  207.                 }
  208. ……………………

  209. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
闹钟.zip (10.74 MB, 下载次数: 88)


评分

参与人数 2黑币 +55 收起 理由
d026530 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
 楼主| Anyaes 发表于 2017-6-2 19:49 | 只看该作者
新人能审核过去吗?
回复

使用道具 举报

板凳
admin 发表于 2017-6-2 20:31 | 只看该作者
Anyaes 发表于 2017-6-2 19:49
新人能审核过去吗?

这么好的作品 当然能,黑币已经发放了
回复

使用道具 举报

无效楼层,该帖已经被删除
5#
ai119 发表于 2017-11-17 14:03 | 只看该作者
3、        动态显示数字钟(2队、每队1人)★ (1)        使用2个四位共阴数码管做显示部分。- (2)        上电的时候,L1发光二极管以1S闪烁。 (3)        可调时功能,有到点报时、闹铃功能。 最小系统:stc89c52rc,12M晶振,2*30P电容,10K电阻,10U电容; 外围芯片:轻触按键*5,4位共阴数码管*2,三极管8550*1,蜂鸣器*1,排阻4K7*3,插针接口若干,LED*1,74HC573*1。  大哥帮帮忙
回复

使用道具 举报

6#
THEFRIEND 发表于 2018-12-12 14:07 | 只看该作者
赞一个!加油
回复

使用道具 举报

7#
1009920020 发表于 2019-3-24 12:16 | 只看该作者
我要学习
回复

使用道具 举报

8#
喜乐 发表于 2019-4-22 13:11 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
ii0311593190 发表于 2019-5-16 09:44 | 只看该作者
老哥, 想学习一下,我是新人,能不能 1457761062@qq.com  发一下!  很是感谢!
回复

使用道具 举报

10#
学完单片学32 发表于 2019-5-16 20:32 | 只看该作者

谢谢分享
回复

使用道具 举报

11#
wert521 发表于 2019-6-1 11:47 | 只看该作者
谢谢楼主
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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