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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機實現(xiàn)溫度傳感器和按鍵調(diào)節(jié)時鐘 附源程序

[復制鏈接]
ID:809013 發(fā)表于 2020-8-15 11:13 | 顯示全部樓層 |閱讀模式
這個暑假做了基于51單片機實現(xiàn)12864實現(xiàn)DHT11溫濕度傳感器和DS1302實現(xiàn)鬧鐘和溫濕度顯示在同一個界面上,可以通過四個獨立按鍵控制時鐘的暫停,時分秒年月日位置的切換,可以實現(xiàn)時鐘的加法,減法,里面還有許多的小BUG,很是難以調(diào)整,有興趣可以看一下如何進行代碼的優(yōu)化,總而言之,基本的功能是可以實現(xiàn)的了,由于我那單片機多個矩陣按鍵損壞,導致矩陣按鍵的位置有所不同,大家注意一下就好了。
不知道這么附錄代碼,你們下載看一下就好了

//提前透露出一些小BUG,有的受K3按鍵按下去,但是中斷并沒有開啟,時鐘也沒有暫停,
原因不知出現(xiàn)在哪里,總之你們有興趣隨便看一下就行了,寫的是爛了點,望大佬指點以下
51hei圖片20200815110606.jpg 51hei圖片20200815110615.jpg
單片機源程序如下:
  1. #include "all.h"
  2. #include"DHT11.h"

  3. sbit K1=P3^4;
  4. sbit K2=P3^5;
  5. sbit K3=P3^2;  //右上角是這個按鍵電燈,觸發(fā)了外部中斷0
  6. sbit K4=P3^3;  //管腳接線
  7. sbit Beep = P3^1;
  8. unsigned char  Temp[8];
  9. char val_flag = 0;
  10. static unsigned char SetState,SetPlace,Place;
  11. static int  k = 1, q = 1,e = 1,r = 1,t = 1;
  12. static int w = 1;

  13. void  tiaojie();
  14. char Key_Scan();
  15. void hanshuming();
  16. void Int0Configuration();
  17. void Delay10ms();
  18. char Key_Scan();
  19. void SCLKTemp();
  20. void BeepHear();

  21. /*8421碼轉(zhuǎn)換*/
  22. unsigned char ChangeTime(unsigned char tim)
  23. {
  24.            //tim = Time_buf[7]=0x4A,0x0A,10
  25. unsigned char Time;
  26. if((tim&0x0F)>9)      //如果個位超過9,則十位加一后,個位清零
  27. {
  28.   tim=((tim+0x10)&0xF0);    //0x4A+0x10=0x5A&0xF0=0x50
  29.            
  30. }          //如果沒有則跳過該部分

  31.            //Timebuf = 0x50
  32. Time = (tim>>4)*10+(tim&0x0f);   //把8421碼轉(zhuǎn)變成10進制的數(shù)
  33.            //0x50>>4=0x05*10=50,0x50&0x0f=0x00=0 ;50  DS1302_Write_Time(void)

  34. return Time;      

  35. }

  36. void DS1302()
  37. {

  38. uchar tishi1[] ="設置鬧鈴";

  39. unsigned char sec_buf = 0x00; //用來保存上一次的秒數(shù)
  40. unsigned char i,j;
  41.   
  42. Init_12684();             //12864初始化
  43. DS1302_Init();     //DS1302初始化
  44. DS1302_Write_Time();   //初始化數(shù)據(jù)

  45.    for(i = 0; i < 8;i++)
  46.   {
  47.      Temp[i] = Time_buf[i];
  48.   }
  49.     while(1)
  50.   {
  51.      static char k ;
  52.      Rec_DHTI0();
  53.    if(0 == val_flag)
  54.    {
  55.     DS1302_Read_Time();
  56.    }
  57.         
  58.        if(SetState==0)
  59.      {
  60.       DS1302_Read_Time();
  61.      }
  62.      
  63.      else
  64.      {
  65.      
  66.        if(K1==0)  //檢測按鍵K1是否按下
  67.      {
  68.       
  69.       Delay10ms(); //消除抖動
  70.       if(K1==0)
  71.       {
  72.        SetPlace++;
  73.       
  74.         for(j = 0; j < SetPlace;j++)//1 2 3 4  5 6 7   //按照的這個結(jié)果是地址成功加到7
  75.         {
  76.          if(SetPlace>=8)   //按鍵可以控制分秒年月日的切換 按鍵按到6的時候可以實現(xiàn)年的切換,之后按鍵到7沒有任何顯示 再按一次重新回到秒的切換
  77.           SetPlace=0;   
  78.          
  79.          if(SetPlace == 6)
  80.          {
  81.            SetPlace = 7;
  82.          }
  83.          
  84.          xianshi();
  85.         }
  86.         j = 0;
  87.       }
  88.       
  89.       while((i<50)&&(K1==0))  //檢測按鍵是否松開
  90.       {
  91.        Delay10ms();
  92.        i++;
  93.       }
  94.       i=0;
  95.      }
  96.      
  97.      if(K2==0)  //檢測按鍵K2是否按下
  98.      {
  99.       Delay10ms(); //消除抖動
  100.       if(K2==0)
  101.       {
  102.       
  103.         Time_buf[SetPlace]++;
  104.        if((Time_buf[SetPlace]&0x0f)>9)      //換成BCD碼。
  105.        {
  106.         xianshi();
  107.        Time_buf[SetPlace]=Time_buf[SetPlace]+6;
  108.        }
  109.        if((Time_buf[SetPlace]>=0x60)&&(SetPlace<2))  //秒
  110.        {
  111.         Time_buf[SetPlace]=0;
  112.        }
  113.        if((Time_buf[SetPlace]>=0x60)&&(SetPlace==2))  //分鐘
  114.        {
  115.         Time_buf[SetPlace]=0;
  116.        }
  117.        if((Time_buf[SetPlace]>=0x24)&&(SetPlace==3))  // 小時
  118.        {
  119.         Time_buf[SetPlace]=0;
  120.        }
  121.        if((Time_buf[SetPlace]>=0x31)&&(SetPlace==4))  //日       //日期顯示有問題
  122.        {
  123.         Time_buf[SetPlace]=0;
  124.        }
  125.        if((Time_buf[SetPlace]>=0x13)&&(SetPlace==5))  //月
  126.        {
  127.         Time_buf[SetPlace]=1;
  128.        }  
  129.   //     if(SetPlace==5)  //月只能到12
  130.   //     {
  131.   //      TIME[SetPlace]=;
  132.   //     }
  133.       }
  134.       
  135.       while((i<50)&&(K2==0))  //檢測按鍵是否松開
  136.       {
  137.        Delay10ms();
  138.        i++;
  139.       }
  140.       i=0;
  141.       
  142.      }  
  143.            if(K4==0)  //檢測按鍵K2是否按下
  144.      {
  145.        //xianshi();
  146.       Delay10ms(); //消除抖動
  147.       if(K4==0)
  148.       {
  149.       
  150.         Time_buf[SetPlace]--; //減法需要將減到到0的時候置為為 0x59之類的
  151.        if((Time_buf[SetPlace]&0x0f)>9)      //換成BCD碼。
  152.        {
  153.        // xianshi();
  154.        Time_buf[SetPlace]=Time_buf[SetPlace]-6;
  155.        }
  156.        if((Time_buf[SetPlace]<= 0x00)&&(SetPlace < 2))  //分鐘
  157.        {
  158.         Time_buf[SetPlace]=0x59;
  159.        }
  160.       
  161.        if((Time_buf[SetPlace]<= 0x00)&&(SetPlace==2))  //分鐘
  162.        {
  163.         Time_buf[SetPlace]=0x59;
  164.        }
  165.        if((Time_buf[SetPlace]<= 0x00)&&(SetPlace==3))  // 小時
  166.        {
  167.         Time_buf[SetPlace]= 0x23;
  168.        }
  169.       
  170.       
  171.        if((Time_buf[SetPlace] <= 0x00)&&(SetPlace==4))  //日
  172.        {
  173.         Time_buf[SetPlace]=0x30;
  174.        }
  175.        if((Time_buf[SetPlace] <= 0x00)&&(SetPlace==5))  //月
  176.        {
  177.         Time_buf[SetPlace]=0x12;
  178.        }  
  179.       
  180.   //     if(SetPlace==5)  //月只能到12
  181.   //     {
  182.   //      TIME[SetPlace]=;
  183.   //     }
  184.       }
  185.       
  186.       while((i<50)&&(K4==0))  //檢測按鍵是否松開
  187.       {
  188.        Delay10ms();
  189.        i++;
  190.       }
  191.       i=0;
  192.      
  193.      }   
  194.          
  195.          
  196.       
  197.               
  198.    }
  199.    
  200.    
  201.    
  202.   if(Key_Scan() == 8)
  203. {
  204.       
  205.    write_command(0x01);
  206.   
  207.    print(1,0,tishi1);
  208.    SCLKTemp();
  209.     while(Key_Scan() != 9)
  210.    {
  211.       tiaojie();
  212.       SCLKTemp();
  213.       
  214.    }
  215. }

  216. else
  217. {   
  218.   Init_12684();
  219.    LCD_Display();
  220. }
  221.   if(Time_buf[1] == Temp[1] && Time_buf[2] == Temp[2] && Time_buf[3] == Temp[3] ) //鬧鐘蜂鳴器
  222. {
  223.    BeepHear();
  224.    
  225. }

  226.   }
  227. }
  228. void BeepHear()
  229. {
  230.    int i = 0;
  231. for(i = 0; i < 200; i++)
  232.   {
  233.    Beep = 0;
  234.   Delay10ms();
  235. }
  236. Beep = 1;

  237. }
  238. void  tiaojie()
  239. {
  240. static unsigned char Place = 0;
  241.   uchar i,j;
  242.      if(K1==0)  //檢測按鍵K1是否按下
  243.      {
  244.       
  245.       Delay10ms(); //消除抖動
  246.       if(K1==0)
  247.       {
  248.        Place++;
  249.       
  250.         for(j = 0; j < Place;j++)//1 2 3 4  5 6 7   //按照的這個結(jié)果是地址成功加到7
  251.         {
  252.          if(Place>=4)   //按鍵可以控制分秒年月日的切換 按鍵按到6的時候可以實現(xiàn)年的切換,之后按鍵到7沒有任何顯示 再按一次重新回到秒的切換
  253.           Place=1;   
  254.          
  255.    
  256.          
  257.          xianshi();
  258.         }
  259.         j = 0;
  260.       }
  261.       
  262.       while((i<50)&&(K1==0))  //檢測按鍵是否松開
  263.       {
  264.        Delay10ms();
  265.        i++;
  266.       }
  267.       i=0;
  268.      }
  269.      
  270.      if(K2==0)  //檢測按鍵K2是否按下
  271.      {
  272.       Delay10ms(); //消除抖動
  273.       if(K2==0)
  274.       {
  275.       
  276.         Temp[Place]++;
  277.        if((Temp[Place]&0x0f)>9)      //換成BCD碼。
  278.        {
  279.         xianshi();
  280.        Temp[Place]=Temp[Place]+6;
  281.        }
  282.        if((Temp[Place]>=0x60)&&(Place<2))  //秒
  283.        {
  284.         Temp[Place]=0;
  285.        }
  286.        if((Temp[Place]>=0x60)&&(Place==2))  //分鐘
  287.        {
  288.         Temp[Place]=0;
  289.        }
  290.        if((Temp[Place]>=0x24)&&(Place==3))  // 小時
  291.        {
  292.         Temp[Place]=0;
  293.        }
  294.       
  295.   //     if(SetPlace==5)  //月只能到12
  296.   //     {
  297.   //      TIME[SetPlace]=;
  298.   //     }
  299.       }
  300.       
  301.       while((i<50)&&(K2==0))  //檢測按鍵是否松開
  302.       {
  303.        Delay10ms();
  304.        i++;
  305.       }
  306.       i=0;
  307.      while(!K2);
  308.      }  

  309.            if(K4==0)  //檢測按鍵K2是否按下
  310.      {
  311.        //xianshi();
  312.       Delay10ms(); //消除抖動
  313.       if(K4==0)
  314.       {
  315.       
  316.         Temp[Place]--; //減法需要將減到到0的時候置為為 0x59之類的
  317.        if((Temp[Place]&0x0f)>9)      //換成BCD碼。
  318.        {
  319.        // xianshi();
  320.        Temp[Place]=Temp[Place]-6;
  321.        }
  322.        if((Temp[Place]<= 0x00)&&(Place < 2))  //分鐘
  323.        {
  324.         Temp[Place]=0x59;
  325.        }
  326.       
  327.        if((Temp[Place]<= 0x00)&&(Place==2))  //分鐘
  328.        {
  329.         Temp[Place]=0x59;
  330.        }
  331.        if((Temp[Place]<= 0x00)&&(Place==3))  // 小時
  332.        {
  333.         Temp[Place]= 0x23;
  334.        }
  335.       
  336.   //     if(SetPlace==5)  //月只能到12
  337.   //     {
  338.   //      TIME[SetPlace]=;
  339.   //     }
  340.       }
  341.       
  342.       while((i<50)&&(K4==0))  //檢測按鍵是否松開
  343.       {
  344.        Delay10ms();
  345.        i++;
  346.       }
  347.       i=0;
  348.       while(!K4);
  349.      
  350.      }   
  351.          
  352.          
  353. }
  354. void main()
  355. {



  356. Beep = 1;
  357. Int0Configuration();   
  358. DS1302();

  359. }

  360. void Int0Configuration()
  361. {
  362. //設置INT0                          //設置外部中斷一,方式為下降沿觸發(fā)
  363. IT0=1;//跳變沿出發(fā)方式(下降沿)
  364. EX0=1;//打開INT0的中斷允許。
  365. EA=1;//打開總中斷
  366. }
  367. void Int0() interrupt 0   
  368. {
  369. static val = 0;
  370.   int i = 2;
  371. if(val == 0)
  372. {
  373.   val = 1;
  374.   DS1302_Data_Input(DS1302_SEC_ADD,0x80);
  375. }
  376. else
  377. {
  378.     DS1302_Write_Time();
  379.      DS1302_Data_Input(DS1302_SEC_ADD,0x00);
  380.   val = 0;
  381. }
  382. val_flag = val;

  383. }
  384. void Delay10ms(void)   //誤差 0us
  385. {
  386.     unsigned char a,b,c;
  387.     for(c=1;c>0;c--)
  388.         for(b=38;b>0;b--)
  389.             for(a=130;a>0;a--);
  390. }
  391. void hanshuming()
  392. {
  393. write_command(0x80);
  394. write_data('2');
  395. write_data('0');
  396. write_data('0'+Time_buf[7]/16);   //年
  397. write_data('0'+(Time_buf[7]&0x0f));
  398. write_data('-');
  399. write_data('0'+Time_buf[5]/16);   //月
  400. write_data('0'+(Time_buf[5]&0x0f));
  401. write_data('-');
  402. write_data('0'+Time_buf[4]/16);
  403. write_data('0'+(Time_buf[4]&0x0f));   //日
  404.    
  405. write_command(0x90);
  406. write_data('0'+Time_buf[3]/16);    //時
  407. write_data('0'+(Time_buf[3]&0x0f));     
  408. write_data('-');
  409. write_data('0'+Time_buf[2]/16);    //分
  410. write_data('0'+(Time_buf[2]&0x0f));
  411. write_data('-');
  412. write_data('0'+Time_buf[1]/16);    //秒
  413. write_data('0'+(Time_buf[1]&0x0f));

  414. }
  415. void SCLKTemp()
  416. {
  417.    
  418. write_command(0x88);
  419. write_data('0'+Temp[3]/16);    //時
  420. write_data('0'+(Temp[3]&0x0f));     
  421. write_data('-');
  422. write_data('0'+Temp[2]/16);    //分
  423. write_data('0'+(Temp[2]&0x0f));
  424. write_data('-');
  425. write_data('0'+Temp[1]/16);    //秒
  426. write_data('0'+(Temp[1]&0x0f));
  427. }
  428. char Key_Scan()
  429. {
  430. static char key=16;
  431. uchar x, y, z;
  432. P1 = 0x0f;                 //置數(shù),行掃描
  433. if(P1 != 0x0f)             //判斷按鍵是否按下
  434. {
  435.   delay(10);               //消抖
  436.   if(P1 != 0X00)           //確定按鍵已經(jīng)按下
  437.   {
  438.    x = P1&0x0f;           //保存按鍵狀態(tài)
  439.    P1 = 0xf0;             //列掃描
  440.    y = P1&0xf0;           //保存按鍵狀態(tài)
  441.    z = x|y;               //取出健值
  442.    switch(z)
  443.    {
  444.     case 0xbd: key=1;break;
  445.     case 0xdd: key=2;break;      
  446.     case 0xed: key=3;break;
  447.    
  448.    
  449.     case 0xdb: key=5;break;      
  450.     case 0xeb: key=6;break;
  451.    
  452.    
  453.     case 0xb7: key=7;break;
  454.    
  455.     case 0xd7: key=8;break;  
  456.     case 0xe7: key=9;break;
  457.    
  458.     default: return 0;
  459.       break;
  460.          
  461.    }
  462.    
  463.   }
  464. }
  465. return key;
  466. }

  467. /*******************************************************************************
  468. * 文件名 : DS1302.c
  469. * 實現(xiàn)功能:DS1302驅(qū)動程序
  470. * 版本     作者            日期            說明
  471. * V1.0     HE             2017/02/06       初始版本
  472. * 描述   : MCU: STC15F2K60S2     晶振:22.1184    MHz
  473.            
  474. *******************************************************************************/  
  475. #include "DS1302.h"

  476. void DHT11();
  477. void Init_12684();
  478. void xianshi();
  479. void Rec_DHTI0();
  480. uchar Read_8bit();
  481. void  LCD_Display();
  482. uchar k,j;
  483. unsigned char Time_buf[8]={0x20,0x50,0x59,0x23,0x24,0x08,0x05,0x20};//年,秒,分,時,日,月,星期,年
  484. //                              _______________

  485. //                         年    秒    分  十    日   月   星期   年
  486. /*******************************************************************************
  487. * 功能描述 : DS1302初始化
  488. * 函數(shù)屬性 : 外部
  489. * 輸入?yún)?shù) : 無
  490. * 返回參數(shù) : 無
  491. * 函數(shù)詳解 :上電運行時,在VCC大于或小于2.5V之前,RST必須
  492. *   保持低電平,只有在SCLK為低電平時,RST才能被置高
  493. *******************************************************************************/
  494. void DS1302_Init()
  495. {
  496. RST = 0;      //片選
  497. SCLK = 0;
  498. }
  499. /*******************************************************************************
  500. * 功能描述 : 數(shù)據(jù)輸入函數(shù)
  501. * 函數(shù)屬性 : 外部
  502. * 輸入?yún)?shù) : 無
  503. * 返回參數(shù) : 無
  504. * 函數(shù)詳解 : 數(shù)據(jù)輸入,一個字節(jié)的輸入將在下8個時鐘周期的上升沿完成,
  505. *    數(shù)據(jù)傳輸從字節(jié)最低位開始
  506. *******************************************************************************/
  507. void DS1302_Data_Input(unsigned char Address,unsigned char Data)  //整個函數(shù)是先寫入地址后寫入數(shù)據(jù)
  508. {
  509. unsigned char i;
  510. RST = 1;//啟動DS1302總線
  511. Address = Address & 0xFE;//最低位置0,寄存器0位時寫,1時讀,這時為寫數(shù)據(jù) 這個時候ADDress的值根本沒有改變
  512. for(i=0;i<8;i++)
  513. {
  514.   SCLK = 0;
  515.   if(Address&0x01)  //判斷最低位是否為高電平 ,如果為高電平,則傳入1給IO口
  516.   {
  517.    DAT = 1;
  518.   }
  519.   else    //判斷最低位的是否為低電平  ,如果為低電平,則傳入0給IO口
  520.   {
  521.    DAT = 0;
  522.   }
  523.   SCLK = 1;//上升沿寫入指令
  524.   Address = Address>>1;   //向右移動移位,依次判斷剩下的高位數(shù)據(jù)
  525. }
  526. for(i=0;i<8;i++)   //寫入數(shù)據(jù)
  527. {
  528.   SCLK = 0;
  529.   if(Data&0x01)
  530.   {
  531.    DAT = 1;
  532.   }
  533.   else
  534.   {
  535.    DAT = 0;
  536.   }
  537.   SCLK = 1;//上升沿寫入數(shù)據(jù)
  538.   Data = Data>>1;
  539. }
  540. SCLK = 0;
  541. RST = 0;//關(guān)閉DS1302總線
  542. }
  543. /*
  544. */
  545. /*******************************************************************************
  546. * 功能描述 : 數(shù)據(jù)輸出函數(shù)
  547. * 函數(shù)屬性 : 外部
  548. * 輸入?yún)?shù) : 無
  549. * 返回參數(shù) : 無
  550. * 函數(shù)詳解 : 數(shù)據(jù)輸出,一個字節(jié)的數(shù)據(jù)將在下個8個時鐘周期的下降沿被輸出。注意第一位輸出
  551. *    是在最后一位控制指令所在的下降沿被輸出,要求RST保持位高電平
  552. *******************************************************************************/
  553. unsigned char DS1302_Data_Output(unsigned char Address)
  554. {
  555. unsigned char i;
  556. unsigned char temp;
  557. RST = 1;
  558. Address = Address | 0x01;
  559. for(i=0;i<8;i++)
  560. {
  561.   SCLK = 0;
  562.   if(Address&0x01)
  563.   {
  564.    DAT = 1;
  565.   }
  566.   else
  567.   {
  568.    DAT = 0;
  569.   }
  570.   SCLK = 1;
  571.   Address = Address>>1;
  572. }

  573. for(i=0;i<8;i++)
  574. {
  575.   SCLK=0;
  576.   temp = temp >> 1;
  577.   if (DAT)
  578.   {
  579.    temp |= 0x80;
  580.   }
  581.   else
  582.   {
  583.    temp &= 0x7F;
  584.   }
  585.   SCLK=1;
  586. }
  587. SCLK=0;
  588. RST = 0;
  589. return temp;

  590. }
  591. /*******************************************************************************
  592. * 功能描述 : 初始化時間
  593. * 函數(shù)屬性 : 外部
  594. * 輸入?yún)?shù) : 無
  595. * 返回參數(shù) : 無
  596. * 函數(shù)詳解 :
  597. *******************************************************************************/
  598. void DS1302_Write_Time(void)
  599. {
  600. DS1302_Data_Input(DS1302_CONTROL_ADD,0x00);  //關(guān)閉寫保護,允許數(shù)據(jù)寫入寄存器,數(shù)據(jù)內(nèi)容為0(寫入允許)
  601. DS1302_Data_Input(DS1302_SEC_ADD,0x80);   //CH位置高,振蕩器停止,置低,振蕩器工作允許
  602. DS1302_Data_Input(DS1302_CHARGER_ADD,0xa9);
  603. //涓流充電,7~4位TCS=1010,使能涓流充電
  604. //3~2位DS=01,選擇一個二極管,DS=10,選擇兩個二極管,等于其他值,均被禁止充電
  605. //1~0位RS=00,無電阻,不能充電,RS=01,2k,RS=10,4k,RS=11,8k

  606. /*初始值*/
  607. DS1302_Data_Input(DS1302_SEC_ADD,Time_buf[1]);  //秒寄存器地址     //后面這個數(shù)組好像是設置一個初始值
  608. DS1302_Data_Input(DS1302_MIN_ADD,Time_buf[2]);  //分鐘寄存器
  609. DS1302_Data_Input(DS1302_HR_ADD,Time_buf[3]);  //時
  610. DS1302_Data_Input(DS1302_DAY_ADD,Time_buf[4]);  //日
  611. DS1302_Data_Input(DS1302_MONTH_ADD,Time_buf[5]); //月
  612. DS1302_Data_Input(DS1302_WEEK_ADD,Time_buf[6]);  //星期
  613. DS1302_Data_Input(DS1302_YEAR_ADD,Time_buf[7]);  //年

  614. DS1302_Data_Input(DS1302_CONTROL_ADD,0x80);   //打開寫保護
  615. }
  616. /*******************************************************************************
  617. * 功能描述 : 讀取時間
  618. * 函數(shù)屬性 : 外部
  619. * 輸入?yún)?shù) : 無
  620. * 返回參數(shù) : 無
  621. * 函數(shù)詳解 :
  622. *******************************************************************************/
  623. void DS1302_Read_Time(void)  
  624. {
  625. Time_buf[1]=(DS1302_Data_Output(DS1302_SEC_ADD))&0x7f; //秒,屏蔽秒的第7位,避免超出59
  626. Time_buf[2]=DS1302_Data_Output(DS1302_MIN_ADD);   //分
  627. Time_buf[3]=DS1302_Data_Output(DS1302_HR_ADD)&0x3F;  //時  3f -- 0011 1111
  628. Time_buf[4]=DS1302_Data_Output(DS1302_DAY_ADD);   //日
  629. Time_buf[5]=DS1302_Data_Output(DS1302_MONTH_ADD);  //月
  630. Time_buf[6]=DS1302_Data_Output(DS1302_WEEK_ADD);  //星期
  631. Time_buf[7]=DS1302_Data_Output(DS1302_YEAR_ADD);  //年
  632. }


  633. sbit led1 = P2^5;
  634. sbit led2 = P2^6;
  635. sbit led3 = P2^7;
  636. sbit DHTI0 = P3^0;
  637. uchar RL_data, RH_data, TH_data, TL_data, CK_data;
  638. uchar undata;

  639. //uchar code lcd[]={"當前的溫濕度"};
  640. uchar code lcd1[]={"溫度:    ℃"};
  641. uchar code lcd2[]={"濕度:    %RH"};
  642. uchar  str1[]={"   "};
  643. uchar  str2[]={"   "};
  644. void delay1s()
  645. {  
  646.     int i ,j;
  647.     for(i = 0;i<110; ++i)
  648.     {
  649.    for(j = 0;j<1000;++j)
  650.        {;}
  651.   }
  652. }

  653. void Rec_DHTI0()
  654. {
  655. //主機信號
  656. DHTI0 = 1;        //拉高
  657. Delay1000ms();   //延時1s以上 等待狀態(tài)穩(wěn)定
  658. DHTI0 = 0;        //拉低
  659. Delay18ms();     //主機拉低25Ms
  660. DHTI0 = 1;        //拉高
  661. Delay40us();  //主機拉高40us
  662. //從機響應信號
  663. if(!DHTI0)
  664. {
  665.     while(!DHTI0);    //while(!0)==(1)判斷從機是否發(fā)出80毫秒的低電平響應信號
  666.    while(DHTI0);     //判斷從機是否發(fā)出80毫秒的高電平 , 發(fā)出則開始采集數(shù)據(jù)
  667.     RH_data = Read_8bit();  //溫度整數(shù)部分
  668.     RL_data = Read_8bit();  //溫度小數(shù)部分
  669.     TH_data = Read_8bit();  //濕度整數(shù)部分
  670.     TL_data = Read_8bit();  //濕度小數(shù)部分
  671.     CK_data = Read_8bit();  //校驗位
  672.   
  673.     undata = RH_data + RL_data + TH_data + TL_data; //校驗獲取的數(shù)據(jù)
  674. }
  675. //濕度整數(shù) (溫濕度傳感器存在疑惑)
  676. str1[0] = (char)(0x30 + RH_data/10);   //0x30將數(shù)字0-9轉(zhuǎn)化為字符0-9
  677. str1[1] = (char)(0x30 + RH_data%10);
  678. //溫度整數(shù)
  679. str2[0] = (char)(0x30 + TH_data/10);
  680. str2[1] = (char)(0x30 + TH_data%10);

  681. if(TH_data > 30)  //溫度報警
  682. {
  683.    BeepHear();
  684. }


  685. }
  686. uchar Read_8bit()
  687. {
  688. uint i;
  689. uchar temp = 0;
  690. uchar dat;
  691. for(i = 0;i < 8;i++)
  692. {
  693.   //以下部分判斷數(shù)據(jù)是0或是1
  694.   while(!DHTI0);  //等待50毫秒的低電平結(jié)束
  695.   Delay30us();
  696.    temp = 0;
  697.   if(DHTI0 == 1)
  698.   {
  699.    temp = 1;
  700.   }
  701.   while(DHTI0);   //等待高電平結(jié)束
  702.    dat<<=1;
  703.   dat = dat|temp;
  704. }
  705. return dat;
  706. }
  707. void  LCD_Display()
  708. {
  709.    

  710.     hanshuming();
  711.     print(3,1,lcd1);
  712.     print(4,1,lcd2);
  713. //  溫度
  714. for(j = 0;j < 2;j++)
  715. {
  716.    //ad_ope(uchar x,uchar y)
  717.   ad_ope(3,j+4);  //顯示位置,第3行,j為0或1,j+4為第幾位開始顯示
  718.   write_data(str2[j]);   //void write_data(uchar dat)
  719. }
  720. //  濕度
  721. for(k = 0;k < 2;k++)
  722. {
  723.   ad_ope(4,k+4);
  724.    write_data(str1[k]);
  725. }
  726. }
  727. void xianshi()
  728. {
  729.     //點亮第一個燈
  730.     led1 = 0;
  731.     led2 = 1;
  732.     led3 = 1;
  733.    
  734. //延時1s
  735.    delay1s();
  736.     //點亮第二個燈
  737.     led1 = 1;
  738.     led2 = 0;
  739.     led3 = 1;
  740.    
  741.     //延時1s
  742. delay1s();
  743.    
  744.     //點亮剩余的燈
  745.    
  746.     led1 = 1;
  747.     led2 = 1;
  748.     led3 = 0;
  749.    
  750. //延時1s
  751.    delay1s();
  752.     led1 = 1;
  753.     led2 = 1;
  754.     led3 = 1;
  755.    
  756. //延時1s
  757.    delay1s();
  758.     led1 = 1;
  759.     led2 = 1;
  760.     led3 = 1;
  761. //延時1s
  762. delay1s();
  763.    
  764. }
