找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3159|回复: 1
收起左侧

基于89C52 DS1302 DHT11 LCD1602温湿度时钟源码

[复制链接]
ID:293082 发表于 2018-3-17 11:41 | 显示全部楼层 |阅读模式
功能
1、设置闹钟2、校时
3、温湿度显示
4、实时时间

PO口为LCD1602数据接口;
有6个键
1、设置
2、移位
3、闹钟取消
4、切屏
5、加
6、减

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. unsigned char code read_addr[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  5. unsigned char code write_addr[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
  6. unsigned char time[7] = {0x00,0x00, 0x12, 0x01, 0x01, 0x02, 0x18};//设置时间
  7. unsigned char code digit[10]={"0123456789"};
  8. uint nianshi,niange,yueshi,yuege,rvshi,rvge,shishi,shige,fenshi,fenge,miaoshi,miaoge,tempshi,tempge,humshi,humge;
  9. uint miao,fen,shi,rv,yue,nian,timenian,timeyue,timerv,timeshi,timefen,timemiao;
  10. uint afen=0,ashi=0,t=0,TT=0,afenshi,afenge,ashishi,ashige;
  11. sbit SCLK=P2^1;
  12. sbit RST=P2^0;
  13. sbit DSIO=P2^2;
  14. sbit LCDE=P2^6;
  15. sbit RS=P2^7;
  16. sbit RW=P2^5;
  17. sbit KEY1=P1^4;//加
  18. sbit KEY2=P1^5;//减
  19. sbit KEY0=P1^3;//移位
  20. sbit KEY3=P1^0;//闹铃设置
  21. sbit KEY4=P1^2;//闹铃取消
  22. sbit KEY5=P1^1;//切屏显示
  23. sbit clock_beef=P3^4;//蜂鸣器输出
  24. sbit   DHTIO= P3^5 ;
  25. uchar n,flag,num;
  26. unsigned char  U8FLAG=0,U8temp=0;
  27. unsigned char  U8T_data_H=0,U8T_data_L=0,U8RH_data_H=0,U8RH_data_L=0,U8checkdata=0;
  28. unsigned char str[5];


  29. //humidity 湿度  
  30. //temperature 温度  
  31. //integer 整数  
  32. //decimal 小数  
  33. unsigned char humidity_interger=0,humidity_decimal;  
  34. unsigned char temperature_integer=0,temperature_decimal;  
  35. unsigned char check;  
  36.   
  37. void delay20ms()  
  38. {  
  39.     unsigned char a,b,c;  
  40.     for(c=1;c>0;c--)  
  41.         for(b=222;b>0;b--)  
  42.             for(a=40;a>0;a--);  
  43. }  
  44. void delay40us()  
  45. {  
  46.      unsigned char a,b;  
  47.      for(b=3;b>0;b--)  
  48.         for(a=4;a>0;a--);  
  49. }  
  50.   
  51. void dht_start()             //等待接受初始化
  52. {  
  53.      DHTIO=1;          //初始高电平  
  54.      delay40us();  
  55.      DHTIO=0;          //主机拉低电平  
  56.      delay20ms();      //保持电平时间大于18ms  
  57.      DHTIO=1;          //主机拉高电平  
  58.      delay40us();      //延迟等待20-40us等待从机响应  
  59. }  
  60.   
  61. unsigned char recieve_data() //数据接收
  62. {  
  63.     unsigned char i,flag,data_byte;  
  64.     for(i=0;i<8;i++)  
  65.     {  
  66.         flag=2;  
  67.         while((!DHTIO)&&flag++);//等待从机发出50us低电平结束  
  68.         delay40us();            //延时超过26us-28us不超过70us  
  69.         data_byte=data_byte<<1;  
  70.         if(DHTIO)                 //如果此时dhtio为1则表示此时从机输出数据为1否则说明此时从机输出数据为0  
  71.         {  
  72.             data_byte|=0x01;  
  73.             flag=2;  
  74.             while((DHTIO)&&flag++);//等待剩下的高电平结束  
  75.         }  
  76.         if(!flag)  
  77.             break;  
  78.     }                   
  79.     return data_byte;  
  80. }  
  81. void dht_take_sample()     //采样
  82. {  
  83.      unsigned char flag;  
  84.      dht_start();  
  85.      if(!DHTIO)         //从机发出响应信号  
  86.      {  
  87.           flag=2;  
  88.           while((!DHTIO)&&flag++);//检测从机发出80us低电平是否结束  
  89.           flag=2;  
  90.           while((DHTIO)&&flag++); //检测从机发出80us高电平是否结束  
  91.           //开始采集数据  
  92.           humidity_interger=recieve_data();     //采集湿度整数部分  
  93.           humidity_decimal=recieve_data();      //采集湿度小数部分  
  94.           temperature_integer=recieve_data();   //采集温度整数部分  
  95.           temperature_decimal=recieve_data();   //采集温度小数部分  
  96.           check=recieve_data();                 //采集校验位  
  97.             
  98.           DHTIO=1;  //采集数据后主机拉高电平  
  99.      }  
  100. }  
  101. void delay(unsigned int z) //延时长
  102. {
  103.          unsigned char x,y;
  104.          for(x=z;x>0;x--)
  105.          {
  106.                  for(y=20;y>0;y--);
  107.          }
  108. }
  109. void write_com(unsigned char com)   //将模式设置指令或显示地址写入液晶模块
  110. {
  111.          RS=0;
  112.          RW=0;
  113.          LCDE=0;
  114.          P0=com;
  115.          delay(5);
  116.          LCDE=1;
  117.          delay(5);
  118.          LCDE=0;
  119. }
  120. void write_date(unsigned char date)//将数据(字符ASCII码)写入液晶模块
  121. {
  122.          RS=1;
  123.          RW=0;
  124.          LCDE=0;
  125.          P0=date;
  126.          delay(5);
  127.          LCDE=1;
  128.          delay(5);
  129.          LCDE=0;
  130. }
  131. void L1602_string(unsigned char hang,unsigned char lie,unsigned char p)   //将数据写入液晶模块
  132. {
  133.         unsigned char a;
  134.         if(hang == 1) a = 0x80;                                         //显示在第一行
  135.         if(hang == 2) a = 0xc0;                                         //显示在第一行
  136.         a = a + lie -1;
  137.         write_com(a);
  138.         write_date(p);
  139. }
  140. void init()                         //1602初始化
  141. {
  142.          write_com(0x38);
  143.          write_com(0x0e);
  144.          write_com(0x06);
  145.          write_com(0x01);
  146.       // write_com(0x80);
  147. }
  148. void write(unsigned char addr,unsigned char date)  //ds1302根据命令字写入数据
  149. {
  150.          unsigned char i;
  151.          RST=0;
  152.          SCLK=0;
  153.          RST=1;
  154.          delay(5);
  155.          for(i=0;i<8;i++)
  156.          {
  157.                  DSIO=addr&0x01;
  158.                  addr=addr>>1;
  159.                  SCLK=1;
  160.                  delay(5);
  161.                  SCLK=0;
  162.                  delay(5);
  163.          }
  164.          for(i=0;i<8;i++)
  165.          {
  166.                  DSIO=date&0x01;
  167.                  date>>=1;
  168.                  SCLK=1;
  169.                  delay(5);
  170.                  SCLK=0;
  171.                  delay(5);
  172.          }
  173.          RST=0;
  174. }
  175. unsigned char read(unsigned char addr)   //ds1302读数据
  176. {
  177.          unsigned char i,dat,dat1;
  178.          RST=0;
  179.          SCLK=0;
  180.          RST=1;
  181.          for(i=0;i<8;i++)
  182.          {
  183.                  DSIO=addr&0x01;
  184.                  addr>>=1;
  185.                  SCLK=1;
  186.                  delay(5);
  187.                  SCLK=0;
  188.                  delay(5);
  189.          }
  190.          delay(5);
  191.          for(i=0;i<8;i++)
  192.          {
  193.                 dat1=DSIO;
  194.                 dat=(dat>>1)|(dat1<<7);
  195.                 SCLK=1;
  196.                 delay(5);
  197.                 SCLK=0;
  198.                 delay(5);
  199.          }
  200.          SCLK=1;              
  201.          RST=0;
  202.          return dat;
  203. }
  204. void readtime()                         // ds1302连续读出时间
  205. {
  206.          unsigned char i;
  207.          for(i=0;i<7;i++)
  208.          {  
  209.              time[i]= read(read_addr[i]);
  210.          }
  211. }
  212. void  zhuanhuan()                       //十六进制转十进制
  213. {
  214.          nianshi=time[6]/16;
  215.          niange=(time[6]&0x0f);
  216.          yueshi=time[4]/16;
  217.          yuege=(time[4]&0x0f);
  218.          rvshi=time[3]/16;
  219.          rvge=(time[3]&0x0f);                                                                                                                                 
  220.          shishi=time[2]/16;
  221.          shige=(time[2]&0x0f);
  222.          fenshi=time[1]/16;
  223.          fenge=(time[1]&0x0f);
  224.          miaoshi=time[0]/16;
  225.          miaoge=(time[0]&0x0f);

  226. }
  227. void zhuanhuan1()                       //十进制转十六进制
  228. {
  229.          time[6]=nianshi*16+niange;         
  230.          time[4]=yueshi*16+yuege;         
  231.          time[3]=rvshi*16+rvge;
  232.          time[2]=shishi*16+shige;        
  233.          time[1]=fenshi*16+fenge;        
  234.          time[0]=miaoshi*16+miaoge;      
  235. }
  236. void xianshi()                           //1602显示时间
  237. {
  238.         L1602_string(1,8,digit[nianshi]);
  239.         L1602_string(1,9,digit[niange]);
  240.         L1602_string(1,11,digit[yueshi]);
  241.         L1602_string(1,12,digit[yuege]);
  242.         L1602_string(1,14,digit[rvshi]);      
  243.     L1602_string(1,15,digit[rvge]);
  244.         L1602_string(2,6,digit[shishi]);      
  245.     L1602_string(2,7,digit[shige]);
  246.     L1602_string(2,9,digit[fenshi]);      
  247.     L1602_string(2,10,digit[fenge]);  
  248.         L1602_string(2,12,digit[miaoshi]);      
  249.     L1602_string(2,13,digit[miaoge]);
  250. }
  251. void xianshi1()                 //闹铃设置显示
  252. {
  253.         L1602_string(2,6,digit[ashishi]);      
  254.     L1602_string(2,7,digit[ashige]);
  255.     L1602_string(2,9,digit[afenshi]);      
  256.     L1602_string(2,10,digit[afenge]);  
  257. }
  258. void xianshi2()         //温湿度显示
  259. {
  260.    
  261.     L1602_string(1,1,'T');
  262.         L1602_string(1,2,'e');
  263.         L1602_string(1,3,'m');
  264.         L1602_string(1,4,'p');
  265.         L1602_string(1,5,':');
  266.         L1602_string(1,6,digit[tempshi]);
  267.     L1602_string(1,7,digit[tempge]);       
  268.         L1602_string(1,8,'C');
  269.         L1602_string(1,9,' ');
  270.         L1602_string(1,10,' ');
  271.         L1602_string(1,11,' ');
  272.         L1602_string(1,12,' ');
  273.         L1602_string(1,13,' ');
  274.     L1602_string(1,14,' ');
  275.     L1602_string(1,15,' ');
  276.         L1602_string(2,1,'H');
  277.         L1602_string(2,2,'u');
  278.         L1602_string(2,3,'m');
  279.         L1602_string(2,4,':');
  280.         L1602_string(2,5,digit[humshi]);
  281.         L1602_string(2,6,digit[humge]);
  282.         L1602_string(2,7,'%');
  283.     L1602_string(2,8,' ');
  284.         L1602_string(2,9,' ');
  285.         L1602_string(2,10,' ');
  286.         L1602_string(2,11,' ');
  287.         L1602_string(2,12,' ');
  288.         L1602_string(2,13,' ');
  289.     L1602_string(2,14,' ');
  290.     L1602_string(2,15,' ');

  291. }
  292. void ds1302init()                  //ds1302初始化
  293. {
  294.          unsigned char i;
  295.          write(0x8e,0x00);
  296.          for(i=0;i<7;i++)
  297.          {
  298.                  write(write_addr[i],time[i]);
  299.          }      
  300.          write(0x8e,0x80);
  301. }

  302. void tiaozhuan()                       //按键跳转函数
  303. {
  304.           if(KEY0==0)
  305.           {
  306.            delay(5);
  307.            if(KEY0==0)
  308.            {
  309.             n++;
  310.             while(!KEY0);
  311.            }
  312.           }
  313. }
  314. void chuandi1()                        //时间传递函数1
  315. {
  316.          miao=miaoshi*10+miaoge;
  317.          fen=fenshi*10+fenge;
  318.          shi=shishi*10+shige;
  319.          rv=rvshi*10+rvge;
  320.          yue=yueshi*10+yuege;
  321.          nian=nianshi*10+niange;
  322. }
  323. void chuandi2()                        //时间传递函数2
  324. {   
  325.          nianshi=nian/10;
  326.          niange=nian%10;
  327.          yueshi=yue/10;
  328.          yuege=yue%10;
  329.          rvshi=rv/10;
  330.          rvge=rv%10;
  331.          shishi=shi/10;
  332.          shige=shi%10;
  333.          fenshi=fen/10;
  334.          fenge=fen%10;
  335.          miaoshi=miao/10;
  336.          miaoge=miao%10;
  337. }
  338. void keyscan()                          //移位修改时间
  339. {
  340.                  L1602_string(1,1,'d');                                         //在LCD相应位置显示变量或者常量
  341.                  L1602_string(1,2,'a');
  342.                  L1602_string(1,3,'t');
  343.                  L1602_string(1,4,'e');
  344.                  L1602_string(1,5,':');
  345.                          L1602_string(1,6,'2');
  346.                          L1602_string(1,7,'0');
  347.                  L1602_string(1,10,'.');
  348.                  L1602_string(1,13,'.');
  349.                  L1602_string(2,1,'t');                                         
  350.                  L1602_string(2,2,'i');
  351.                  L1602_string(2,3,'m');
  352.                  L1602_string(2,4,'e');
  353.                  L1602_string(2,5,':');
  354.                  L1602_string(2,8,':');
  355.                  L1602_string(2,11,':');       
  356.              if(KEY0==0)
  357.              {
  358.                  delay(5);
  359.                  if(KEY0==0)
  360.                  {
  361.                          n++;
  362.                          while(!KEY0);
  363.                          if(n==1);
  364.                          chuandi1();
  365.                          while(n==1)
  366.                          {
  367.                                                   flag=1;
  368.                           write_com(0xcc);        //光标回到秒十位
  369.                           write_com(0x0f);        //光标闪烁
  370.                           tiaozhuan();
  371.                           if(KEY1==0)
  372.                           {
  373.                             delay(5);
  374.                             if(KEY1==0)
  375.                             {
  376.                              while(!KEY1);
  377.                              miao++;
  378.                              if(miao==60)
  379.                                miao=0;   
  380.                                                          chuandi2();
  381.                              xianshi();
  382.                             }
  383.                           }
  384.                           if(KEY2==0)
  385.                           {
  386.                            delay(5);
  387.                            if(KEY2==0)
  388.                            {
  389.                             while(!KEY2);
  390.                             miao--;
  391.                             if(miao==-1)
  392.                              miao=59;
  393.                             chuandi2();
  394.                             xianshi();
  395.                            }
  396.                           }
  397.                          }
  398.                          while(n==2)
  399.                          {
  400.                           write_com(0xc8);//光标回到分十位
  401.                           tiaozhuan();
  402.                           if(KEY1==0)
  403.                           {
  404.                            delay(5);
  405.                            if(KEY1==0)
  406.                            {
  407.                             while(!KEY1);
  408.                             fen++;
  409.                             if(fen==60)
  410.                              fen=0;
  411.                             chuandi2();
  412.                             xianshi();
  413.                            }
  414.                           }
  415.                           if(KEY2==0)
  416.                           {
  417.                            delay(5);
  418.                            if(KEY2==0)
  419.                            {
  420.                             while(!KEY2);
  421.                             fen--;
  422.                             if(fen==-1)
  423.                              fen=59;
  424.                              chuandi2();
  425.                              xianshi();
  426.                            }
  427.                           }
  428.                          }
  429.                          while(n==3)
  430.                          {
  431.                           write_com(0xc5);//光标回到时十位
  432.                           tiaozhuan();
  433.                           if(KEY1==0)
  434.                           {
  435.                            delay(5);
  436.                            if(KEY1==0)
  437.                            {
  438.                             while(!KEY1);
  439.                             shi++;
  440.                             if(shi==24)
  441.                             shi=0;
  442.                             chuandi2();
  443.                             xianshi();
  444.                            }
  445.                           }
  446.                           if(KEY2==0)
  447.                           {
  448.                            delay(5);
  449.                            if(KEY2==0)
  450.                            {
  451.                             while(!KEY2);
  452.                             shi--;
  453.                             if(shi==-1)
  454.                             shi=23;
  455.                             chuandi2();
  456.                             xianshi();
  457.                            }
  458.                           }                  
  459.                          }
  460.                          while(n==4)
  461.                          {
  462.                           write_com(0x8d) ;//光标回到日十位
  463.                           tiaozhuan();  
  464.                           if(KEY1==0)
  465.                           {
  466.                            delay(5);
  467.                            if(KEY1==0)
  468.                            {
  469.                             while(!KEY1);
  470.                             rv++;
  471.                             if(rv==32)
  472.                             rv=0;
  473.                             chuandi2();
  474.                             xianshi();
  475.                            }
  476.                           }
  477.                           if(KEY2==0)
  478.                           {
  479.                            delay(5);
  480.                            if(KEY2==0)
  481.                            {
  482.                             while(!KEY2);
  483.                             rv--;
  484.                             if(rv==0)
  485.                             rv=31;
  486.                             chuandi2();
  487.                             xianshi();
  488.                            }
  489.                           }
  490.                          }
  491.                          while(n==5)
  492.                          {
  493.                           write_com(0x8a);//光标回到月十位
  494.                           tiaozhuan();
  495.                           if(KEY1==0)
  496.                           {
  497.                            delay(5);
  498.                            if(KEY1==0)
  499.                            {
  500.                             while(!KEY1);
  501.                             yue++;
  502.                             if(yue==13)
  503.                             yue=0;
  504.                             chuandi2();
  505.                             xianshi();
  506.                            }
  507.                           }
  508.                           if(KEY2==0)
  509.                           {
  510.                            delay(5);
  511.                            if(KEY2==0)
  512.                            {
  513.                             while(!KEY2);
  514.                             yue--;
  515.                             if(yue==0)
  516.                             yue=12;
  517.                             chuandi2();
  518.                             xianshi();
  519.                            }
  520.                           }
  521.                          }
  522.                          while(n==6)
  523.                          {
  524.                           write_com(0x87);//光标回到年十位
  525.                           if(KEY1==0)
  526.                           {
  527.                            delay(5);
  528.                            if(KEY1==0)
  529.                            {
  530.                             while(!KEY1);
  531.                             nian++;
  532.                             if(nian==101)
  533.                             nian=0;
  534.                             chuandi2();
  535.                             xianshi();
  536.                            }
  537.                           }
  538.                           if(KEY2==0)
  539.                           {
  540.                            delay(5);
  541.                            if(KEY2==0)
  542.                            {
  543.                             while(!KEY2);
  544.                             nian--;
  545.                             if(nian==-1)
  546.                             nian=100;
  547.                             chuandi2();
  548.                             xianshi();
  549.                            }
  550.                           }
  551.                           if(KEY0==0)
  552.                           {
  553.                            delay(5);
  554.                            if(KEY0==0)
  555.                            {
  556.                              n=0;
  557.                              flag=0;
  558.                              write_com(0x0c);
  559.                              while(!KEY0);
  560.                            }
  561.                           }
  562.                          }
  563.                  zhuanhuan1();
  564.                  ds1302init();        
  565.                  }
  566.          }
  567. }
  568. void alarm_set()//闹铃设置
  569. {
  570.   if(KEY3==0)
  571.         {
  572.             t=1;
  573.                 delay(5);
  574.                 if(KEY3==0)
  575.                 {
  576.                              while(!KEY3);
  577.                              L1602_string(1,1,'a');                                         //在LCD相应位置显示变量或者常量
  578.                      L1602_string(1,2,'l');
  579.                      L1602_string(1,3,'a');
  580.                      L1602_string(1,4,'r');
  581.                      L1602_string(1,5,'m');
  582.                                  L1602_string(1,6,' ');
  583.                              L1602_string(1,7,'s');
  584.                              L1602_string(1,8,'e');
  585.                              L1602_string(1,9,'t');
  586.                              L1602_string(1,10,':');
  587.                              L1602_string(1,11,' ');
  588.                              L1602_string(1,12,' ');
  589.                              L1602_string(1,13,' ');
  590.                  L1602_string(1,14,' ');
  591.                                  L1602_string(1,15,' ');
  592.                              L1602_string(2,1,' ');
  593.                                  L1602_string(2,2,' ');
  594.                                  L1602_string(2,3,' ');
  595.                                  L1602_string(2,4,' ');
  596.                                  L1602_string(2,5,' ');
  597.                                  afenshi=afen/10;
  598.                                  afenge=afen%10;
  599.                                  ashishi=ashi/10;
  600.                                  ashige=ashi%10;      
  601.                              xianshi1();
  602.                                  while(KEY3)
  603.                                  {
  604.                                  if(KEY0==0)
  605.                                  {
  606.                                     delay(5);
  607.                                         if(KEY0==0)
  608.                                         {
  609.                                           n++;
  610.                                           while(!KEY0);
  611.                                           while(n==1)
  612.                                           {
  613.                       write_com(0xc8);//光标回到分十位
  614.                                           write_com(0x0f);
  615.                       tiaozhuan();
  616.                       if(KEY1==0)
  617.                       {
  618.                         delay(5);
  619.                         if(KEY1==0)
  620.                         {
  621.                           while(!KEY1);
  622.                           afen++;
  623.                           if(afen==60)
  624.                            afen=0;
  625.                                                   afenshi=afen/10;
  626.                                           afenge=afen%10;
  627.                           xianshi1();
  628.                         }
  629.                       }
  630.                       if(KEY2==0)
  631.                       {
  632.                         delay(5);
  633.                         if(KEY2==0)
  634.                         {
  635.                           while(!KEY2);
  636.                           afen--;
  637.                           if(afen==-1)
  638.                             afen=59;
  639.                                                   afenshi=afen/10;
  640.                                           afenge=afen%10;
  641.                           xianshi1();
  642.                         }
  643.                                           }       
  644.                                          }
  645.                                          while(n==2)
  646.                      {
  647.                        write_com(0xc5);        //光标回到时十位
  648.                        if(KEY1==0)
  649.                        {
  650.                          delay(5);
  651.                          if(KEY1==0)
  652.                          {
  653.                             while(!KEY1);
  654.                             ashi++;
  655.                             if(ashi==24)
  656.                               ashi=0;
  657.                             ashishi=ashi/10;
  658.                                                         ashige=ashi%10;
  659.                             xianshi1();
  660.                          }
  661.                        }
  662.                        if(KEY2==0)
  663.                        {
  664.                          delay(5);
  665.                          if(KEY2==0)
  666.                          {
  667.                             while(!KEY2);
  668.                             ashi--;
  669.                             if(ashi==-1)
  670.                               ashi=23;
  671.                             ashishi=ashi/10;
  672.                                                         ashige=ashi%10;
  673.                             xianshi1();
  674.                          }
  675.                        }
  676.                        if(KEY0==0)
  677. ……………………

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

所有资料51hei提供下载:
2018-01-10 134828.zip (4.15 KB, 下载次数: 109)

评分

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

查看全部评分

回复

使用道具 举报

ID:733987 发表于 2020-5-8 20:55 | 显示全部楼层
走时慢了很多,而且断电后不保存ds1302,又重新计数了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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