找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机万年历电路图&PCB图

[复制链接]
跳转到指定楼层
楼主



万年历电路图&PCB图.zip (702.87 KB, 下载次数: 33)
万年历(51程序).zip (64.73 KB, 下载次数: 24)

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ds1302_sec_add                        0x80                //秒数据地址
  6. #define ds1302_min_add                        0x82                //分数据地址
  7. #define ds1302_hr_add                        0x84                //时数据地址
  8. #define ds1302_date_add                        0x86                //日数据地址
  9. #define ds1302_month_add                0x88                //月数据地址
  10. #define ds1302_day_add                        0x8a                //星期数据地址
  11. #define ds1302_year_add                        0x8c                //年数据地址
  12. #define ds1302_control_add                0x8e                //控制数据地址
  13. #define ds1302_charger_add                0x90                                          
  14. #define ds1302_clkburst_add                0xbe

  15. sbit LCD_RS=P2^0;
  16. sbit LCD_RW=P2^1;
  17. sbit LCD_E =P2^2;
  18. sbit DS_CLK=P1^0;
  19. sbit DS_IO =P1^1;
  20. sbit DS_RES=P1^2;
  21. sbit Key_Clock=P1^4;
  22. sbit Key_Set=P1^5;
  23. sbit Key_up=P1^6;
  24. sbit Key_down=P1^7;
  25. sbit fengmingqi=P1^3;
  26. sbit DQ   =P3^3;

  27. uchar warning_tem[4]=0;
  28. uchar time_buf[10];
  29. uchar time_buf1[10];
  30. uchar time_buf2[20];
  31. uchar temp_buf[7];
  32. uchar taozhong_buf[6]={0};
  33. uchar anjianzhi=0;
  34. uchar time1_jishu1=0;
  35. uchar time_jishu2=0;
  36. ///////////////////////
  37. uchar DS18B20_Mode=0;
  38. uchar Clock_Mode=0;
  39. uchar Set_Mode=0;
  40. uchar forbid_Tem=0;
  41. uchar guang_wei=0;
  42. uchar guang_wei2=0;
  43. uchar nao_change_wei=0;
  44. uint  fengmingqi_jishi=0;
  45. uchar time_view1=2;
  46. uchar time_view2=0;

  47. void delay_1ms(int delay);          //毫秒延迟
  48. void delay_1us(int delay_us); //微妙延迟
  49. void delay(uint i);           //18B20所用延迟
  50. void Write_Dat_1602(uchar Dat_1602);               //1602数据写入
  51. void Write_Com_1602(uchar Com_1602);               //1602命令写入
  52. void ds1302_read_time(void);                               //1302读取温度
  53. uchar ds1302_read_byte(uchar addr);                       //1302单字节读取
  54. void ds1302_write_byte(uchar addr, uchar Dat);  //1302单字节写入
  55. void ds1302_write_time(void);                               //1302时间写入
  56. void ds1302_read_time(void);                                   //1302时间读取
  57. void Init_1602();                                                           //1602初始化
  58. void Init_DS18B20(void);                                                   //18b20初始化
  59. uchar ReadOneChar(void);                                                   //18b20单字节读
  60. void WriteOneChar(unsigned char dat);                   //18b20单字节写
  61. void ChangeTemperature(void);
  62. uint ReadTemperature(void);                                           //18b20读取温度
  63. void Time_View();                                                           //
  64. void Temp_View();                                                           //
  65. void naozhong_View();
  66. void tiaoshi_view();

  67. void Init_1302()
  68. {
  69.     DS_RES=0;               
  70.         DS_CLK=0;
  71. }

  72. void main()
  73. {fengmingqi=1;
  74. warning_tem[0]=' ';
  75. warning_tem[1]=3;
  76. warning_tem[2]=0;
  77. TMOD=0X11;
  78. ET0=1;
  79. ET1=1;
  80. EA=1;
  81. TH0=(65536-10000)/256;         //10ms
  82. TL0=(65536-10000)%256;
  83. TH1=(65536-50000)/256;         //50ms
  84. TL1=(65536-50000)%256;
  85. Init_1302();
  86. Init_1602();
  87. Time_View();
  88. TR0=1;
  89. TR1=1;
  90. while(1)
  91.   {if(anjianzhi!=0)
  92.      {
  93.           ///////////////////////////////
  94.           if(anjianzhi==8&&Set_Mode==0)
  95.            {if(Clock_Mode==0)
  96.              {Clock_Mode=1;
  97.               TR1=0;
  98.                   guang_wei=0x09;
  99.                   Write_Com_1602(0X01);
  100.                   delay_1ms(5);
  101.                   Write_Com_1602(0x0f);
  102.                   nao_change_wei=1;
  103.                   naozhong_View();
  104.                  }
  105.             else
  106.              {TR1=1;
  107.                   Write_Com_1602(0x0c);
  108.                   Write_Com_1602(0X01);
  109.                   delay_1ms(5);
  110.                   Clock_Mode=0;
  111.                   guang_wei=0x80;
  112.                   guang_wei2=0;
  113.                  }
  114.            }
  115.         /////////////////////////////////////////////////
  116.           if(anjianzhi==4)
  117.             {  
  118.                    if(Clock_Mode==1)
  119.                      {
  120.                            if(guang_wei2==0x0b)
  121.                              {guang_wei=0x06;nao_change_wei=0;guang_wei2=0;}
  122.                            if(nao_change_wei>3)
  123.                              {nao_change_wei++;
  124.                               guang_wei2++;
  125.                              }
  126.                        if(nao_change_wei==3)
  127.                              {guang_wei2=0x09;                                         
  128.                               nao_change_wei++;
  129.                              }
  130.                            if(nao_change_wei<3)
  131.                             {
  132.                               guang_wei+=3;
  133.                                   nao_change_wei++;
  134.                                 }                                         
  135.                           naozhong_View();
  136.                          }

  137.                    else
  138.                      {  
  139.                           switch(Set_Mode)
  140.                            {case  0:TR1=0;Write_Com_1602(0X01);delay_1ms(5);Write_Com_1602(0x0f);guang_wei=0x83;Set_Mode++;break;
  141.                                    case  1:guang_wei=0x86;Set_Mode++;break;
  142.                                    case  2:guang_wei=0x89;Set_Mode++;break;
  143.                                    case  3:guang_wei=0x8b;Set_Mode++;break;
  144.                                 case  4:guang_wei=0x80+0x41;Set_Mode++;break;
  145.                                 case  5:guang_wei=0x80+0x44;Set_Mode++;break;
  146.                                 case  6:guang_wei=0x80+0x47;Set_Mode++;break;
  147.                                 case 7:TR1=1;Set_Mode=0;
  148.                                         Write_Com_1602(0x0c);
  149.                                                 ds1302_write_time();
  150.                                                  break;
  151.                            }                                                                           
  152.                          tiaoshi_view();
  153.                          }
  154.                 }
  155.            //////////////////////////////////////////////////////////////
  156.           if(anjianzhi==2&&(Clock_Mode==1||Set_Mode!=0))
  157.             {
  158.                  if(Clock_Mode==1)
  159.                   {if(nao_change_wei==1)
  160.                     {
  161.                           if(taozhong_buf[0]*10+taozhong_buf[1]<23)
  162.                               { taozhong_buf[1]+=1;
  163.                                   if(taozhong_buf[1]==10&&taozhong_buf[0]<2)
  164.                                      {taozhong_buf[1]=0;taozhong_buf[0]+=1;}
  165.                                 }
  166.                         }
  167.                    if(nao_change_wei==2)
  168.                     { if(taozhong_buf[2]*10+taozhong_buf[3]<59)
  169.                                   taozhong_buf[3]+=1;
  170.                                 if(taozhong_buf[3]==10&&taozhong_buf[2]<6)
  171.                                   {taozhong_buf[3]=0;taozhong_buf[2]+=1;}
  172.                     }
  173.                   if(nao_change_wei==3)
  174.                     { if(taozhong_buf[4]*10+taozhong_buf[5]<59)
  175.                                   taozhong_buf[5]+=1;
  176.                                 if(taozhong_buf[5]==10&&taozhong_buf[4]<6)
  177.                                   {taozhong_buf[5]=0;taozhong_buf[4]+=1;}
  178.                         
  179.                         }
  180.                   if(nao_change_wei==4)
  181.                    {
  182.                     if(warning_tem[0]==' ')
  183.                            warning_tem[0]='-';
  184.                          else
  185.                            warning_tem[0]=' ';
  186.                         }
  187.                   if(nao_change_wei==5)
  188.                     {if(warning_tem[1]<10)
  189.                            warning_tem[1]+=1;
  190.                         }
  191.                   if(nao_change_wei==6)
  192.                     {if(warning_tem[2]<10)
  193.                            warning_tem[2]+=1;
  194.                         }                                   
  195.                    naozhong_View();
  196.                   }
  197.                  else
  198.                    {
  199.                     switch(Set_Mode)
  200.                        {
  201.                            case  1: {if(time_buf2[3]*10+time_buf2[4]<99)
  202.                                        time_buf2[4]+=1;
  203.                                                   if(time_buf2[4]==10&&time_buf2[3]<9)
  204.                                                     {time_buf2[4]=0;time_buf2[3]+=1;}
  205.                                                          break;}
  206.                                    case  2:{if(time_buf2[5]*10+time_buf2[6]<12)
  207.                                        time_buf2[6]+=1;
  208.                                                   if(time_buf2[6]==10&&time_buf2[5]<1)
  209.                                                     {time_buf2[6]=0;time_buf2[5]+=1;}
  210.                                                          break;}
  211.                                    case  3:{if(time_buf2[7]*10+time_buf2[8]<31)
  212.                                        time_buf2[8]+=1;
  213.                                                   if(time_buf2[8]==10&&time_buf2[7]<3)
  214.                                                     {time_buf2[8]=0;time_buf2[7]+=1;}
  215.                                                          break;}
  216.                                    case  4:{if(time_buf2[18]<7)
  217.                                        time_buf2[18]+=1;
  218.                                                         break;}
  219.                                    case  5:{if(time_buf2[12]*10+time_buf2[13]<23)
  220.                                         { time_buf2[13]+=1;
  221.                                             if(time_buf2[13]==10&&time_buf2[12]<2)
  222.                                           {time_buf2[13]=0;time_buf2[12]+=1;}
  223.                                           }
  224.                                                   break;
  225.                                         }                                       
  226.                                 case  6:{if(time_buf2[14]*10+time_buf2[15]<59)
  227.                                         { time_buf2[15]+=1;
  228.                                             if(time_buf2[15]==10&&time_buf2[14]<6)
  229.                                           {time_buf2[15]=0;time_buf2[14]+=1;}
  230.                                           }
  231.                                                   break;
  232.                                         }        
  233.                                 case  7:{if(time_buf2[17]*10+time_buf2[16]<59)
  234.                                          time_buf2[16]+=1;
  235.                                             if(time_buf2[17]==10&&time_buf2[16]<6)
  236.                                           {time_buf2[17]=0;time_buf2[16]+=1;}
  237.                                                   break;
  238.                                         }                                                
  239.                            }
  240.                            tiaoshi_view();
  241.                            }
  242.                          }
  243.                 //////////////////////////////////////////////////////////////////
  244.           if(anjianzhi==1&&(Clock_Mode==1||Set_Mode!=0))
  245.             {if(Clock_Mode==1)
  246.                    {switch(nao_change_wei)
  247.                      {case 1:{if(taozhong_buf[1]>0)
  248.                                 taozhong_buf[1]=taozhong_buf[1]-1;
  249.                                   if(taozhong_buf[1]==9&&taozhong_buf[0]>0)
  250.                                     {taozhong_buf[1]-=1;}
  251.                                           break;
  252.                                          }

  253.                           case 2:{if(taozhong_buf[3]>0)
  254.                                 taozhong_buf[3]=taozhong_buf[3]-1;
  255.                                   if(taozhong_buf[3]==9&&taozhong_buf[2]>0)
  256.                                     {taozhong_buf[3]-=1;}
  257.                                           break;
  258.                                          }
  259.                           case 3:{if(taozhong_buf[5]>0)
  260.                                 taozhong_buf[5]=taozhong_buf[5]-1;
  261.                                   if(taozhong_buf[5]==9&&taozhong_buf[4]>0)
  262.                                     {taozhong_buf[5]-=1;}
  263.                                           break;
  264.                                          }
  265.                           case 5:{if(warning_tem[1]>0)
  266.                                 warning_tem[1]-=1;
  267.                                           break;
  268.                                          }
  269.                           case 6:{if(warning_tem[2]>0)
  270.                                 warning_tem[2]-=1;
  271.                                           break;
  272.                                          }
  273.                          }
  274.                    naozhong_View();
  275.                    }
  276.                  else
  277.                    {
  278.                      switch(Set_Mode)
  279.                        {case  1:{if(time_buf2[4]>0)
  280.                                      time_buf2[4]-=1;
  281.                                                 if(time_buf2[4]==0&&time_buf2[3]>0)
  282.                                                   {time_buf2[4]=9;time_buf2[3]-=1;}
  283.                                                         break;}
  284.                                    case  2:{if(time_buf2[6]>0)
  285.                                       time_buf2[6]-=1;
  286.                                                 if(time_buf2[6]==0&&time_buf2[5]>0)
  287.                                                   {time_buf2[6]=9;time_buf2[5]-=1;}
  288.                                                         break;}
  289.                                    case  3:{if(time_buf2[8]>0)
  290.                                       time_buf2[8]-=1;
  291.                                                 if(time_buf2[8]==0&&time_buf2[7]>0)
  292.                                                   {time_buf2[8]=9;time_buf2[7]-=1;}
  293.                                                         break; }
  294.                                    case  4:{if(time_buf2[18]>0)
  295.                                           time_buf2[18]-=1;        }
  296.                                    case  5:{if(time_buf2[13]>0)
  297.                                       time_buf2[13]-=1;
  298.                                                 if(time_buf2[13]==0&&time_buf2[12]>0)
  299.                                                   {time_buf2[13]=9;time_buf2[12]-=1;}
  300.                                                         break;}                                       
  301.                                 case  6:{if(time_buf2[15]>0)
  302.                                       time_buf2[15]-=1;
  303.                                                 if(time_buf2[15]==0&&time_buf2[14]>0)
  304.                                                   {time_buf2[15]=9;time_buf2[14]-=1;}
  305.                                                         break;}
  306.                                 case  7:{if(time_buf2[17]>0)
  307.                                       time_buf2[17]-=1;
  308.                                                 if(time_buf2[17]==0&&time_buf2[16]>0)
  309.                                                   {time_buf2[17]=9;time_buf2[16]-=1;}
  310.                                                         break;}
  311.                                  
  312.                            }                  
  313.                              tiaoshi_view();
  314.                          }
  315.                    }
  316.                    anjianzhi=0;
  317.                 }
  318.          }
  319.   }


  320. void naozhong_View()
  321. {uchar i;
  322. Write_Com_1602(0x80);
  323. Write_Dat_1602('C');
  324. Write_Dat_1602('l');
  325. Write_Dat_1602('o');
  326. Write_Dat_1602('_');
  327. Write_Dat_1602('S');
  328. Write_Dat_1602('e');
  329. Write_Dat_1602('t');
  330. Write_Dat_1602(' ');
  331. for(i=0;i<6;i++)
  332.   {Write_Dat_1602(taozhong_buf[i]+48);
  333.    if(i==1||i==3)
  334.     Write_Dat_1602(':');
  335.   }
  336. Write_Com_1602(0x80+0x40);
  337. Write_Dat_1602('T');
  338. Write_Dat_1602('e');
  339. Write_Dat_1602('m');
  340. Write_Dat_1602('_');
  341. Write_Dat_1602('S');
  342. Write_Dat_1602('e');
  343. Write_Dat_1602('t');
  344. Write_Dat_1602(' ');
  345. Write_Dat_1602(' ');
  346. Write_Dat_1602(warning_tem[0]);
  347. Write_Dat_1602(warning_tem[1]+48);
  348. Write_Dat_1602(warning_tem[2]+48);
  349. Write_Dat_1602('.');
  350. Write_Dat_1602(warning_tem[3]+48);
  351. Write_Dat_1602(0xdf);
  352. Write_Dat_1602('C');
  353. if(Clock_Mode==1)
  354.    {if(guang_wei2==0)
  355.      Write_Com_1602(0x80+guang_wei);
  356.            else
  357.          Write_Com_1602(0x80+0x40+guang_wei2);
  358.    }
  359. }

  360. void time0() interrupt 1
  361. {uchar anjian=0;
  362. TR0=0;
  363. TH0=(65536-10000)/256;
  364. TL0=(65536-10000)%256;
  365. if(Key_Clock==0||Key_Set==0||Key_up==0||Key_down==0)//有按键按下
  366.   {
  367.     delay_1ms(12);
  368.     if(Key_Clock==0||Key_Set==0||Key_up==0||Key_down==0)//有按键按下
  369.       {anjian=P1&0xf0;
  370.         switch(anjian)
  371.              {case 0xe0:anjianzhi=8;break;         //闹钟键按下
  372.               case 0xd0:anjianzhi=4;break;         //设置键按下
  373.               case 0xb0:anjianzhi=2;break;         //上调移键按下
  374.               case 0x70:anjianzhi=1;break;         //下调键按下
  375.              }

  376.      }
  377.   }
  378. while(Key_Clock==0||Key_Set==0||Key_up==0||Key_down==0);            
  379. TR0=1;
  380. }

  381. void time1() interrupt 3
  382. {uchar m,i;
  383. TR1=0;
  384. TH1=(65536-50000)/256;
  385. TL1=(65536-50000)%256;
  386. if(time1_jishu1<3)
  387.   time1_jishu1++;
  388. else
  389.   {time1_jishu1=0;
  390.    Time_View();
  391.   }
  392. if(time_jishu2<13)
  393.    time_jishu2++;
  394. else
  395.    {time_jishu2=0;
  396.      if(forbid_Tem==0)
  397.          {
  398.          if(DS18B20_Mode==0)
  399.        {
  400.             ChangeTemperature();
  401.                DS18B20_Mode=1;
  402.            }
  403.           else  
  404.            {Temp_View();
  405.                 DS18B20_Mode=0;
  406.    if(warning_tem[0]=='-'&&temp_buf[0]!='-')
  407.       {fengmingqi=0;fengmingqi_jishi=0;}
  408.    if((warning_tem[0]!='-'&&temp_buf[0]!='-')&&(warning_tem[1]*10+warning_tem[2]<=(temp_buf[1]-48)*10+(temp_buf[2]-48)))
  409.       {fengmingqi=0;fengmingqi_jishi=0;
  410.           }
  411.    if((warning_tem[0]=='-'&&temp_buf[0]=='-')&&(warning_tem[1]*10+warning_tem[2]>=(temp_buf[1]-48)*10+(temp_buf[2]-48)))
  412.       {fengmingqi=0;fengmingqi_jishi=0;}           
  413.          }        //温度报警
  414.    }
  415.    }
  416. if(   taozhong_buf[0]==time_buf2[12]&&        //时间报警
  417.            taozhong_buf[1]==time_buf2[13]&&
  418.            taozhong_buf[2]==time_buf2[14]&&
  419.            taozhong_buf[3]==time_buf2[15]&&
  420.            taozhong_buf[4]==time_buf2[16]&&
  421.            taozhong_buf[5]==time_buf2[17])
  422.         {fengmingqi=0;
  423.          fengmingqi_jishi=0;
  424.         }
  425. fengmingqi_jishi++;
  426. if(fengmingqi==0&&fengmingqi_jishi>=200)
  427.     {fengmingqi=1;
  428.          fengmingqi_jishi=0;
  429.         }              
  430. TR1=1;
  431. }

  432. void tiaoshi_view()
  433. {uchar i;
  434. Write_Com_1602(0x80);
  435.          switch(time_buf2[18])
  436.           {case 1:time_buf2[9]='M'-48;time_buf2[10]='O'-48;time_buf2[11]='N'-48;break;
  437.            case 2:time_buf2[9]='T'-48;time_buf2[10]='U'-48;time_buf2[11]='E'-48;break;
  438.            case 3:time_buf2[9]='W'-48;time_buf2[10]='E'-48;time_buf2[11]='D'-48;break;
  439.            case 4:time_buf2[9]='T'-48;time_buf2[10]='H'-48;time_buf2[11]='U'-48;break;
  440.            case 5:time_buf2[9]='F'-48;time_buf2[10]='R'-48;time_buf2[11]='I'-48;break;
  441.            case 6:time_buf2[9]='S'-48;time_buf2[10]='A'-48;time_buf2[11]='T'-48;break;
  442.            case 7:time_buf2[9]='S'-48;time_buf2[10]='U'-48;time_buf2[11]='N'-48;break;
  443.           }
  444.   for(i=1;i<18;i++)
  445.    { Write_Dat_1602(time_buf2[i]+48);
  446.             if(i==4|i==6)
  447.           Write_Dat_1602('-');
  448.          if(i==8)
  449.            Write_Dat_1602(' ');
  450.          if(i==11)
  451.            {
  452.             Write_Com_1602(0x80+0x40);
  453.               }
  454.          if(i==13||i==15)
  455.            Write_Dat_1602(':');
  456.    }
  457. Write_Dat_1602(' ');
  458. Write_Dat_1602('T');
  459. Write_Dat_1602('i');
  460. Write_Dat_1602('m');
  461. Write_Dat_1602('_');
  462. Write_Dat_1602('S');
  463. Write_Dat_1602('e');
  464. Write_Dat_1602('t');
  465. if(Set_Mode>0)
  466.   Write_Com_1602(guang_wei);
  467. }

  468. void Time_View()
  469. { uchar i;
  470.   ds1302_read_time();
  471.   Write_Com_1602(0x80);
  472.   for(i=1;i<18;i++)
  473.    { Write_Dat_1602(time_buf2[i]+48);
  474.             if(i==4|i==6)
  475.           Write_Dat_1602('-');
  476.          if(i==8)
  477.            Write_Dat_1602(' ');
  478.          if(i==11)
  479.            {
  480.             Write_Com_1602(0x80+0x40);
  481.               }
  482.          if(i==13||i==15)
  483.            Write_Dat_1602(':');
  484.    }
  485.   if(Set_Mode>0)
  486.   Write_Com_1602(guang_wei);
  487. }

  488. void Temp_View()
  489. {uint t;
  490. uchar i;
  491. t=ReadTemperature();
  492. temp_buf[5]=0xdf;
  493. temp_buf[6]='C';
  494. temp_buf[3]='.';
  495. Write_Com_1602(0x80+0x49);
  496. if(t&0x8000)
  497.   {temp_buf[0]='-';t=~t;t+=1;}
  498. else
  499.    temp_buf[0]=' ';
  500. if(t&0x0001)
  501.    temp_buf[4]='5';
  502. else
  503.    temp_buf[4]='0';
  504. t=t>>4;
  505. temp_buf[1]=t/10+48;
  506. temp_buf[2]=t%10+48;
  507. for(i=0;i<7;i++)
  508.   Write_Dat_1602(temp_buf[i]);
  509. }
  510. ////////////////////////////DS1302驱动///////////////////////////
  511. uchar ds1302_read_byte(uchar addr)
  512. {        uchar i;
  513.         uchar temp;
  514.     DS_RES=1;                                        /*启动DS1302总线*/
  515.         addr=addr|0x01;                                /*最低位置高*/
  516.         /*写入目标地址:addr*/
  517.         for (i=0;i<8;i++)
  518.         {            
  519.                 if (addr&0x01)
  520.                   DS_IO=1;
  521.                 else
  522.               DS_IO=0;
  523.                 DS_CLK=1;
  524.                 DS_CLK=0;
  525.                 addr=addr>>1;
  526.          }
  527.         
  528.         /*输出数据:temp*/
  529.         for(i=0;i<8;i++)
  530.         {
  531.                 temp=temp>>1;
  532.                 if(DS_IO)
  533.                   temp|=0x80;
  534.                 else
  535.                   temp&=0x7F;
  536.             DS_CLK=1;
  537.                 DS_CLK=0;
  538.         }        
  539.         DS_RES=0;                                        /*停止DS1302总线*/
  540.         return temp;
  541. }

  542. void ds1302_write_byte(uchar addr, uchar Dat)
  543. {

  544.         uchar i;
  545.         DS_RES=1;                                        /*启动DS1302总线*/
  546.         /*写入目标地址:addr*/
  547.         addr=addr&0xFE;                                /*最低位置零*/
  548.         for(i=0;i<8;i++)
  549.         {
  550.             if(addr&0x01)
  551.                   DS_IO=1;
  552.                 else
  553.                   DS_IO=0;
  554.             DS_CLK=1;
  555.                 DS_CLK=0;
  556.                 addr=addr>>1;
  557.         }
  558.         
  559.         /*写入数据:Dat*/
  560.         for (i=0;i<8;i++)
  561.         {
  562.             
  563.                 if (Dat&0x01)
  564.                   DS_IO=1;
  565.                 else
  566.                   DS_IO=0;
  567.                
  568.             DS_CLK=1;
  569.                 DS_CLK=0;
  570.                 Dat=Dat>>1;
  571.         }
  572.         DS_RES=0;                                                /*停止DS1302总线*/
  573. }

  574. void ds1302_write_time(void)
  575. {

  576.     unsigned char i,tmp;
  577.         time_buf1[1]=time_buf2[3]*10;
  578.         time_buf1[1]+=time_buf2[4];
  579.         time_buf1[2]=time_buf2[5]*10;
  580.         time_buf1[2]+=time_buf2[6];
  581.         time_buf1[3]=time_buf2[7]*10;
  582.         time_buf1[3]+=time_buf2[8];
  583.         time_buf1[4]=time_buf2[12]*10;
  584.         time_buf1[4]+=time_buf2[13];
  585.         time_buf1[5]=time_buf2[14]*10;
  586.         time_buf1[5]+=time_buf2[15];
  587.         time_buf1[6]=time_buf2[16]*10;
  588.         time_buf1[6]+=time_buf2[17];
  589.         time_buf1[7]=time_buf2[18];                  

  590.         for(i=0;i<8;i++)
  591.         {           //BCD处理
  592.                 tmp=time_buf1[i]/10;
  593.                 time_buf[i]=time_buf1[i]%10;
  594.                 time_buf[i]=time_buf[i]+tmp*16;
  595.         }
  596.         ds1302_write_byte(ds1302_control_add,0x00);                        //关闭写保护
  597.         ds1302_write_byte(ds1302_sec_add,0x80);                                //暂停
  598.         ds1302_write_byte(ds1302_charger_add,0xa9);                        //涓流充电
  599.         ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
  600.         ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
  601.         ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
  602.         ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
  603.         ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //时
  604.         ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
  605.         ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
  606.         ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
  607.         ds1302_write_byte(ds1302_control_add,0x80);                        //打开写保护
  608. }

  609. void ds1302_read_time(void)  
  610. {
  611.            uchar i,tmp;
  612.         time_buf[1]=ds1302_read_byte(ds1302_year_add);                //年
  613.         time_buf[2]=ds1302_read_byte(ds1302_month_add);                //月
  614.         time_buf[3]=ds1302_read_byte(ds1302_date_add);                //日
  615.         time_buf[4]=ds1302_read_byte(ds1302_hr_add);                //时
  616.         time_buf[5]=ds1302_read_byte(ds1302_min_add);                //分
  617.         time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
  618.         time_buf[7]=ds1302_read_byte(ds1302_day_add);                //周


  619.         for(i=0;i<8;i++)
  620.         {           //BCD处理
  621.                 tmp=time_buf[i]/16;
  622.                 time_buf1[i]=time_buf[i]%16;
  623.                 time_buf1[i]=time_buf1[i]+tmp*10;
  624.         }
  625.     time_buf2[1]=time_view1;
  626.         time_buf2[2]=time_view2;
  627.         time_buf2[3]=(time_buf1[1]%100)/10;
  628.         time_buf2[4]=time_buf1[1]%10;
  629.         time_buf2[5]=(time_buf1[2]%100)/10;
  630.         time_buf2[6]=time_buf1[2]%10;
  631.         time_buf2[7]=(time_buf1[3]%100)/10;
  632.         time_buf2[8]=time_buf1[3]%10;
  633.         switch(time_buf1[7])
  634.           {case 1:time_buf2[9]='M'-48;time_buf2[10]='O'-48;time_buf2[11]='N'-48;break;
  635.            case 2:time_buf2[9]='T'-48;time_buf2[10]='U'-48;time_buf2[11]='E'-48;break;
  636.            case 3:time_buf2[9]='W'-48;time_buf2[10]='E'-48;time_buf2[11]='D'-48;break;
  637.            case 4:time_buf2[9]='T'-48;time_buf2[10]='H'-48;time_buf2[11]='U'-48;break;
  638.            case 5:time_buf2[9]='F'-48;time_buf2[10]='R'-48;time_buf2[11]='I'-48;break;
  639.            case 6:time_buf2[9]='S'-48;time_buf2[10]='A'-48;time_buf2[11]='T'-48;break;
  640.            case 7:time_buf2[9]='S'-48;time_buf2[10]='U'-48;time_buf2[11]='N'-48;break;
  641.           }
  642.         time_buf2[18]=time_buf1[7];   
  643.         time_buf2[12]=(time_buf1[4]%100)/10;
  644.         time_buf2[13]=time_buf1[4]%10;
  645.         time_buf2[14]=(time_buf1[5]%100)/10;
  646.         time_buf2[15]=time_buf1[5]%10;
  647.         time_buf2[16]=(time_buf1[6]%100)/10;
  648.         time_buf2[17]=time_buf1[6]%10;
  649. }

  650. /////////////////////////LCD1602驱动//////////////////////
  651. void Write_Com_1602(uchar Com_1602)
  652. {LCD_RS=0;
  653. LCD_RW=0;
  654. LCD_E=0;
  655. delay_1us(3);
  656. LCD_E=1;
  657. P0=Com_1602;
  658. delay_1us(3);
  659. LCD_E=0;
  660. }

  661. void Write_Dat_1602(uchar Dat_1602)
  662. {LCD_RS=1;
  663. LCD_RW=0;
  664. LCD_E=0;
  665. delay_1us(3);
  666. LCD_E=1;
  667. P0=Dat_1602;
  668. delay_1us(3);
  669. LCD_E=0;

  670. }

  671. void Init_1602()
  672. {
  673. Write_Com_1602(0X38);
  674. delay_1ms(5);
  675. Write_Com_1602(0X08);
  676. delay_1ms(5);
  677. Write_Com_1602(0X01);
  678. Write_Com_1602(0X06);
  679. delay_1ms(5);
  680. Write_Com_1602(0X0C);
  681. }

  682. //////////////////////18B20驱动/////////////////////
  683. void Init_DS18B20(void)
  684. {
  685. unsigned char x=0;
  686. DQ = 1;    //DQ复位
  687. delay(8);  //稍做延时
  688. DQ = 0;    //单片机将DQ拉低
  689. delay(80); //精确延时 大于 480us
  690. DQ = 1;    //拉高总线
  691. delay(10);
  692. x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  693. delay(5);
  694. }

  695. uchar ReadOneChar(void)
  696. {
  697. unsigned char i=0;
  698. unsigned char dat = 0;
  699. for (i=8;i>0;i--)
  700. {
  701.   DQ = 0; // 给脉冲信号
  702.   dat>>=1;
  703.   DQ = 1; // 给脉冲信号
  704.   if(DQ)
  705.    dat|=0x80;
  706.   delay(5);
  707. }
  708. return(dat);
  709. }

  710. void WriteOneChar(unsigned char dat)
  711. {
  712. unsigned char i=0;
  713. for (i=8; i>0; i--)
  714. {
  715.   DQ = 0;
  716.   DQ = dat&0x01;
  717.   delay(5);
  718.   DQ = 1;
  719.   dat>>=1;
  720. }
  721. delay(5);
  722. }

  723. void ChangeTemperature(void)
  724. {Init_DS18B20();
  725. WriteOneChar(0xCC); // 跳过读序号列号的操作
  726. WriteOneChar(0x44); // 启动温度转换
  727. }

  728. uint ReadTemperature(void)
  729. {
  730. unsigned char a=0;
  731. unsigned int b=0;
  732. unsigned int t=0;
  733. Init_DS18B20();
  734. WriteOneChar(0xCC); //跳过读序号列号的操作
  735. WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  736. a=ReadOneChar();   //低位
  737. b=ReadOneChar();   //高位

  738. b<<=8;
  739. t=a+b;

  740. return(t);
  741. }

  742. void delay_1us(int delay_us)
  743. {while(delay_us)
  744.   {
  745.    delay_us--;
  746.   }

  747. }

  748. void delay_1ms(int delay)
  749. {int delay1;
  750. for(;delay;delay--)
  751.   for(delay1=80;delay1;)
  752.    {delay1--;}
  753. }

  754. void delay(uint i)//延时函数
  755. {
  756. while(i--);
  757. }
复制代码

评分

参与人数 1黑币 +5 收起 理由
阿斯顿噶事 + 5

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-1-2 03:16 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:159320 发表于 2017-1-2 11:27 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:263382 发表于 2017-12-18 21:35 | 只看该作者
谢谢,这是好资料
回复

使用道具 举报

5#
ID:271864 发表于 2018-1-5 12:00 | 只看该作者
谢谢分享
回复

使用道具 举报

6#
ID:721769 发表于 2021-2-1 21:31 | 只看该作者
Thank you a lot for such sharing and help
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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