找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 30443|回复: 41
收起左侧

51单片机六位显示数码管时钟制作(带闹钟设置,源码,原理图)

  [复制链接]
ID:236597 发表于 2018-5-26 13:51 | 显示全部楼层 |阅读模式
时钟可以显示到秒位
P80526-130416.jpg P80526-130429.jpg P80526-130435.jpg

从左到右的开关控制分别为:秒设置、分设置、时设置、进入时间设置(设置时间需要按一下这个再按前面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, 下载次数: 374)

评分

参与人数 4黑币 +65 收起 理由
qjzyx + 3 赞一个!
stu + 3 共享资料的黑币奖励!
baby66666 + 9 你好,可以发一下仿真和原件清单吗?
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:427104 发表于 2018-11-18 14:16 | 显示全部楼层
      谢谢大佬,学习一下
回复

使用道具 举报

ID:401914 发表于 2018-11-19 15:30 | 显示全部楼层
您好,这个电路的仿真图和原件清单能够发一下吗?
回复

使用道具 举报

ID:401914 发表于 2018-11-19 16:09 | 显示全部楼层
您好,我搭了一下仿真图,仿真不出来啊
捕获.PNG
回复

使用道具 举报

ID:432266 发表于 2018-11-24 12:46 | 显示全部楼层
baby66666 发表于 2018-11-19 16:09
您好,我搭了一下仿真图,仿真不出来啊

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

使用道具 举报

ID:432266 发表于 2018-11-24 13:56 | 显示全部楼层
baby66666 发表于 2018-11-19 16:09
您好,我搭了一下仿真图,仿真不出来啊

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

使用道具 举报

ID:171111 发表于 2018-12-11 17:37 | 显示全部楼层
谢谢分享 也想做一个
回复

使用道具 举报

ID:32289 发表于 2018-12-19 22:38 | 显示全部楼层
谢谢大佬,学习一下
回复

使用道具 举报

ID:453827 发表于 2018-12-27 15:26 来自手机 | 显示全部楼层
楼主怎么显示两个数就有一个点
回复

使用道具 举报

ID:487656 发表于 2019-3-13 15:57 | 显示全部楼层
楼主,用六位显示数码管和你这个电路图一样吗?
回复

使用道具 举报

ID:488949 发表于 2019-3-13 23:30 | 显示全部楼层
下载没做,等有空再做吧!
回复

使用道具 举报

ID:514795 发表于 2019-4-17 17:29 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:476064 发表于 2019-4-20 23:01 来自手机 | 显示全部楼层
楼主不厚道 明明用的共阳数码组可非要说是共阴
回复

使用道具 举报

ID:523257 发表于 2019-4-30 13:49 | 显示全部楼层
感谢,学习了
回复

使用道具 举报

ID:549107 发表于 2019-5-28 10:52 | 显示全部楼层
大佬哦
回复

使用道具 举报

ID:549107 发表于 2019-5-28 10:52 | 显示全部楼层
厉害啊,大佬带带我
回复

使用道具 举报

ID:553573 发表于 2019-6-3 11:28 | 显示全部楼层
正打算做这个,真的是强啊!
回复

使用道具 举报

ID:554320 发表于 2019-6-4 08:56 来自手机 | 显示全部楼层
谢谢大佬
回复

使用道具 举报

ID:568565 发表于 2019-6-21 09:03 | 显示全部楼层
非常好的资料
回复

使用道具 举报

ID:572471 发表于 2019-6-26 11:22 | 显示全部楼层
谢谢分享 也想做一个
回复

使用道具 举报

ID:583232 发表于 2019-7-27 21:08 | 显示全部楼层
学习一下,零件集齐打算做一个~
回复

使用道具 举报

ID:602891 发表于 2019-8-23 17:19 | 显示全部楼层
不错,不知道显示效果怎么样
回复

使用道具 举报

ID:611299 发表于 2019-9-13 23:36 | 显示全部楼层

正打算做这个,真的是强啊!
回复

使用道具 举报

ID:577423 发表于 2019-10-20 21:58 | 显示全部楼层
Q1=M/10;Q2=M%10;Q3=F/10;Q4=F%10;Q5=S/10;Q6=S%10;这样的程序都没有,数码管怎么显示
回复

使用道具 举报

ID:125719 发表于 2019-10-25 13:59 | 显示全部楼层
感谢这个不错的哦,电路简单,使用也可以的
回复

使用道具 举报

ID:726399 发表于 2020-4-10 17:30 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:600695 发表于 2020-4-15 07:57 | 显示全部楼层
也没有防真出来,弄了一个晚上
回复

使用道具 举报

ID:704585 发表于 2020-4-17 15:14 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:66679 发表于 2020-4-28 12:58 | 显示全部楼层
white丶 发表于 2019-3-13 15:57
楼主,用六位显示数码管和你这个电路图一样吗?

就是六个数码管啊,显示时,分,秒。
回复

使用道具 举报

ID:654983 发表于 2020-5-28 10:25 | 显示全部楼层
大佬,闹钟怎么设置呀
回复

使用道具 举报

ID:704585 发表于 2020-5-30 14:47 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:744744 发表于 2020-6-24 15:02 来自手机 | 显示全部楼层
数码管要消隐,有鬼影
回复

使用道具 举报

ID:233182 发表于 2020-7-7 08:43 | 显示全部楼层
玩得很六呀,老弟
回复

使用道具 举报

ID:798994 发表于 2020-7-10 23:16 | 显示全部楼层
问一下为什么蜂鸣器没反应?
回复

使用道具 举报

ID:242298 发表于 2020-7-22 07:06 | 显示全部楼层
这按键也贼多了点吧。。。
回复

使用道具 举报

ID:235954 发表于 2020-7-23 18:05 | 显示全部楼层
baby66666 发表于 2018-11-19 16:09
您好,我搭了一下仿真图,仿真不出来啊

数码管类型没选对
回复

使用道具 举报

ID:930784 发表于 2021-6-1 16:59 | 显示全部楼层
蜂鸣器可以响吗?
回复

使用道具 举报

ID:970326 发表于 2021-10-10 10:22 | 显示全部楼层
很完美。赞
回复

使用道具 举报

ID:970326 发表于 2021-10-10 11:00 | 显示全部楼层

我用keil4打开程序怎么是错误的

我用keil4打开程序怎么是错误的
楼主:我用keil4打开程序怎么是错误的
回复

使用道具 举报

ID:72088 发表于 2021-10-12 12:18 | 显示全部楼层
xuwei517 发表于 2018-12-11 17:37
谢谢分享 也想做一个

没用专用时钟芯片,还是不要做了,断电还要对时间,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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