久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3303|回復(fù): 0
收起左側(cè)

基于51單片機(jī)的數(shù)字鬧鐘程序

[復(fù)制鏈接]
ID:262 發(fā)表于 2016-3-11 20:46 | 顯示全部樓層 |閱讀模式
  1. #include<reg52.h>   //頭文件
  2. #include<intrins.h>
  3. #define uchar unsigned char  //宏定義
  4. #define uint unsigned int
  5. //位定義
  6. sbit rs=P2^5;       //液晶位定義     
  7. sbit lcden=P2^7;
  8. sbit s1=P2^0;       //時(shí)間功能切換按鍵
  9. sbit s2=P2^1;       //按鍵加
  10. sbit s3=P2^3;       //按鍵減
  11. sbit s4=P2^4;       //鬧鐘功能切換鍵
  12. sbit rst=P1^5;      //ds1302引腳定義
  13. sbit io=P1^6;
  14. sbit sclk=P1^7;
  15. sbit beep=P3^0;     //蜂鳴器

  16. uchar num,count,shi,fen,miao,s1num,s2num,
  17. year,month,day,week,flag,flag1,year1,month1,
  18. day1,week1,shi1,fen1,miao1,year2,month2,
  19. day2,week2,shi2,fen2,miao2,year5,month5,
  20. day5,week5,shi5,fen5,miao5,wk,ashi,afen;     //參數(shù)定義

  21. uchar code table[]="20  -  -      ";     //液晶固定顯示
  22. uchar code table1[]="  :  :    00:00";
  23. /*
  24. uchar time_dat[7]={12,1,6,6,12,59,59};  //年周月日時(shí)分秒
  25. uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
  26. uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
  27. */
  28. void write_com(uchar com);               //液晶寫指令函數(shù)
  29. void write_data(uchar date);             //液晶寫數(shù)據(jù)函數(shù)
  30. void write_ds1302(uchar add,uchar dat);  //ds1302芯片寫指令函數(shù)
  31. void set_rtc();                          //ds1302時(shí)間設(shè)置函數(shù)
  32. void time_pros();                        //ds1302進(jìn)制轉(zhuǎn)換函數(shù)
  33. void read_rtc();                         //ds1302讀時(shí)間函數(shù)
  34. void alarm();                            //鬧鐘函數(shù)

  35. void delay(uint z)                       //延時(shí)函數(shù)
  36. {
  37.         uint x,y;
  38.         for(x=z;x>0;x--)
  39.                 for(y=110;y>0;y--);
  40. }

  41. void init()                    //初始化
  42. {        
  43.     lcden=0;
  44.      flag=0;
  45.      flag1=0;
  46.         write_com(0x38);
  47.         write_com(0x0c);
  48.         write_com(0x06);
  49.         write_com(0x01);
  50.     write_com(0x80);            //液晶固定顯示,第一行
  51.         for(num=0;num<14;num++)      
  52.         {
  53.                 write_data(table[num]);
  54.                 delay(5);
  55.         }

  56.         write_com(0x80+0x40);      //液晶顯示第二行
  57.         for(num=0;num<20;num++)
  58.         {
  59.             write_data(table1[num]);
  60.                 delay(5);
  61.         }

  62. }

  63. void write_com(uchar com)//1602液晶寫指令
  64. {
  65.         rs=0;
  66.         P0=com;
  67.         delay(5);
  68.         lcden=1;
  69.         delay(5);
  70.         lcden=0;
  71. }

  72. void write_data(uchar date)//1602液晶寫寫數(shù)據(jù)
  73. {
  74.         rs=1;
  75.     P0=date;
  76.         delay(5);
  77.         lcden=1;
  78.         delay(5);
  79.         lcden=0;
  80. }


  81. void write_sfm(uchar add,uchar date)//時(shí)分秒
  82. {
  83.         uchar shi3,ge;
  84.         shi3=date/10;
  85.         ge=date%10;
  86.         write_com(0x80+0x40+add);
  87.         write_data(0x30+shi3);
  88.         write_data(0x30+ge);

  89. }

  90. void write_nyr(uchar ad,uchar date)//年月日
  91. {
  92.         uchar shi4,ge2;
  93.         shi4=date/10;
  94.         ge2=date%10;
  95.         write_com(0x80+ad);
  96.         write_data(0x30+shi4);
  97.         write_data(0x30+ge2);
  98. }


  99. void write_week(uchar wk)  //星期按西方星期設(shè)置  星期天為第一天
  100. {
  101.     write_com(0x80+11);
  102.     switch(wk)
  103.     {
  104.         case 1:     write_data('S');
  105.                     delay(5);
  106.                     write_data('U');
  107.                     delay(5);
  108.                     write_data('N');
  109.                     break;

  110.         case 2:     write_data('M');
  111.                     delay(5);
  112.                     write_data('O');
  113.                     delay(5);
  114.                     write_data('N');
  115.                     break;

  116.         case 3:     write_data('T');
  117.                     delay(5);
  118.                     write_data('U');
  119.                     delay(5);
  120.                     write_data('E');
  121.                     break;

  122.         case 4:     write_data('W');
  123.                     delay(5);
  124.                     write_data('E');
  125.                     delay(5);
  126.                     write_data('D');
  127.                     break;

  128.         case 5:     write_data('T');
  129.                     delay(5);
  130.                     write_data('H');
  131.                     delay(5);
  132.                     write_data('U');
  133.                     break;

  134.         case 6:     write_data('F');
  135.                     delay(5);
  136.                     write_data('R');
  137.                     delay(5);
  138.                     write_data('T');
  139.                     break;

  140.         case 7:     write_data('S');
  141.                     delay(5);
  142.                     write_data('A');
  143.                     delay(5);
  144.                     write_data('T');
  145.                     break;   


  146.     }  

  147. }

  148. void keyscan()              //按鍵函數(shù)
  149. {
  150.     if(s1==0)
  151.     {
  152.         delay(5);
  153.         if(s1==0)
  154.         {
  155.             write_com(0x0f);
  156.             s1num++;   //記錄按鍵次數(shù)
  157.              flag=1;
  158.              flag1=1;
  159.              while(!s1);

  160.              switch(s1num)//光標(biāo)閃爍點(diǎn)定位
  161.              {
  162.                 case 1:write_com(0x80+0x40+6);   //秒
  163.                             break;

  164.                 case 2:write_com(0x80+0x40+3);   //分
  165.                             break;

  166.                 case 3:write_com(0x80+0x40+0);   //時(shí)
  167.                             break;

  168.                 case 4:write_com(0x80+11);       //星期
  169.                             break;  
  170.                 case 5:write_com(0x80+8);        //日
  171.                             break;

  172.                 case 6:write_com(0x80+5);        //月
  173.                             break;

  174.                 case 7:write_com(0x80+2);        //年
  175.                             break;  

  176.                 case 8:s1num=0;
  177.                        write_com(0x0c);//設(shè)置開顯示光標(biāo)不顯示 關(guān)閉時(shí)間設(shè)置
  178.                         set_rtc();
  179.                        flag=0;
  180.                           break;
  181.              }

  182.         }
  183.     }

  184.     if(s1num!=0)                         //按鍵加減
  185.     {
  186.         if(s2==0)                         //加按鍵函數(shù)
  187.         {
  188.             delay(10);
  189.             if(s2==0)
  190.             {

  191.                 while(!s2);
  192.                 switch(s1num) //根據(jù)功能鍵相應(yīng)次數(shù)做出調(diào)節(jié)
  193.                 {
  194.                     case 1:     miao++;                   //秒加
  195.                                 if(miao==60)   
  196.                                     miao=0;
  197.                                  write_sfm(6,miao);
  198.                                  write_com(0x80+0x40+6);
  199.                                  break;

  200.                     case 2:      fen++;                    //分加
  201.                                 if(fen==60)   
  202.                                      fen=0;
  203.                                  write_sfm(3,fen);
  204.                                  write_com(0x80+0x40+3);
  205.                                  break;

  206.                     case 3:     shi++;                     //時(shí)加
  207.                                 if(shi==24)   
  208.                                     shi=0;
  209.                                  write_sfm(0,shi);
  210.                                  write_com(0x80+0x40+0);
  211.                                  break;

  212.                     case 4:     week++;                     //星期加
  213.                                 if(week==8)   
  214.                                     week=1;
  215.                                  write_week(week);
  216.                                  write_com(0x80+11);
  217.                                  break;

  218.                     case 5:     day++;                     //日加
  219.                                 if(day==32)   
  220.                                     day=1;
  221.                                  write_nyr(8,day);
  222.                                  write_com(0x80+8);
  223.                                  break;

  224.                     case 6:     month++;                    //月加
  225.                                 if(month==13)   
  226.                                     month=1;
  227.                                  write_nyr(5,month);
  228.                                  write_com(0x80+5);
  229.                                  break;

  230.                     case 7:     year++;                     //年加
  231.                                 if(year==100)   
  232.                                     year=0;
  233.                                  write_nyr(2,year);
  234.                                  write_com(0x80+2);
  235.                                  break;

  236.                 }

  237.             }

  238.         }

  239.         if(s3==0)                                   //減按鍵函數(shù)同上
  240.         {
  241.             delay(10);
  242.             if(s3==0)
  243.             {
  244.                 while(!s3);
  245.                 switch(s1num) //根據(jù)功能鍵相應(yīng)次數(shù)做出調(diào)節(jié)
  246.                 {
  247.                     case 1:     miao--;
  248.                                 if(miao==-1)   
  249.                                     miao=59;
  250.                                  write_sfm(6,miao);
  251.                                  write_com(0x80+0x40+6);
  252.                                  break;

  253.                     case 2:      fen--;
  254.                                 if(fen==-1)   
  255.                                      fen=59;
  256.                                  write_sfm(3,fen);
  257.                                  write_com(0x80+0x40+3);
  258.                                  break;

  259.                     case 3:     shi--;
  260.                                 if(shi==-1)   
  261.                                     shi=23;
  262.                                  write_sfm(0,shi);
  263.                                  write_com(0x80+0x40+0);
  264.                                  break;

  265.                     case 4:     week--;
  266.                                 if(week==-1)   
  267.                                     week=7;
  268.                                  write_week(week);
  269.                                  write_com(0x80+11);
  270.                                  break;

  271.                     case 5:     day--;
  272.                                 if(day==-1)   
  273.                                     day=31;
  274.                                  write_nyr(8,day);
  275.                                  write_com(0x80+8);
  276.                                  break;

  277.                     case 6:     month--;
  278.                                 if(month==-1)   
  279.                                     month=12;
  280.                                  write_nyr(5,month);
  281.                                  write_com(0x80+5);
  282.                                  break;

  283.                     case 7:     year--;
  284.                                 if(year==-1)   
  285.                                     year=99;
  286.                                  write_nyr(2,year);
  287.                                  write_com(0x80+2);
  288.                                  break;


  289.                 }

  290.             }
  291.         }

  292.     }


  293.     if(s4==0)               //鬧鐘按鍵
  294.     {
  295.         delay(5);
  296.         if(s4==0)
  297.         {
  298.             write_com(0x0f); //光標(biāo)閃爍
  299.             s2num++;   //記錄按鍵次數(shù)
  300.              flag=1;
  301.              while(!s4);
  302.              switch(s2num)//光標(biāo)閃爍點(diǎn)定位
  303.              {
  304.                 case 1:write_com(0x80+0x40+13);   //分
  305.                             break;

  306.                 case 2:write_com(0x80+0x40+10);     //時(shí)
  307.                             break;

  308.                 case 3:write_com(0x0c);             //關(guān)閉鬧鐘設(shè)置
  309.                            flag=0;
  310.                            s2num=0;
  311.                            break;                          

  312.              }

  313.         }
  314.     }

  315.     if(s2num!=0)        //鬧鐘設(shè)置
  316.     {
  317.         if(s2==0)        //鬧鐘加
  318.         {
  319.             delay(10);
  320.             if(s2==0)
  321.             {
  322.                 while(!s2);
  323.                 switch(s2num) //根據(jù)功能鍵相應(yīng)次數(shù)做出調(diào)節(jié)
  324.                 {
  325.                     case 1:     afen++;
  326.                                 if(afen==60)   
  327.                                    afen=0;
  328.                                  write_sfm(13,afen);
  329.                                  write_com(0x80+0x40+13);
  330.                                  break;

  331.                     case 2:     ashi++;
  332.                                 if(ashi==24)   
  333.                                     ashi=0;
  334.                                  write_sfm(10,ashi);
  335.                                  write_com(0x80+0x40+10);
  336.                                  break;

  337.                 }
  338.             }
  339.         }

  340.         if(s3==0)                //鬧鐘減
  341.         {
  342.             delay(10);
  343.             if(s3==0)
  344.             {
  345.                 while(!s3);
  346.                 switch(s2num) //根據(jù)功能鍵相應(yīng)次數(shù)做出調(diào)節(jié)
  347.                 {
  348.                     case 1:      afen--;
  349.                                 if(afen==-1)   
  350.                                      afen=59;
  351.                                  write_sfm(13,afen);
  352.                                  write_com(0x80+0x40+13);
  353.                                  break;

  354.                     case 2:     ashi--;
  355.                                 if(ashi==-1)   
  356.                                     ashi=23;
  357.                                  write_sfm(10,ashi);
  358.                                  write_com(0x80+0x40+10);
  359.                                  break;

  360.                 }
  361.             }
  362.         }

  363.     }
  364. }

  365. void wirte_ds1302_byte(uchar dat)           //ds1302字節(jié)寫
  366. {
  367.     uchar i;
  368.     for(i=0;i<8;i++)
  369.     {
  370.         sclk=0;
  371.         io=dat&0x01;
  372.         dat=dat>>1;
  373.         sclk=1;
  374.     }
  375. }

  376. void write_ds1302(uchar add,uchar dat)        //ds1302寫函數(shù)
  377. {
  378.     rst=0;
  379.     _nop_();// 空操作
  380.     sclk=0;
  381.     _nop_();
  382.     rst=1;
  383.     _nop_();
  384.     wirte_ds1302_byte(add);
  385.     wirte_ds1302_byte(dat);
  386.     rst=0;
  387.     io=1;
  388.     sclk=1;
  389. }

  390. uchar read_ds1302(uchar add)                //ds1302讀函數(shù)
  391. {
  392.     uchar i,value;
  393.     rst=0;
  394.     _nop_();// 空操作
  395.     sclk=0;
  396.     _nop_();
  397.     rst=1;
  398.     _nop_();
  399.     wirte_ds1302_byte(add);
  400.     for(i=0;i<8;i++)
  401.     {   
  402.         value=value>>1;
  403.         sclk=0;
  404.         if(io)
  405.         {
  406.             value=value|0x80;
  407.         }
  408.         sclk=1;
  409.     }
  410.     rst=0;
  411.     _nop_();// 空操作
  412.     sclk=0;
  413.     _nop_();
  414.     sclk=1;
  415.     io=1;
  416.     return value;
  417. }

  418. void set_rtc()                             //ds1302時(shí)間設(shè)置
  419. {   
  420.     write_ds1302(0x8e,0x00);   //關(guān)寫保護(hù)
  421.     year1=year/10;              //轉(zhuǎn)換為十六進(jìn)制
  422.     year=year%10;
  423.     year=year+year1*16;
  424.     write_ds1302(0x8c,year);

  425.     week1=week/10;
  426.     week=week%10;
  427.     week=week+week1*16;
  428.     write_ds1302(0x8a,week);

  429.     month1=month/10;
  430.     month=month%10;
  431.     month=month+month1*16;
  432.     write_ds1302(0x88,month);

  433.     day1=day/10;
  434.     day=day%10;
  435.     day=day+day1*16;
  436.     write_ds1302(0x86,day);

  437.     shi1=shi/10;
  438.     shi=shi%10;
  439.     shi=shi+shi1*16;   
  440.     write_ds1302(0x84,shi);

  441.     fen1=fen/10;
  442.     fen=fen%10;
  443.     fen=fen+fen1*16;
  444.     write_ds1302(0x82,fen);

  445.     miao1=miao/10;
  446.     miao=miao%10;
  447.     miao=miao+miao1*16;
  448.     write_ds1302(0x80,miao);

  449.     write_ds1302(0x8e,0x80);   //開寫保護(hù)
  450.     flag1=0;

  451. }

  452. void read_rtc()                      //從ds1302中讀時(shí)間
  453. {   
  454.         year2=read_ds1302(0x8d);
  455.         week2=read_ds1302(0x8b);
  456.         month2=read_ds1302(0x89);
  457.         day2=read_ds1302(0x87);
  458.         shi2=read_ds1302(0x85);
  459.         fen2=read_ds1302(0x83);
  460.         miao2=read_ds1302(0x81);

  461. }

  462. void time_pros()                      //從ds1302中讀出的時(shí)間轉(zhuǎn)換為十進(jìn)制
  463. {

  464.      year5=year2/16;     
  465.      year2=year2%16;
  466.      year2=year2+year5*10;

  467.      month5=month2/16;
  468.      month2=month2%16;
  469.      month2=month2+month5*10;

  470.      day5=day2/16;
  471.      day2=day2%16;
  472.      day2=day2+day5*10;

  473.      shi5=shi2/16;
  474.      shi2=shi2%16;
  475.      shi2=shi2+shi5*10;

  476.      fen5=fen2/16;
  477.      fen2=fen2%16;
  478.      fen2=fen2+fen5*10;

  479.      miao5=miao2/16;
  480.      miao2=miao2%16;
  481.      miao2=miao2+miao5*10;




  482. }

  483. void display()                        //顯示函數(shù)
  484. {
  485.      write_sfm(6,miao2);
  486.      write_com(0x80+0x40+6);

  487.      write_sfm(3,fen2);
  488.      write_com(0x80+0x40+3);

  489.      write_sfm(0,shi2);
  490.      write_com(0x80+0x40+0);

  491.      write_week(week2);
  492.      write_com(0x80+11);

  493.      write_nyr(8,day2);
  494.      write_com(0x80+8);

  495.      write_nyr(5,month2);
  496.      write_com(0x80+5);

  497.      write_nyr(2,year2);
  498.      write_com(0x80+2);

  499.      if((ashi==shi2)&&(afen==fen2))
  500.      {
  501.         alarm();
  502.      }

  503. }

  504. void alarm()   //    鬧鐘
  505. {
  506.     beep=0;
  507.     delay(1000);
  508.     beep=1;

  509. }


  510. void main()                   //主函數(shù)
  511. {
  512.         init();                   //初始化
  513.     while(1)
  514.     {   
  515.         keyscan();            //按鍵函數(shù)

  516.         if(flag==0)
  517.         {
  518.             keyscan();         
  519.             read_rtc();
  520.             time_pros();
  521.             display();
  522.         }

  523.     }

  524. }