復制代碼



  1.            
  2. /*******************************************************************************/  
  3. #ifndef __DS1302_H__
  4. #define __DS1302_H__

  5. #include "all.h"
  6. sbit SCLK =  P4^4;//串行時鐘輸入端口
  7. sbit DAT  =  P4^2;//數(shù)據(jù)IO端口
  8. sbit RST  =  P4^1;//復位輸入端

  9. sbit K1=P3^4;
  10. sbit K2=P3^5;
  11. sbit K3=P3^2;  //右上角是這個按鍵電燈,觸發(fā)了外部中斷0
  12. sbit K4=P3^3;  //管腳接線

  13. #define  DS1302_SEC_ADD   0x80//秒
  14. #define  DS1302_MIN_ADD   0x82//分
  15. #define  DS1302_HR_ADD   0x84//時
  16. #define  DS1302_DAY_ADD   0x86//日
  17. #define  DS1302_MONTH_ADD  0x88//月
  18. #define  DS1302_WEEK_ADD   0x8A//星期
  19. #define  DS1302_YEAR_ADD   0x8C//年
  20. #define  DS1302_CONTROL_ADD  0x8E//控制
  21. #define  DS1302_CHARGER_ADD  0x90//涓流充電      
  22. #define  DS1302_CLKBURST_ADD  0xBE//時鐘多字節(jié)

  23. extern void DS1302_Init();             //初始化DS1302
  24. extern void DS1302_Data_Input(unsigned char Address,unsigned char Data); //數(shù)據(jù)輸入
  25. extern unsigned char DS1302_Data_Output(unsigned char Address);    //數(shù)據(jù)輸出
  26. extern void DS1302_Write_Time(void);          //寫入初始化時間
  27. extern void DS1302_Read_Time(void);           //讀取時間

  28. #endif
