标题: 51单片机六位显示数码管时钟制作(带闹钟设置,源码,原理图) [打印本页]

作者: 879540191    时间: 2018-5-26 13:51
标题: 51单片机六位显示数码管时钟制作(带闹钟设置,源码,原理图)
时钟可以显示到秒位


从左到右的开关控制分别为:秒设置、分设置、时设置、进入时间设置(设置时间需要按一下这个再按前面3个按键设置)、闹钟设置(通过前面3个按键设置)、保存设置(设置完成后按下保存并退出)。


数码管用的是共阴,共阳的话加三极管闲麻烦,没加。
数码管a~g接的P0口,没用10K排阻上拉,试了下觉得亮度太低了,就都换成了2K的作为上拉。


有兴趣的可以给加上温度传感器,可以显示温度(我这里面就没加了)


初学单片机没多久,欢迎大佬指导。

材料如下:89C52*1
                 4位数码管*1+2位数码管*1(当然如果有六位的也可以直接用,找不到其他数码管了就这么混搭了
                  有源蜂鸣器*1(试过无源,但时间计算过于占用资源导致发声不是很完美,大佬可以改一下)
                  轻触开关*7(1个用于复位,其余六个用于设置)  +     自锁开关*1
                  电池*1 + 5V稳压*1

单片机源码:
  1. #include <reg52.h>
  2. #define uint  unsigned int
  3. #define uchar unsigned char

  4. sbit WE1=P2^5;
  5. sbit WE2=P2^4;
  6. sbit WE3=P2^3;
  7. sbit WE4=P2^2;
  8. sbit WE5=P2^1;
  9. sbit WE6=P2^0;

  10. sbit K1=P1^0;   //设置小时位
  11. sbit K2=P1^1;   //设置分位
  12. sbit K3=P1^2;   //设置秒位
  13. sbit K4=P1^3;   //进入时间设置
  14. sbit K5=P1^4;   //进入闹钟设置
  15. sbit K6=P1^5;   //退出设置
  16. sbit BZ=P1^6;  //蜂鸣器接口

  17. uchar code table[]={
  18. 0XC0,0XF9,0XA4,
  19. 0XB0,0X99,0X92,
  20. 0X82,0XF8,0X80,
  21. 0X90};

  22. uint tt=0,i=0,j=0,T=0,R=0,S;
  23. uint W1=0,W2=0,W3=0,W4=0,W5=0,W6=0;      //当前时间位,依次接P0口即可,即W1=P0^0,W2=P0^2.....以此类推
  24. uint WD1=0,WD2=0,WD3=0,WD4=0,WD5=0,WD6=0;  //闹钟时间位,用于储存设置的闹钟时间,不接

  25. void delay(uint);  //软延时
  26. //void delay1(uint);
  27. void js(void);  //时钟进位定义
  28. void key(void); //按键
  29. void XS(uint,uint,uint,uint,uint,uint);  //动态扫描数码管显示
  30. void xhsz(uint,uint,uint,uint,uint,uint,uint);  //时钟位设置函数

  31. void main()
  32. {       
  33.         P1=0X0;
  34.         TMOD=0X01;
  35.         TH0=(65536-49971)/256;   
  36.         TL0=(65536-49971)%256;
  37.         //TH1=(65536-65535)/256;  //定时器二(未启用)
  38.         //TL1=(65536-65535)%256;
  39.         EA=1;
  40.         ET0=1;
  41.         //ET1=1;
  42.         TR0=1;
  43.         //TR1=1;
  44.         while(1)
  45.         {
  46.                 key();
  47.                 XS(W1,W2,W3,W4,W5,W6);
  48.                 js();
  49.                 if(WD1==W1&&WD2==W2&&WD3==W3&&WD4==W4&&WD5==W5&&WD6==W6)   //闹钟定时判断
  50.                         T=1;
  51.         }
  52. }

  53. void xhsz(uint Q1,uint Q2,uint Q3,uint Q4,uint Q5,uint Q6,uint Y) //输入需要设置的位Q1~Q6,末尾输入1则将值赋给W1~W6,输入0则赋给WD1~WD6
  54. {
  55.         while(1)
  56.         {
  57.                 if(Y==1)
  58.                 {
  59.                         W1=Q1;W2=Q2;W3=Q3;W4=Q4;W5=Q5;W6=Q6;
  60.                 }
  61.                 if(Y==0)
  62.                 {
  63.                         WD1=Q1;WD2=Q2;WD3=Q3;WD4=Q4;WD5=Q5;WD6=Q6;
  64.                 }
  65.                 if(K1==1)//秒调
  66.                 {
  67.                         delay(10);
  68.                         if(K1==1)
  69.                         {
  70.                                 while(K1==1)
  71.                                 XS(Q1,Q2,Q3,Q4,Q5,Q6);
  72.                                 Q1++;
  73.                                 if(Q1>9)
  74.                                 {Q2++;Q1=0;}
  75.                                 if(Q2>5)
  76.                                 {Q2=0;Q3=0;}
  77.                         }       
  78.                 }
  79.                 if(K2==1)//分调
  80.                 {
  81.                         delay(10);
  82.                         if(K2==1)
  83.                         {
  84.                                 while(K2==1)
  85.                                 XS(Q1,Q2,Q3,Q4,Q5,Q6);
  86.                                 Q3++;
  87.                                 if(Q3>9)
  88.                                 {Q4++;Q3=0;}
  89.                                 if(Q4>5)
  90.                                 {Q4=0;Q3=0;}
  91.                         }       
  92.                 }
  93.                 if(K3==1)//时调
  94.                 {
  95.                         delay(10);
  96.                         if(K3==1)
  97.                         {
  98.                                 while(K3==1)
  99.                                 XS(Q1,Q2,Q3,Q4,Q5,Q6);
  100.                                 Q5++;
  101.                                 if(Q5>9)
  102.                                 {Q6++;Q5=0;}
  103.                                 if(Q5>3&&Q6>1)
  104.                                 {Q6=0;Q5=0;}
  105.                         }       
  106.                 }
  107.                 XS(Q1,Q2,Q3,Q4,Q5,Q6);
  108.                 if(K6==1)
  109.                         break;
  110.         }
  111. }

  112. void key()
  113. {
  114.                 if(K4==1) //设置时间
  115.                 {
  116.                         delay(10);
  117.                         if(K4==1)
  118.                         {
  119.                                 while(K4==1);
  120.                           TR0=0;
  121.                                 xhsz(W1,W2,W3,W4,W5,W6,1);
  122.                                 TR0=1;
  123.                         }
  124.                 }
  125.                
  126.                 if(K5==1)  //设置闹钟
  127.                 {
  128.                         delay(10);
  129.                         if(K5==1)
  130.                         {
  131.                                 while(K5==1);
  132.                                 xhsz(WD1,WD2,WD3,WD4,WD5,WD6,0);
  133.                         }
  134.                 }
  135.                 if(K6==1)  //关闭闹钟
  136.                 {
  137.                         delay(10);
  138.                         if(K6==1)
  139.                         {
  140.                                 while(K6==1);
  141.                                 T=0;
  142.                                 BZ=0;
  143.                         }
  144.                 }
  145. }


  146. void time() interrupt 1  //定时器1
  147. {
  148.         TH0=(65536-49971)/256;
  149.         TL0=(65536-49971)%256;
  150.         tt++;
  151.         js();
  152.         if(T==1)
  153.         {
  154.                 R++;
  155.                 if(R==1000)  //闹钟响铃时间 计算方式是R*50ms,这里设置的是50S
  156.                 {T=0;R=0;}
  157.         }
  158. }

  159. /*void time1() interrupt 3
  160. {
  161.         TH1=(65536-65535)/256;
  162.         TL1=(65536-65535)%256;
  163.         S++;
  164. }*/

  165. void delay(uint t)
  166. {
  167.         for(i=t;i>0;i--)
  168.          {
  169.                  for(j=90;j>0;j--);
  170.          }
  171. }

  172. /*void delay1(uint S)
  173. {
  174.         for(i=S;i>0;i--)
  175.         {
  176.                 for(j=1;j>0;j--);
  177.         }
  178. }*/

  179. void js()
  180. {
  181.         if(tt==20)
  182.                 {
  183.                         tt=0;
  184.                         W1++;
  185.                 }
  186.                
  187.                 if(W1>9)
  188.                 {
  189.                   W2++;
  190.                   W1=0;
  191.                 }
  192.                        
  193.                 if(W2>5)
  194.                 {
  195.                         W3++;
  196.                         W2=0;
  197.                 }
  198.                                        
  199.                 if(W3>9)
  200.                 {
  201.                         W4++;
  202.                         W3=0;
  203.                 }
  204.                
  205.                 if(W4>5)
  206.                 {
  207.                         W5++;
  208.                         W4=0;
  209.                 }
  210.                
  211.                 if(W5>9)
  212.                 {
  213.                         W6++;
  214.                         W5=0;
  215.                 }
  216.                
  217.                 if(W5>3&&W6>1)
  218.                 {
  219.                         W1=0;
  220.                         W2=0;
  221.                         W3=0;
  222.                         W4=0;
  223.                         W5=0;
  224.                         W6=0;
  225.                 }
  226.         }


  227. void XS(uint Q1,uint Q2,uint Q3,uint Q4,uint Q5,uint Q6)
  228. {
  229.                 WE1=0;
  230.                 P0=~table[Q1];
  231.                 delay(3);
  232.                 WE1=1;
  233.                
  234.                 WE2=0;
  235.                 P0=~table[Q2];
  236.                 delay(3);
  237.                 WE2=1;
  238.                
  239.                 WE3=0;
  240.                 P0=~table[Q3];
  241.                 delay(3);
  242.                 WE3=1;
  243.                
  244.                 WE4=0;
  245.                 P0=~table[Q4];
  246.                 delay(3);
  247.                 WE4=1;
  248.                
  249.                 WE5=0;
  250.                 P0=~table[Q5];
  251.                 delay(3);
  252.                 WE5=1;
  253.                
  254.                 WE6=0;
  255.                 P0=~table[Q6];
  256.                 delay(3);
  257.                 WE6=1;
  258.                
  259.                 if(T==1)
  260.                         BZ=1;   //蜂鸣器响
  261.                 if(T==0)
  262.                         BZ=0;   //蜂鸣器停
  263.         }
复制代码

附上电路+程序:
数码管时钟.rar (46.54 KB, 下载次数: 377)
数码管时钟程序.rar (34.36 KB, 下载次数: 287)
电路图.PDF (72.14 KB, 下载次数: 380)




作者: Lst_Melody    时间: 2018-11-18 14:16
      谢谢大佬,学习一下
作者: baby66666    时间: 2018-11-19 15:30
您好,这个电路的仿真图和原件清单能够发一下吗?
作者: baby66666    时间: 2018-11-19 16:09
您好,我搭了一下仿真图,仿真不出来啊

捕获.PNG (23.69 KB, 下载次数: 153)

捕获.PNG

作者: 2499508500    时间: 2018-11-24 12:46
baby66666 发表于 2018-11-19 16:09
您好,我搭了一下仿真图,仿真不出来啊

你的问题解决了吗?同学,我也试了一下,问题和你一样

作者: 2499508500    时间: 2018-11-24 13:56
baby66666 发表于 2018-11-19 16:09
您好,我搭了一下仿真图,仿真不出来啊

同学,你把那个数码管换成共阴极的就可以,你现在这个是共阳极

作者: xuwei517    时间: 2018-12-11 17:37
谢谢分享 也想做一个
作者: rrqxx    时间: 2018-12-19 22:38
谢谢大佬,学习一下
作者: 264389    时间: 2018-12-27 15:26
楼主怎么显示两个数就有一个点
作者: white丶    时间: 2019-3-13 15:57
楼主,用六位显示数码管和你这个电路图一样吗?

作者: slhslhhao    时间: 2019-3-13 23:30
下载没做,等有空再做吧!
作者: venjo    时间: 2019-4-17 17:29
学习学习
作者: zsf333666    时间: 2019-4-20 23:01
楼主不厚道 明明用的共阳数码组可非要说是共阴
作者: 18242057387    时间: 2019-4-30 13:49
感谢,学习了
作者: nmz888888    时间: 2019-5-28 10:52
大佬哦
作者: nmz888888    时间: 2019-5-28 10:52
厉害啊,大佬带带我
作者: 千年破晓    时间: 2019-6-3 11:28
正打算做这个,真的是强啊!
作者: 儿子很    时间: 2019-6-4 08:56
谢谢大佬
作者: chenyinhu    时间: 2019-6-21 09:03
非常好的资料
作者: object    时间: 2019-6-26 11:22
谢谢分享 也想做一个
作者: 核动力潜艇    时间: 2019-7-27 21:08
学习一下,零件集齐打算做一个~
作者: pp8923    时间: 2019-8-23 17:19
不错,不知道显示效果怎么样
作者: a187185    时间: 2019-9-13 23:36

正打算做这个,真的是强啊!
作者: 越南超级人类    时间: 2019-10-20 21:58
Q1=M/10;Q2=M%10;Q3=F/10;Q4=F%10;Q5=S/10;Q6=S%10;这样的程序都没有,数码管怎么显示
作者: sonkouri    时间: 2019-10-25 13:59
感谢这个不错的哦,电路简单,使用也可以的
作者: 奶爸酱    时间: 2020-4-10 17:30
谢谢分享
作者: 米花卷    时间: 2020-4-15 07:57
也没有防真出来,弄了一个晚上
作者: zxopenljx    时间: 2020-4-17 15:14
谢谢分享
作者: hyjxxy    时间: 2020-4-28 12:58
white丶 发表于 2019-3-13 15:57
楼主,用六位显示数码管和你这个电路图一样吗?

就是六个数码管啊,显示时,分,秒。
作者: 我是小丸子    时间: 2020-5-28 10:25
大佬,闹钟怎么设置呀
作者: zxopenljx    时间: 2020-5-30 14:47
感谢楼主分享
作者: axiongzhang    时间: 2020-6-24 15:02
数码管要消隐,有鬼影
作者: xiesonny    时间: 2020-7-7 08:43
玩得很六呀,老弟
作者: MrLiu20000310    时间: 2020-7-10 23:16
问一下为什么蜂鸣器没反应?
作者: leezll    时间: 2020-7-22 07:06
这按键也贼多了点吧。。。
作者: 梁廷明    时间: 2020-7-23 18:05
baby66666 发表于 2018-11-19 16:09
您好,我搭了一下仿真图,仿真不出来啊

数码管类型没选对
作者: 22@wl    时间: 2021-6-1 16:59
蜂鸣器可以响吗?
作者: wkaikai    时间: 2021-10-10 10:22
很完美。赞
作者: wkaikai    时间: 2021-10-10 11:00
楼主:我用keil4打开程序怎么是错误的

作者: 新乡家电维修    时间: 2021-10-12 12:18
xuwei517 发表于 2018-12-11 17:37
谢谢分享 也想做一个

没用专用时钟芯片,还是不要做了,断电还要对时间,
作者: yangbulasi    时间: 2021-11-5 21:23
zsf333666 发表于 2019-4-20 23:01
楼主不厚道 明明用的共阳数码组可非要说是共阴

的确,看他程序的断码也是共阳的数码管
作者: dhbt2021    时间: 2021-12-23 19:02
留爪,慢慢学习!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1