找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机定时开关且定时放乐电子钟

[复制链接]
跳转到指定楼层
楼主
ID:71259 发表于 2014-12-29 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


  1. ///////////////////////////////////////////////////////////////////
  2. /*名称:单片机定时开关且定时放乐电子钟,                                  /
  3. /*作者:周光明                                                    /
  4. /*时间:2010年12月6日                                             /
  5. /*功能:                                                          /
  6. /*                                                                /
  7. /*                                                                /
  8. ///////////////////////////////////////////////////////////////////*/
  9. #include <reg52.h>
  10. #include "ds1302.c"          //ds1302芯
  11. #include "lanhuacao.c"       //兰花草音乐
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. #define sjck P0
  15. #define wei P2
  16. #define hua 0xf7
  17. #define ds_o 0xa3          ///o
  18. #define ds_n 0xab         ///n
  19. #define ds_f 0x8e         ///f
  20. #define xds 0xc0          //写DS1302初地址
  21. #define dds 0xc1          //读初值地址

  22. uchar rem[8]={0,1,10,3,4,10,6,7};
  23. uchar remds[6][2]={
  24.                     {0x00,0x00},                  
  25.                     {0x00,0x00},     
  26.         {0x00,0x00},                 
  27.                     {0x00,0x00},
  28.      {0x00,0x00},                  
  29.                     {0x00,0x00},
  30.          };
  31. uchar code bcd[15]={0xc0,0xf9,0xa4,0xb0,
  32.                     0x99,0x92,0x82,0xf8,
  33.      0x80,0x90,0xbf,0xff,
  34.      0xa3,0xab,0x8e};

  35. uchar ii,moshi,moshi_h,tiao,time_1;
  36. uint tt,tt1,msgl;
  37. bit aj_1,shan_1,ds_1,ds_2,qr_1;

  38. sbit jidianqi=P3^0;

  39. sbit e=P3^3;

  40. sbit SB0=P1^0;
  41. sbit SB1=P1^1;
  42. sbit SB2=P1^2;
  43. sbit SB3=P1^3;
  44. sbit SB4=P1^4;

  45. sbit dsd0=P0^7;

  46. /******************延时*********************/
  47. yanshi(uint t)
  48. {
  49. while(t--);
  50. }
  51. //////////////////////////////////////////////
  52. /******************显示*********************/
  53. xianshi(uint t)
  54. {
  55.   sjck=0xff;
  56.   e=0;
  57.   e=1;
  58.   if(shan_1)
  59.        {
  60.         if(moshi==0)
  61.               {
  62.          if(ii==2)ii++;//时间显示时横杠闪烁
  63.       if(ii==5)ii++;
  64.          }
  65.      if(tiao<9)
  66.              {
  67.        if(ii==tiao)ii=ii+2;//闪烁调整位
  68.         }
  69.      }

  70.      wei=~(0x01<<ii);               //段选

  71.   sjck=bcd[rem[ii]];
  72.   if(ii==0)if(ds_1)dsd0=0;//定时开灯亮否
  73.   e=0;
  74.   e=1;
  75.      ii++;
  76.      if(ii>7)ii=0;
  77.   yanshi(t);
  78. }
  79. ////////////////////////////////////////////////
  80. /////////////////////////////////////
  81. yinyue(uint x,uint y)
  82. {
  83. uint i;
  84. for(i=0;i<y;i++)
  85.     {
  86.   yue=~yue;
  87.   xianshi(x);
  88.   yue=1;
  89.   }
  90. }
  91. /******************显示111*********************/
  92. /******************读时间膀*********************/
  93. dushijian()
  94. {
  95. uchar time;
  96. time=duds1302(dumiao);
  97. rem[0]=time&0x0f;
  98. rem[1]=time>>4;
  99. time=duds1302(dufen);
  100. rem[3]=time&0x0f;
  101. rem[4]=time>>4;
  102. time=duds1302(dushi);
  103. rem[6]=time&0x0f;
  104. rem[7]=time>>4;
  105. rem[2]=10;
  106. }
  107. /******************读年月日*********************/
  108. dunianyueri()
  109. {
  110. uchar time;
  111. time=duds1302(duri);
  112. rem[0]=time&0x0f;
  113. rem[1]=time>>4;
  114. time=duds1302(duyue);
  115. rem[3]=time&0x0f;
  116. rem[4]=time>>4;
  117. time=duds1302(dunian);
  118. rem[6]=time&0x0f;
  119. rem[7]=time>>4;
  120. }
  121. ///////////////////////////////////////////写时间
  122. xieshijian()
  123. {
  124.                   xieds1302(baohu,0x00);
  125.       time_1=(rem[1]<<4)+rem[0];
  126.       xieds1302(xiemiao,time_1);
  127.                   time_1=(rem[4]<<4)+rem[3];
  128.       xieds1302(xiefen,time_1);
  129.                   time_1=(rem[7]<<4)+rem[6];
  130.       xieds1302(xieshi,time_1);
  131.       xieds1302(baohu,0x80);
  132. }
  133. ///////////////////////////////////////////写年月日
  134. xienianyueri()
  135. {
  136.                   xieds1302(baohu,0x00);
  137.       time_1=(rem[1]<<4)+rem[0];
  138.       xieds1302(xieri,time_1);
  139.                   time_1=(rem[4]<<4)+rem[3];
  140.       xieds1302(xieyue,time_1);
  141.                   time_1=(rem[7]<<4)+rem[6];
  142.       xieds1302(xienian,time_1);
  143.       xieds1302(baohu,0x80);
  144. }
  145. /******************?********************/

  146. /////////////////////////////////////////////////////////
  147. anjian()
  148. {
  149. P1=0xff;
  150. if(P1==0xff)aj_1=1;
  151.   if(aj_1)
  152.        {
  153.           if(SB0==0)                         //模式
  154.      {
  155.       yinyue(10,10);
  156.       aj_1=0;
  157.       if(SB0==0)                                  //模式键按下
  158.          {
  159.        msgl=0;
  160.        tiao=9;
  161.        while(SB0==0)yinyue(2,50);
  162.        moshi++;
  163.        if(moshi>7)moshi=0;
  164.        }
  165.       }
  166.           if(SB1==0)                                  //调整位键9 6 3 0 位
  167.      {
  168.       yinyue(20,30);
  169.       aj_1=0;
  170.       if(SB1==0)
  171.          {
  172.       msgl=0;
  173.        while(SB1==0)yinyue(2,30);;
  174.        tiao=tiao+3;
  175.        if(tiao>9)tiao=0;
  176.        }
  177.       }
  178.    if(SB2==0)                              //加法
  179.      {
  180.       yinyue(10,20);
  181.       aj_1=0;
  182.       if(SB2==0)
  183.          {
  184.       msgl=0;
  185.        while(SB2==0)yinyue(2,60);
  186.        rem[tiao]++;
  187.        if(rem[tiao]>9)
  188.              {
  189.        rem[tiao]=0;
  190.        rem[tiao+1]++;
  191.        if(rem[tiao+1]>=6)rem[tiao+1]=0;
  192.           }
  193.        }
  194.       }
  195.    if(SB3==0)
  196.      {
  197.       yinyue(3,50);                      /////减法
  198.       aj_1=0;
  199.       if(SB3==0)
  200.          {
  201.        while(SB3==0)yinyue(2,34);
  202.        if(rem[tiao]==0)
  203.              {
  204.        msgl=0;
  205.        if(rem[tiao+1]==0){rem[tiao]=9;rem[tiao+1]=5;}
  206.        else
  207.            {
  208.          rem[tiao+1]--;
  209.             rem[tiao]=9;
  210.         }
  211.           }
  212.      else rem[tiao]--;
  213.        }
  214.       }
  215.    if(SB4==0)                                   //定时器开
  216.      {
  217.       yinyue(2,20);
  218.       aj_1=0;
  219.       if(SB4==0)
  220.          {
  221.       msgl=0;
  222.        while(SB4==0)yinyue(2,15);
  223.        ds_1=~ds_1;                        //定时标志取反;
  224.        }
  225.       }

  226.   }
  227. }
  228. ////////////////////////////////////////////////////////读定时到显存
  229. dudingshi(uchar m)
  230. {
  231. rem[0]=m;
  232. rem[2]=12;                     //ds_o;
  233. m--;
  234. if(m%2==0)rem[1]=13;           //ds_n;
  235. else rem[1]=14;                //ds_f;
  236. rem[3]=remds

  237. --[0]&0x0f;                //取分低位到显存
  238. rem[4]=remds

  239. -[0]>>4;                  //取分高位
  240. rem[6]=remds

  241. -[1]&0x0f;                //取时低位
  242. rem[7]=remds

  243. -[1]>>4;                  //取时高位到显存
  244. }
  245. ////////////////////////////////////////////////////////////////
  246. xiedingshi(uchar m)
  247. {
  248.   uchar n;
  249.   remds

  250. -[0]=rem[3]+(rem[4]<<4);
  251.   remds

  252. -[1]=rem[6]+(rem[7]<<4);                  //从DS1302  0xc0 开始,xds 带表0xc0
  253.   n=xds+(m*4);
  254.   xieds1302(baohu,0x00);          //开保护
  255.   xieds1302(n,remds

  256. -[0]);        //写第一个数据
  257.   n=n+2;
  258.   xieds1302(n,remds

  259. --[1]);         //写第二个数据
  260.   xieds1302(baohu,0x80);
  261. }
  262. ////////////////////////读取定时数据到存储器
  263. duchudingshi()
  264. {
  265.   uchar i,m;
  266.   m=dds;
  267.   for(i=0;i<6;i++)
  268.       {
  269.     remds[i][0]=duds1302(m);
  270.     m=m+2;
  271.     remds[i][1]=duds1302(m);
  272.     m=m+2;
  273.     }
  274. }

  275. //////////////////////////////////////////////////////////////////
  276. dingshipanduan()
  277. {
  278. uchar i,temp,temp1;
  279.    temp=rem[3]+(rem[4]<<4);
  280.    temp1=rem[6]+(rem[7]<<4);
  281.    for(i=0;i<6;i++)
  282.        {
  283.       if(temp==remds[i][0])
  284.                    {
  285.      if(temp1==remds[i][1])
  286.                         {
  287.        if(remds[i][0]==0x00){if(remds[i][1]==0x00)goto loop;}
  288.                          else
  289.            {
  290.          if(i%2==0)jidianqi=0;
  291.          else jidianqi=1;
  292.          if(ds_2==0)if(rem[0]==0)if(rem[1]==0)ds_2=1;//音乐标志位置1
  293.          }
  294.           loop: xianshi(1);
  295.             }
  296.        }
  297.      }
  298.      
  299. }
  300. //////////////////////////////////////////////////////////////
  301. zhengdian()
  302. {
  303. if(rem[0]==0)
  304.     if(rem[1]==0)if(rem[2]==0)if(rem[3]==0)ds_2=1;
  305. }
  306. /******************主程序111*********************////////////////
  307. //////////////////////////////////////////////////////////////////
  308. void main(void)
  309. {                       
  310.    tiao=9;
  311.    duchudingshi();//从DS1302读出到存储器
  312.    yue=1;
  313.    jidianqi=1;
  314.    ds_1=0;
  315. while(1)
  316.      {
  317.    anjian();
  318.    if(tiao==9)
  319.      {
  320.     if(moshi>1)dudingshi(moshi-1);//读定时到显存
  321.     switch(moshi)
  322.        {
  323.      case 0: dushijian();break;   ///////读时间
  324.         case 1: dunianyueri();break; /////度年月日
  325.      default:break;
  326.     }
  327.      }
  328.    else
  329.        {
  330.       if(moshi>1)xiedingshi(moshi-2);   //写定时到定时存储器,写到DS1302  
  331.        switch(moshi)
  332.              {
  333.            case 0:xieshijian();break;  ///写时间
  334.            case 1:xienianyueri();break;////写年月日
  335.      default:break;
  336.        }
  337.           }   
  338.    xianshi(20);
  339.    if(ds_1)  { if(moshi==0)dingshipanduan();                      //zhengdian();
  340.     }
  341.       else jidianqi=1;                                //否则继电器关
  342.    if(ds_2){fangyinyue();ds_2=0;}
  343.    tt++;
  344.    if(tt>500)
  345.     {
  346.      tt=0;
  347.   shan_1=~shan_1;                    //闪烁标志取反
  348.      msgl++;                      //按键按下时模式归零计数器
  349.      if(msgl>20)
  350.          {
  351.        msgl=0;
  352.        if(moshi!=0)moshi=0; //模式不等于零时归零
  353.        if(tiao!=9)tiao=9;   //调整不等于9时归九
  354.        rem[2]=10;           //
  355.        }
  356.      }
  357.    }
  358. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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