復制代碼
下載: 15可以設置鬧鐘時間的加減溫度報警.zip (152.89 KB, 下載次數(shù): 19)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人av在线播放 | 日本人爽p大片免费看 | 免费视频二区 | 91av视频在线 | 欧美日韩综合视频 | 久久久久国产精品 | 久久中文字幕视频 | 97国产精品视频人人做人人爱 | 久久黄色网 | 日韩aⅴ在线观看 | 欧美不卡一区二区三区 | 91在线精品秘密一区二区 | 五月天婷婷狠狠 | 狠狠躁夜夜躁人人爽天天高潮 | 日韩一区二区三区在线 | av香蕉| av在线一区二区三区 | 亚洲精品小视频在线观看 | 久久精品成人 | 亚洲一区二区三区免费在线观看 | 另类专区亚洲 | 99免费视频 | 亚洲91精品 | 国产丝袜一区二区三区免费视频 | 午夜影院在线观看视频 | 一区二区国产精品 | 欧美激情精品久久久久久 | 国产xxxx在线| 亚洲天堂影院 | 国产精彩视频 | 中文字幕一区二区三区在线视频 | 波霸ol一区二区 | 色视频网站免费 | 成人不卡视频 | 精品久久久久久亚洲精品 | 久久国产视频播放 | 久久精品国产一区二区电影 | 亚洲一区在线日韩在线深爱 | 婷婷综合在线 | av网站免费在线观看 | 日韩精品在线观看一区二区三区 |