找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1302时钟数码管显示时间带掉电保存闹钟功能 单片机程序+Proteus仿真

  [复制链接]
跳转到指定楼层
楼主
ID:564898 发表于 2019-6-21 00:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很久没玩单片机了,最近收拾东西又找到很多以前在网上买的东西,感觉浪费了可惜。想做个东西玩玩好多东西都忘了,搜资料的过程中发现这个论坛感觉坛友都好厉害。又有学单片机的冲动了,以前做的东西都拆掉了。我就分享个我以前做的东西。电路图仿真通过。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  1. #include<reg52.h>
  2. #include"ds1302.h"
  3. #include"e2prom.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit Jdq=P2^2;                    
  7. bit S_flag;
  8. uchar k1num,k4num,Al_num,Sh_num,num,shi,fen,miao;
  9. char A_shi,A_fen,A_miao,S_shi,S_fen,S_miao;
  10. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  11. 0x82,0xf8,0x80,0x90,0xbf,0xff,0x88,0xc7,0x89};
  12. void delayms(uint z)
  13. {
  14.         uint x,y;
  15.         for(x=z;x>0;x--)
  16.                 for(y=110;y>0;y--);
  17. }
  18. void Time0_init()
  19. {
  20.         TMOD=0x01;
  21.         TH0=(65536-50000)/256;
  22.         TL0=(65536-50000)%256;
  23.         EA=1;
  24.         ET0=1;
  25.         TR0=1;
  26. }
  27. void Display(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2)
  28. {
  29.         P1=0x01;
  30.         P0=table[shi1];
  31.         delayms(2);

  32.         P1=0x02;
  33.         P0=table[shi2];
  34.         delayms(2);
  35.         P0=table[11];//消隐

  36.         P1=0x04;
  37.         P0=table[10];//间隔       
  38.         delayms(2);
  39.         P0=table[11];//消隐

  40.         P1=0x08;
  41.         P0=table[fen1];       
  42.         delayms(2);

  43.         P1=0x10;
  44.         P0=table[fen2];
  45.         delayms(2);
  46.         P0=table[11];//消隐


  47.         P1=0x20;
  48.         P0=table[10];//间隔
  49.         delayms(2);
  50.         P0=table[11];//消隐


  51.         P1=0x40;
  52.         P0=table[miao1];
  53.         delayms(2);

  54.         P1=0x80;
  55.         P0=table[miao2];       
  56.         delayms(2);
  57.         P0=table[11];//消隐
  58.                        
  59. }
  60. void Shan_Display()
  61. {
  62.         switch(k4num)
  63.                 {
  64.                         case 1:        //开闹钟时间显示
  65.                                 switch(Al_num)
  66.                                 {
  67.                                         case 1: //小时闪烁
  68.                                                 if(S_flag)
  69.                                                         Display(11,11,A_fen/10,A_fen%10,12,13);
  70.                                                 else
  71.                                                         Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);                       
  72.                                                 break;
  73.                                         case 2: //分钟闪烁
  74.                                                 if(S_flag)
  75.                                                         Display(A_shi/10,A_shi%10,11,11,12,13);
  76.                                                 else
  77.                                                         Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);                       
  78.                                                 break;
  79.                                         default :
  80.                                                         Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);                       
  81.                                 }
  82.                                 break;
  83.                         case 2:         //关闹钟时间显示
  84.                                 switch(Sh_num)
  85.                                 {
  86.                                         case 1: //小时闪烁
  87.                                                 if(S_flag)
  88.                                                         Display(11,11,S_fen/10,S_fen%10,5,14);
  89.                                                 else
  90.                                                         Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);                       
  91.                                                 break;
  92.                                         case 2:  //分钟闪烁
  93.                                                 if(S_flag)
  94.                                                         Display(S_shi/10,S_shi%10,11,11,5,14);
  95.                                                 else
  96.                                                         Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);                       
  97.                                                 break;
  98.                                         default : Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);                       
  99.                                 }
  100.                                 break;
  101.                         default: //当前时间显示
  102.                                 switch(k1num)
  103.                                 {
  104.                                         case 1: //小时闪烁
  105.                                                 if(S_flag)
  106.                                                         Display(11,11,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
  107.                                                 else
  108.                                                         Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);                       
  109.                                                 break;
  110.                                         case 2: //分钟闪烁
  111.                                                 if(S_flag)
  112.                                                         Display(now[2]/16,now[2]%16,11,11,now[0]/16,now[0]%16);
  113.                                                 else
  114.                                                         Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);                       
  115.                                                 break;
  116.                                         case 3: //秒闪烁
  117.                                                 if(S_flag)
  118.                                                         Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,11,11);
  119.                                                 else
  120.                                                         Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);                       
  121.                                                 break;
  122.                                         default : Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);                       
  123.                                 }
  124.                
  125.                 }
  126. }
  127. void Mode_keyscan()
  128. {
  129.         if(k4==0)
  130.         {
  131.                 delayms(10);
  132.                 if(k4==0)
  133.                 {
  134.                         k4num++;
  135.                         if(k4num>=3)k4num=0;
  136.                         switch(k4num)
  137.                         {
  138.                                 case 1:k1num=0;
  139.                                         break;
  140.                                 case 2:Al_num=0;
  141.                                         break;
  142.                                 default:Sh_num=0;
  143.                         }
  144.                
  145.                         while(!k4);
  146.                
  147.                 }

  148.         }
  149. }
  150. void Move_keyscan()
  151. {
  152.         if(k1==0)
  153.         {
  154.                 delayms(10);
  155.                 if(k1==0)
  156.                 {
  157.                         if(k4num==0)
  158.                         {
  159.                                 k1num++;
  160.                                 if(k1num>=4)k1num=0;
  161.                         }
  162.                         else if(k4num==1)
  163.                         {
  164.                                 Al_num++;
  165.                                 if(Al_num>=3)Al_num=0;
  166.                         }
  167.                         else if(k4num==2)
  168.                         {
  169.                                 Sh_num++;
  170.                                 if(Sh_num>=3)Sh_num=0;
  171.                         }
  172.                         while(!k1);
  173.                
  174.                 }

  175.         }
  176. }
  177. void Add_keyscan()
  178. {       
  179.     if(k2==0)
  180.         {
  181.                 delayms(10);
  182.                 if(k2==0)
  183.                 {
  184.                         switch(k4num)
  185.                         {
  186.                                 case 1:
  187.                                         switch(Al_num)
  188.                                         {
  189.                                                 case 1:       
  190.                                                         A_shi++;
  191.                                                         if(A_shi>=24)
  192.                                                                 A_shi=0;                               
  193.                                                         while(!k2);
  194.                                                         SectorErase(0x2000);
  195.                                                         byte_write(0x2000,A_shi);
  196.                                                         break;
  197.                                                 case 2:       
  198.                                                         A_fen++;
  199.                                                         if(A_fen>=60)
  200.                                                                 A_fen=0;
  201.                                                         while(!k2);
  202.                                                         SectorErase(0x2200);
  203.                                                         byte_write(0x2200,A_fen);
  204.                                                         break;       
  205.                                                                
  206.                                         }
  207.                                         break;
  208.                                 case 2:
  209.                                         switch(Sh_num)
  210.                                         {
  211.                                                 case 1:       
  212.                                                         S_shi++;
  213.                                                         if(S_shi>=24)
  214.                                                                 S_shi=0;                               
  215.                                                         while(!k2);
  216.                                                         SectorErase(0x2400);
  217.                                                         byte_write(0x2400,S_shi);
  218.                                                         break;
  219.                                                 case 2:       
  220.                                                         S_fen++;
  221.                                                         if(S_fen>=60)
  222.                                                                 S_fen=0;
  223.                                                         while(!k2);
  224.                                                         SectorErase(0x2600);
  225.                                                         byte_write(0x2600,S_fen);
  226.                                                         break;       
  227.                                                                
  228.                                         }
  229.                                         break;
  230.                                 default:
  231.                                         switch(k1num)
  232.                                         {
  233.                                                 uchar dat ;
  234.                                                 case 1:       
  235.                                                         dat=DS1302_ReadData(0x85);
  236.                                                         shi=dat+1;
  237.                                                         if((shi&0x0f)>9)shi=shi+6;
  238.                                                         if(shi>=0x24)shi=0;
  239.                                                         while(!k2);
  240.                                                         DS1302_WriteData(0x8e, 0x00);//允许写操作       
  241.                                                         DS1302_WriteData(0x84,shi);
  242.                                                         DS1302_WriteData(0x8e, 0x80);//写保护                       
  243.                                                         break;
  244.                                                 case 2:       
  245.                                                         dat=DS1302_ReadData(0x83);
  246.                                                         fen=dat+1;
  247.                                                         if((fen&0x0f)>9)fen=fen+6;
  248.                                                         if(fen>=0x60)fen=0;
  249.                                                         while(!k2);
  250.                                                         DS1302_WriteData(0x8e, 0x00);//允许写操作       
  251.                                                         DS1302_WriteData(0x82,fen);
  252.                                                         DS1302_WriteData(0x8e, 0x80);//写保护                       
  253.                                                         break;       
  254.                                                 case 3:       
  255.                                                         dat=DS1302_ReadData(0x81);
  256.                                                         miao=dat+1;
  257.                                                         if((miao&0x0f)>9)miao=miao+6;
  258.                                                         if(miao>=0x60)miao=0;
  259.                                                         while(!k2);
  260.                                                         DS1302_WriteData(0x8e, 0x00);//允许写操作       
  261.                                                         DS1302_WriteData(0x80,miao);
  262.                                                         DS1302_WriteData(0x8e, 0x80);//写保护                       
  263.                                                         break;               
  264.                                         }
  265.                                         break;
  266.                        
  267.                         }       
  268.                 }
  269.                
  270.         }       
  271.        
  272. }
  273. void Reduce_keyscan()
  274. {       
  275.     if(k3==0)
  276.         {
  277.                 delayms(10);
  278.                 if(k3==0)
  279.                 {
  280.                         switch(k4num)
  281.                         {
  282.                                 case 1:
  283.                                         switch(Al_num)
  284.                                         {
  285.                                                 case 1:       
  286.                                                         A_shi--;
  287.                                                         if(A_shi==-1)
  288.                                                                 A_shi=23;                               
  289.                                                         while(!k3);
  290.                                                         SectorErase(0x2000);
  291.                                                         byte_write(0x2000,A_shi);
  292.                                                         break;
  293.                                                 case 2:       
  294.                                                         A_fen--;
  295.                                                         if(A_fen==-1)
  296.                                                                 A_fen=59;
  297.                                                         while(!k3);
  298.                                                         SectorErase(0x2200);
  299.                                                         byte_write(0x2200,A_fen);
  300.                                                         break;                       
  301.                                         }
  302.                                         break;
  303.                                 case 2:
  304.                                         switch(Sh_num)
  305.                                         {
  306.                                                 case 1:       
  307.                                                         S_shi--;
  308.                                                         if(S_shi==-1)
  309.                                                                 S_shi=23;                               
  310.                                                         while(!k3);
  311.                                                         SectorErase(0x2400);
  312.                                                         byte_write(0x2400,S_shi);
  313.                                                         break;
  314.                                                 case 2:       
  315.                                                         S_fen--;
  316.                                                         if(S_fen==-1)
  317.                                                                 S_fen=59;
  318.                                                         while(!k3);
  319.                                                         SectorErase(0x2600);
  320.                                                         byte_write(0x2600,S_fen);
  321.                                                         break;               
  322.                                         }
  323.                                         break;
  324.                         default:
  325.                                         switch(k1num)
  326.                                         {
  327.                                                 uchar dat ;
  328.                                                 case 1:       
  329.                                                         dat=DS1302_ReadData(0x85);
  330.                                                         if(dat==0)
  331.                                                                 shi=0x23;
  332.                                                         else
  333.                                                                 shi=dat-1;
  334.                                                         if((shi&0x0f)>9)shi=shi-6;
  335.                                                         while(!k3);
  336.                                                         DS1302_WriteData(0x8e, 0x00);//允许写操作
  337.                                                         DS1302_WriteData(0x84,shi);       
  338.                                                         DS1302_WriteData(0x8e, 0x80);//写保护               
  339.                                                         break;
  340.                                                 case 2:       
  341.                                                         dat=DS1302_ReadData(0x83);
  342.                                                         if(dat==0)
  343.                                                                 fen=0x59;
  344.                                                         else
  345.                                                                 fen=dat-1;
  346.                                                         if((fen&0x0f)>9)fen=fen-6;
  347.                                                         while(!k3);
  348.                                                         DS1302_WriteData(0x8e, 0x00);//允许写操作
  349.                                                         DS1302_WriteData(0x82,fen);       
  350.                                                         DS1302_WriteData(0x8e, 0x80);//写保护               
  351.                                                         break;       
  352.                                                 case 3:       
  353.                                                         dat=DS1302_ReadData(0x81);
  354.                                                         if(dat==0)
  355.                                                                 miao=0x59;
  356.                                                         else
  357.                                                                 miao=dat-1;
  358.                                                         if((miao&0x0f)>9)miao=miao-6;
  359.                                                         while(!k3);
  360.                                                         DS1302_WriteData(0x8e, 0x00);//允许写操作
  361.                                                         DS1302_WriteData(0x80,miao);
  362.                                                         DS1302_WriteData(0x8e, 0x80);//写保护                       
  363.                                                         break;               
  364.                                         }
  365.                                         break;
  366.                         }       
  367.                 }
  368.                
  369.         }       
  370.        
  371. }
  372. void AL_SHRead()
  373. {
  374.         A_shi=byte_read(0x2000);
  375.         A_fen=byte_read(0x2200);
  376.         S_shi=byte_read(0x2400);
  377.         S_fen=byte_read(0x2600);
  378. }
  379. void AL_SHCheck()
  380. {
  381.         uchar j;
  382. ……………………

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

所有资料51hei提供下载:
电路图.zip (80.85 KB, 下载次数: 120)
源程序.zip (44.51 KB, 下载次数: 145)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:87913 发表于 2019-8-28 09:49 | 只看该作者
好,学习一下
回复

使用道具 举报

板凳
ID:679811 发表于 2020-1-2 17:45 | 只看该作者
楼主优秀,受教了
回复

使用道具 举报

地板
ID:623518 发表于 2020-2-27 19:44 来自手机 | 只看该作者
没有三八译码器控制位选吗?
回复

使用道具 举报

5#
ID:698783 发表于 2020-2-28 17:27 | 只看该作者
非常好!感谢分享
回复

使用道具 举报

6#
ID:727275 发表于 2020-6-2 10:20 | 只看该作者
感谢楼主分享1302时钟数码管显示时间带掉电保存闹钟功能
回复

使用道具 举报

7#
ID:740383 发表于 2020-7-4 11:05 | 只看该作者
感谢楼主1302时钟数码管显示时间资源!
回复

使用道具 举报

8#
ID:540967 发表于 2020-7-4 19:56 | 只看该作者
这个用共阴的还是共阳的数码管
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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