找回密码
 立即注册

QQ登录

只需一步,快速开始

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

带倒计时 温度的数码管万年历 单片机+MAX7221驱动 带仿真和源码 原理图

  [复制链接]
跳转到指定楼层
楼主
ID:137190 发表于 2016-9-26 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
给51黑电子论坛的朋友们分享一个数码管万年历程序,MAX7221芯片驱动,下面是原理图:

所有资料下载:
带倒计时版的万年历.rar (143.86 KB, 下载次数: 156)

下面是部分源程序:
  1. #include "Max7221.h"
  2. #include "1302.h"
  3. sbit SLED=P2^3;
  4. sbit DQ=P2^4;
  5. sbit BT1=P1^1;
  6. sbit BT2=P1^2;
  7. sbit BT3=P1^3;
  8. sbit BT4=P1^4;
  9. unsigned char Nums[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//显示缓冲区
  10. unsigned char TENums[]={0,0};
  11. SYSTEMTIME NowTimes;
  12. uint Temperature;
  13. uchar Old_Sec;                                    
  14. uchar Old_Day;
  15. uchar Old_State=1;
  16. uchar Buttons;
  17. uchar ButtonCount;
  18. uchar HasChange;
  19. uchar HasOpera;
  20. void Delay(unsigned int n)
  21. {
  22.         unsigned int i=0,j=0;
  23.         for(i=0;i<n;i++)
  24.         for(j=0;j<123;j++);
  25. }
  26. void delay_18B20(unsigned int i)
  27. {
  28.         while(i--);
  29. }

  30. void Init_DS18B20(void)
  31. {
  32.          unsigned char x=0;
  33.          DQ = 1;         
  34.          delay_18B20(8);  
  35.          DQ = 0;        
  36.          delay_18B20(80);
  37.          DQ = 1;         
  38.          delay_18B20(14);
  39.          x=DQ;            
  40.          delay_18B20(20);
  41. }

  42. unsigned char ReadOneChar(void)
  43. {
  44.         uchar i=0;
  45.         uchar dat = 0;
  46.         for (i=8;i>0;i--)
  47.          {
  48.                   DQ = 0;
  49.                   dat>>=1;
  50.                   DQ = 1;
  51.                   if(DQ)
  52.                   dat|=0x80;
  53.                   delay_18B20(4);
  54.          }
  55.         return(dat);
  56. }

  57. void WriteOneChar(uchar dat)
  58. {
  59.         unsigned char i=0;
  60.         for (i=8; i>0; i--)
  61.         {
  62.                   DQ = 0;
  63.                 DQ = dat&0x01;
  64.             delay_18B20(5);
  65.                 DQ = 1;
  66.             dat>>=1;
  67. }
  68. }

  69. void ReadTemp(void)
  70. {
  71.         unsigned char a=0;
  72.         unsigned char b=0;
  73.         unsigned char t=0;
  74.         Init_DS18B20();
  75.         WriteOneChar(0xCC);           
  76.         WriteOneChar(0x44);
  77.         delay_18B20(100);      
  78.         Init_DS18B20();
  79.         WriteOneChar(0xCC);
  80.         WriteOneChar(0xBE);
  81.         delay_18B20(100);
  82.         a=ReadOneChar();   
  83.         b=ReadOneChar();          
  84.         Temperature=b<<4;
  85.         Temperature+=(a&0xf0)>>4;               
  86. }

  87. void DayDiscount(void)
  88. {
  89.         NowTimes.DateString[16]=NowTimes.DateString[16]-1;
  90.         if(NowTimes.DateString[16]<0)
  91.         {
  92.                 NowTimes.DateString[15]=NowTimes.DateString[15]-1;
  93.                 NowTimes.DateString[16]=9;
  94.                 if(NowTimes.DateString[15]<0)
  95.                 {
  96.                         NowTimes.DateString[14]=NowTimes.DateString[14]-1;
  97.                         NowTimes.DateString[15]=9;
  98.                         if(NowTimes.DateString[14]<0)
  99.                         {
  100.                                 NowTimes.DateString[13]=NowTimes.DateString[13]-1;
  101.                                 NowTimes.DateString[14]=9;
  102.                                 if(NowTimes.DateString[13]<0)
  103.                                 {
  104.                                         NowTimes.DateString[13]=9;
  105.                                         NowTimes.DateString[14]=9;
  106.                                         NowTimes.DateString[15]=9;
  107.                                         NowTimes.DateString[16]=9;
  108.                                 }
  109.                         }
  110.                 }
  111.         }
  112.         T2H(NowTimes.DateString[13],0xc0);
  113.         T2H(NowTimes.DateString[14],0xc2);
  114.         T2H(NowTimes.DateString[15],0xc4);
  115.         T2H(NowTimes.DateString[16],0xc6);
  116. }

  117. void GetButton()
  118. {
  119.         while(1)
  120.         {
  121.                 if(BT1==1&&BT2==1&&BT3==1&&BT4==1){Buttons=0;break;}
  122.                 if(BT1==0&&BT2==1&&BT3==1&&BT4==1){Buttons=1;break;}
  123.                 if(BT1==1&&BT2==0&&BT3==1&&BT4==1){Buttons=2;break;}
  124.                 if(BT1==0&&BT2==0&&BT3==1&&BT4==1){Buttons=3;break;}
  125.                 if(BT1==1&&BT2==1&&BT3==0&&BT4==1){Buttons=4;break;}
  126.                 if(BT1==0&&BT2==1&&BT3==0&&BT4==1){Buttons=5;break;}
  127.                 if(BT1==1&&BT2==0&&BT3==0&&BT4==1){Buttons=6;break;}
  128.                 if(BT1==0&&BT2==0&&BT3==0&&BT4==1){Buttons=7;break;}
  129.                 if(BT1==1&&BT2==1&&BT3==1&&BT4==0){Buttons=8;break;}
  130.                 if(BT1==0&&BT2==1&&BT3==1&&BT4==0){Buttons=9;break;}
  131.         }
  132.         while(BT1==0||BT2==0||BT3==0||BT4==0)
  133.         {
  134.                 Delay(1);
  135.         }
  136. }
  137. void main()
  138. {
  139.         Init();
  140.         Initial_DS1302();
  141.         Display(Nums);
  142.         while(1)
  143.         {
  144.                 GetButton();
  145.                 if(Buttons!=0)
  146.                 {
  147.                         switch(Buttons)
  148.                         {
  149.                                 case 1:HasOpera=0;HasChange=0;ButtonCount+=1;if(ButtonCount>11){ButtonCount=0;}break;
  150.                                 case 2:HasOpera=1;break;
  151.                                 case 3:HasOpera=2;break;
  152.                                 case 4:break;
  153.                                 case 5:break;
  154.                                 case 6:break;
  155.                                 case 7:break;
  156.                                 case 8:break;
  157.                                 case 9:Old_State=!Old_State;Change7221State(Old_State);break;
  158.                         }
  159.                 }

  160.                 DS1302_GetTime(&NowTimes);
  161.                 DateToStr(&NowTimes);
  162.                 Nums[0]=2;
  163.                 Nums[1]=0;
  164.                 Nums[2]=NowTimes.DateString[0];
  165.                 Nums[3]=NowTimes.DateString[1];
  166.                 Nums[4]=NowTimes.DateString[2];
  167.                 Nums[5]=NowTimes.DateString[3];
  168.                 Nums[6]=NowTimes.DateString[4];
  169.                 Nums[7]=NowTimes.DateString[5];
  170.                 Nums[8]=NowTimes.DateString[7];
  171.                 Nums[9]=NowTimes.DateString[8];
  172.                 Nums[10]=NowTimes.DateString[9];
  173.                 Nums[11]=NowTimes.DateString[10];
  174.                 Nums[12]=NowTimes.DateString[11];
  175.                 Nums[13]=NowTimes.DateString[12];
  176.                 Nums[14]=(Temperature/10);
  177.                 Nums[15]=(Temperature%10);
  178.                 Nums[16]=NowTimes.DateString[13];
  179.                 Nums[17]=NowTimes.DateString[14];
  180.                 Nums[18]=NowTimes.DateString[15];
  181.                 Nums[19]=NowTimes.DateString[16];
  182.                 Nums[20]=NowTimes.DateString[6];
  183.                 Nums[21]=10;
  184.                 Nums[22]=10;
  185.                 Nums[23]=10;
  186.                 Nums[24]=10;
  187.                 Nums[25]=10;
  188.                 switch(ButtonCount)
  189.                 {
  190.                         case 1:
  191.                                         TENums[0]=2;
  192.                                         TENums[1]=3;
  193.                                         if(HasOpera==1)
  194.                                         {
  195.                                                 NowTimes.Year+=1;
  196.                                                 if(NowTimes.Year>50){NowTimes.Year=0;}
  197.                                                 T2H(NowTimes.Year,0x8c);
  198.                                                 HasChange=1;       
  199.                                         }
  200.                                         if(HasOpera==2)
  201.                                         {
  202.                                                 NowTimes.Year-=1;
  203.                                                 if(NowTimes.Year<0){NowTimes.Year=50;}
  204.                                                 T2H(NowTimes.Year,0x8c);
  205.                                                 HasChange=1;       
  206.                                         }
  207.                                         HasOpera=0;
  208.                                         break;
  209.                         case 2:
  210.                                         TENums[0]=4;
  211.                                         TENums[1]=5;
  212.                                         if(HasOpera==1)
  213.                                         {
  214.                                                 NowTimes.Month+=1;
  215.                                                 if(NowTimes.Month>12){NowTimes.Month=1;}
  216.                                                 T2H(NowTimes.Month,0x88);
  217.                                                 HasChange=1;       
  218.                                         }
  219.                                         if(HasOpera==2)
  220.                                         {
  221.                                                 NowTimes.Month-=1;
  222.                                                 if(NowTimes.Month<1){NowTimes.Month=12;}
  223.                                                 T2H(NowTimes.Month,0x88);
  224.                                                 HasChange=1;       
  225.                                         }
  226.                                         HasOpera=0;
  227.                                         break;
  228.                         case 3:
  229.                                         TENums[0]=6;
  230.                                         TENums[1]=7;
  231.                                         if(HasOpera==1)
  232.                                         {
  233.                                                 NowTimes.Day+=1;
  234.                                                 if(NowTimes.Day>28&&NowTimes.Month==2&&NowTimes.Year%4!=0){NowTimes.Day=1;}
  235.                                                 if(NowTimes.Day>29&&NowTimes.Month==2&&NowTimes.Year%4==0){NowTimes.Day=1;}
  236.                                                 if(NowTimes.Day>30&&(NowTimes.Month==4||NowTimes.Month==6||NowTimes.Month==9||NowTimes.Month==11)){NowTimes.Day=1;}
  237.                                                 if(NowTimes.Day>31){NowTimes.Day=1;}
  238.                                                 T2H(NowTimes.Day,0x86);
  239.                                                 HasChange=1;       
  240.                                         }
  241.                                         if(HasOpera==2)
  242.                                         {
  243.                                                 NowTimes.Day-=1;
  244.                                                 if(NowTimes.Day<1){NowTimes.Day=25;}
  245.                                                 T2H(NowTimes.Day,0x86);
  246.                                                 HasChange=1;       
  247.                                         }
  248.                                         HasOpera=0;
  249.                                         break;
  250.                         case 4:
  251.                                         TENums[0]=8;
  252.                                         TENums[1]=9;
  253.                                         if(HasOpera==1)
  254.                                         {
  255.                                                 NowTimes.Hour+=1;
  256.                                                 if(NowTimes.Hour>23){NowTimes.Hour=0;}
  257.                                                 T2H(NowTimes.Hour,0x84);
  258.                                                 HasChange=1;       
  259.                                         }
  260.                                         if(HasOpera==2)
  261.                                         {
  262.                                                 NowTimes.Hour-=1;
  263.                                                 if(NowTimes.Hour<0){NowTimes.Hour=23;}
  264.                                                 T2H(NowTimes.Hour,0x84);
  265.                                                 HasChange=1;       
  266.                                         }
  267.                                         HasOpera=0;
  268.                                         break;
  269.                         case 5:
  270.                                         TENums[0]=10;
  271.                                         TENums[1]=11;
  272.                                         if(HasOpera==1)
  273.                                         {
  274.                                                 NowTimes.Minute+=1;
  275.                                                 if(NowTimes.Minute>59){NowTimes.Minute=0;}
  276.                                                 T2H(NowTimes.Minute,0x82);
  277.                                                 HasChange=1;       
  278.                                         }
  279.                                         if(HasOpera==2)
  280.                                         {
  281.                                                 NowTimes.Minute-=1;
  282.                                                 if(NowTimes.Minute<0){NowTimes.Hour=59;}
  283.                                                 T2H(NowTimes.Minute,0x82);
  284.                                                 HasChange=1;       
  285.                                         }
  286.                                         HasOpera=0;
  287.                                         break;
  288.                         case 6:
  289.                                         TENums[0]=12;
  290.                                         TENums[1]=13;
  291.                                         if(HasOpera==1)
  292.                                         {
  293.                                                 NowTimes.Second+=1;
  294.                                                 if(NowTimes.Second>59){NowTimes.Second=0;}
  295.                                                 T2H(NowTimes.Second,0x80);
  296.                                                 HasChange=1;       
  297.                                         }
  298.                                         if(HasOpera==2)
  299.                                         {
  300.                                                 NowTimes.Second-=1;
  301.                                                 if(NowTimes.Second<0){NowTimes.Second=59;}
  302.                                                 T2H(NowTimes.Second,0x80);
  303.                                                 HasChange=1;       
  304.                                         }
  305.                                         HasOpera=0;
  306.                                         break;
  307.                         case 7:
  308.                                         TENums[0]=16;
  309.                                         TENums[1]=24;
  310.                                         if(HasOpera==1)
  311.                                         {
  312.                                                 NowTimes.DateString[13]+=1;
  313.                                                 if(NowTimes.DateString[13]>9){NowTimes.DateString[13]=0;}
  314.                                                 T2H(NowTimes.DateString[13],0xc0);
  315.                                                 HasChange=1;       
  316.                                         }
  317.                                         if(HasOpera==2)
  318.                                         {
  319.                                                 NowTimes.DateString[13]-=1;
  320.                                                 if(NowTimes.DateString[13]<0){NowTimes.DateString[13]=9;}
  321.                                                 T2H(NowTimes.DateString[13],0xc0);
  322.                                                 HasChange=1;       
  323.                                         }
  324.                                         HasOpera=0;
  325.                                         break;
  326.                         case 8:
  327.                                         TENums[0]=17;
  328.                                         TENums[1]=24;
  329.                                         if(HasOpera==1)
  330.                                         {
  331.                                                 NowTimes.DateString[14]+=1;
  332.                                                 if(NowTimes.DateString[14]>9){NowTimes.DateString[14]=0;}
  333.                                                 T2H(NowTimes.DateString[14],0xc2);
  334.                                                 HasChange=1;       
  335.                                         }
  336.                                         if(HasOpera==2)
  337.                                         {
  338.                                                 NowTimes.DateString[14]-=1;
  339.                                                 if(NowTimes.DateString[14]<0){NowTimes.DateString[14]=9;}
  340.                                                 T2H(NowTimes.DateString[14],0xc2);
  341.                                                 HasChange=1;       
  342.                                         }
  343.                                         HasOpera=0;
  344.                                         break;
  345.                         case 9:
  346.                                         TENums[0]=18;
  347.                                         TENums[1]=24;
  348.                                         if(HasOpera==1)
  349.                                         {
  350.                                                 NowTimes.DateString[15]+=1;
  351.                                                 if(NowTimes.DateString[15]>9){NowTimes.DateString[15]=0;}
  352.                                                 T2H(NowTimes.DateString[15],0xc4);
  353.                                                 HasChange=1;       
  354.                                         }
  355.                                         if(HasOpera==2)
  356.                                         {
  357.                                                 NowTimes.DateString[15]-=1;
  358.                                                 if(NowTimes.DateString[15]<0){NowTimes.DateString[15]=9;}
  359.                                                 T2H(NowTimes.DateString[15],0xc4);
  360.                                                 HasChange=1;       
  361.                                         }
  362.                                         HasOpera=0;
  363.                                         break;
  364.                         case 10:
  365.                                         TENums[0]=19;
  366.                                         TENums[1]=24;
  367.                                         if(HasOpera==1)
  368.                                         {
  369.                                                 NowTimes.DateString[16]+=1;
  370.                                                 if(NowTimes.DateString[16]>9){NowTimes.DateString[16]=0;}
  371.                                                 T2H(NowTimes.DateString[16],0xc6);
  372.                                                 HasChange=1;       
  373.                                         }
  374.                                         if(HasOpera==2)
  375.                                         {
  376.                                                 NowTimes.DateString[16]-=1;
  377.                                                 if(NowTimes.DateString[16]<0){NowTimes.DateString[16]=9;}
  378.                                                 T2H(NowTimes.DateString[16],0xc6);
  379.                                                 HasChange=1;       
  380.                                         }
  381.                                         HasOpera=0;
  382.                                         break;
  383.                         case 11:
  384.                                         TENums[0]=20;
  385.                                         TENums[1]=24;
  386.                                         if(HasOpera==1)
  387.                                         {
  388.                                                 NowTimes.Week+=1;
  389.                                                 if(NowTimes.Week>7){NowTimes.Week=1;}
  390.                                                 T2H(NowTimes.Week,0x8A);
  391.                                                 HasChange=1;       
  392.                                         }
  393.                                         if(HasOpera==2)
  394.                                         {
  395.                                                 NowTimes.Week-=1;
  396.                                                 if(NowTimes.Week<1){NowTimes.Week=7;}
  397.                                                 T2H(NowTimes.Week,0x8A);
  398.                                                 HasChange=1;       
  399.                                         }
  400.                                         HasOpera=0;
  401.                                         break;
  402.                        
  403.                        
  404.                         default:TENums[0]=24;TENums[1]=25;break;
  405.                 }
  406.                 if(HasChange==0)
  407.                 {
  408.                         Nums[TENums[0]]=10;
  409.                         Nums[TENums[1]]=10;       
  410.                 }
  411.                 if(NowTimes.Second!=Old_Sec&&Old_State)
  412.                 {
  413.                         ReadTemp();
  414.                         SLED=!SLED;
  415.                         HasChange=!HasChange;
  416.                         Old_Sec=NowTimes.Second;
  417.                 }
  418.                 Display(Nums);
  419.                 if(NowTimes.Day!=Old_Day)
  420.                 {
  421.                         DayDiscount();
  422.                         Old_Day=NowTimes.Day;       
  423.                 }
  424.                 Delay(100);
  425.         }
  426. }
复制代码




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

使用道具 举报

沙发
ID:163010 发表于 2017-1-27 16:04 | 只看该作者
51黑有你更精彩
回复

使用道具 举报

板凳
ID:163010 发表于 2017-1-27 16:05 | 只看该作者
经过测试果然能用,万能的51黑啊
回复

使用道具 举报

地板
ID:246583 发表于 2017-11-8 23:08 | 只看该作者
为什么用proteus仿真楼主的电路时四个按键没有用,话说我最近也在做这个时钟,同样也是按键不起作用,不知道是怎么回事
回复

使用道具 举报

5#
ID:247636 发表于 2017-11-10 09:07 来自触屏版 | 只看该作者
课程设计我正在做这个,可是出现了好多自己还不能解决的问题
回复

使用道具 举报

6#
ID:367145 发表于 2018-7-9 09:13 | 只看该作者
非常好的一个作品。楼主真棒
回复

使用道具 举报

7#
ID:338810 发表于 2018-9-28 16:27 | 只看该作者
5黑币,黑币不好弄啊!下载试下功能看如何
回复

使用道具 举报

8#
ID:713966 发表于 2020-4-27 19:06 | 只看该作者
求大神帮助!!能否将倒计时改成阴历月份、日期显示,再加上一个闹钟定时电路,增加K5键?最近在学习你的设计,自己改了倒计时增加农历和闹钟,但程序不知道怎么改,求帮忙,谢谢!!
回复

使用道具 举报

9#
ID:713966 发表于 2020-4-27 19:10 | 只看该作者
求大神帮助!!能否将倒计时改为农历月份、日期的显示,再增加闹钟报警电路和闹钟设置K5键?最近在学习您的设计,自己将倒计时改成农历,增加了闹钟,但是程序不会改啊!求帮助!!谢谢!!!
回复

使用道具 举报

10#
ID:707421 发表于 2020-6-17 18:35 | 只看该作者
为啥我的仿真没有显示
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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