復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区在线视频 | 国产偷录视频叫床高潮对白 | 亚洲成人综合社区 | 日韩欧美精品在线 | 亚洲网站在线播放 | 久久精品视频99 | 成人影院在线视频 | 黄色一级电影在线观看 | 婷婷久久五月天 | 国产精品69毛片高清亚洲 | 一道本不卡 | 日韩在线中文 | 精品久久久久久国产 | 神马九九 | 国产精品久久9 | 两性午夜视频 | 日韩精品一区二区三区在线播放 | 亚洲三级在线 | 亚洲一区在线日韩在线深爱 | 午夜精品一区二区三区在线观看 | 久久久久国产精品 | 午夜男人免费视频 | 影音先锋成人资源 | 亚洲精品一区二区三区中文字幕 | 日韩在线小视频 | 日本天堂一区 | 日韩精品久久一区二区三区 | 欧美国产日韩精品 | 亚洲精品久久视频 | 欧美日韩亚洲一区 | 国产精品久久久久久久久图文区 | 一区二区三区免费在线观看 | 狠狠做深爱婷婷综合一区 | 国产一区二区在线视频 | 国产精品99久久久久久久久久久久 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 久久精品国产久精国产 | 久久精品中文字幕 | 性色av一区二区三区 | 99视频免费 | 免费国产视频在线观看 |