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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6562|回復: 4
打印 上一主題 下一主題
收起左側

AM2302濕度測量單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:260016 發表于 2017-12-14 20:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用AM2302溫濕度傳感器模塊,達到測量濕度和溫度目的,并在1602上顯示出來。

單片機源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. uchar code table[]="     WELCOME ";
  6. uchar code table1[]="RH:      %";
  7. uchar code table2[]="Sensor Not";
  8. uchar code table3[]="Connected";
  9. uchar code table4[]="Check wrong";

  10. sbit Sensor_SDA = P2^0;

  11. sbit key_set=P2^1;
  12. sbit key_up=P2^2;
  13. sbit key_down=P2^3;
  14. sbit key_ok=P2^4;

  15. sbit lcdrs=P2^6;
  16. sbit lcdwr=P2^5;
  17. sbit lcden=P2^7;

  18. uchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
  19. uchar Sensor_AnswerFlag;  //收到起始標志位
  20. uchar Sensor_ErrorFlag;   //讀取傳感器錯誤標志
  21. uchar Sensor_Check;                  //校驗和
  22. uint Sys_CNT;
  23. uint Tmp;
  24. uint t0;
  25. uchar num;
  26. uchar flag;

  27. void delay(uint z)
  28. {
  29.         uint x,y;
  30.         for(x=z;x>0;x--)
  31.                 for(y=123;y>0;y--);
  32. }

  33. /********************************************\
  34. |* 功能: 延時        晶振為12M時                                    *|
  35. |*  t = 1 為 20us  然后成倍增加10us左右                *|
  36. \********************************************/
  37. void Delay_N10us(unsigned char t)
  38. {
  39.     while(t--)
  40.    {
  41.             _nop_();
  42.    }
  43. }
  44. /********************************************\
  45. |* 功能: 延時        晶振為12M時                                        *|
  46. |* 延時大約 1ms                                                            *|
  47. \********************************************/
  48. void Delay_N1ms(unsigned int t)
  49. {
  50.   unsigned int i;
  51.   unsigned int j;
  52.   for(j=t;j>0;j--)
  53.      for(i=124;i>0;i--);  //延時大約 1ms
  54. }
  55. void write_com(uchar com)
  56. {
  57.         lcdrs=0;
  58.         P0=com;
  59.         lcden=1;
  60.         delay(5);
  61.         lcden=0;
  62. }
  63. void write_date(uchar date)
  64. {
  65.         lcdrs=1;
  66.         P0=date;
  67.         lcden=1;
  68.         delay(5);
  69.         lcden=0;
  70. }
  71. void diyihang(uint z)
  72. {
  73.         z--;
  74.         write_com(0x80+z);
  75. }           
  76. void dierhang(uint z)
  77. {
  78.         z--;
  79.         write_com(0x80+0x40+z);
  80. }
  81. void init_1602()
  82. {
  83.         lcdwr=0;
  84.         lcden=0;
  85.         write_com(0x38);//模式
  86.         write_com(0x0c);//無光標不閃
  87.         write_com(0x01);//清屏
  88.         diyihang(1);//顯示位置
  89.         for(num=0;num<11;num++)
  90.         {
  91.                 write_date(table[num]);
  92.                 //delay(10);
  93.         }
  94.         dierhang(1);//換行顯示
  95.         for(num=0;num<10;num++)
  96.         {
  97.                 write_date(table1[num]);               
  98.                 //delay(10);
  99.         }
  100. }
  101. void Clear_Data (void)
  102. {
  103.         int i;
  104.         for(i=0;i<5;i++)
  105.         {
  106.            Sensor_Data[i] = 0x00;
  107.         }//接收數據清零
  108. }


  109. /********************************************\
  110. |* 功能: 讀傳感器發送的單個字節                *|
  111. \********************************************/
  112. unsigned char Read_SensorData(void)
  113. {
  114.         unsigned char i,cnt;
  115.         unsigned char buffer,tmp;
  116.         buffer = 0;
  117.         for(i=0;i<8;i++)
  118.         {
  119.                 cnt=0;
  120.                 while(!Sensor_SDA)        //檢測上次低電平是否結束
  121.                 {
  122.                   if(++cnt >= 300)
  123.                    {
  124.                           break;
  125.                    }
  126.                 }
  127.                 //延時Min=26us Max50us 跳過數據"0" 的高電平
  128.                 Delay_N10us(2);         //延時30us   
  129.                
  130.                 //判斷傳感器發送數據位
  131.                 tmp =0;
  132.                 if(Sensor_SDA)         
  133.                 {
  134.                   tmp = 1;
  135.                 }  
  136.                 cnt =0;
  137.                 while(Sensor_SDA)                //等待高電平 結束
  138.                 {
  139.                            if(++cnt >= 200)
  140.                         {
  141.                           break;
  142.                         }
  143.                 }
  144.                 buffer <<=1;
  145.                 buffer |= tmp;        
  146.         }
  147.         return buffer;
  148.   }

  149. /********************************************\
  150. |* 功能: 讀傳感器                              *|
  151. \********************************************/
  152. unsigned char Read_Sensor(void)
  153. {        
  154.         unsigned char i;
  155.         //主機拉低(Min=800US Max=20Ms)
  156.     Sensor_SDA = 0;
  157.         Delay_N1ms(2);  //延時2Ms
  158.          
  159.         //釋放總線 延時(Min=30us Max=50us)
  160.         Sensor_SDA = 1;         
  161.         Delay_N10us(1);//延時30us
  162.         //主機設為輸入 判斷傳感器響應信號
  163.         Sensor_SDA = 1;
  164.                
  165.         Sensor_AnswerFlag = 0;  // 傳感器響應標志         

  166.         //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行         
  167.         if(Sensor_SDA == 0)
  168.         {
  169.            Sensor_AnswerFlag = 1;//收到起始信號
  170.            
  171.            Sys_CNT = 0;
  172.            //判斷從機是否發出 80us 的低電平響應信號是否結束         
  173.            while((!Sensor_SDA))
  174.            {
  175.              if(++Sys_CNT>300) //防止進入死循環
  176.                  {
  177.                    Sensor_ErrorFlag = 1;
  178.                    return 0;
  179.                  }
  180.            }
  181.            
  182.             Sys_CNT = 0;
  183.             //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  184.             while((Sensor_SDA))
  185.             {
  186.                if(++Sys_CNT>300) //防止進入死循環
  187.                    {
  188.                      Sensor_ErrorFlag = 1;
  189.                      return 0;
  190.                    }
  191.             }                  
  192.             // 數據接收        傳感器共發送40位數據
  193.             // 即5個字節 高位先送  5個字節分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和
  194.             // 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位
  195.             for(i=0;i<5;i++)
  196.             {
  197.               Sensor_Data[i] = Read_SensorData();
  198.             }
  199.         }
  200.         else
  201.         {
  202.           Sensor_AnswerFlag = 0;          // 未收到傳感器響應        
  203.         }
  204.         return 1;
  205. }
  206. void display()
  207. {
  208.         Tmp = Sensor_Data[2]*256+Sensor_Data[3];
  209.         diyihang(6);
  210.         /*write_date(Tmp/100%10 + '0');
  211.         write_date(Tmp/10%10 + '0');
  212.         write_date('.');
  213.         write_date(Tmp%10 + '0'); */

  214.         Tmp = Sensor_Data[0]*256+Sensor_Data[1];
  215.         dierhang(6);
  216.         write_date(Tmp/100%10 + '0');
  217.         write_date(Tmp/10%10 + '0');
  218.         write_date('.');
  219.         write_date(Tmp%10 + '0');
  220. }
  221. void check_and_display()
  222. {
  223.         if(Sensor_AnswerFlag == 1)
  224.         {
  225.                 Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
  226.                 //校驗成功
  227.                 if(Sensor_Check ==Sensor_Data[4])        
  228.                 {
  229.                         if(flag == 1)
  230.                         {
  231.                                 flag = 0;
  232.                                 write_com(0x01);//清屏
  233.                                 diyihang(1);//顯示位置
  234.                                 for(num=0;num<11;num++)
  235.                                 {
  236.                                         write_date(table[num]);
  237.                                         //delay(10);
  238.                                 }
  239.                                 dierhang(1);//換行顯示
  240.                                 for(num=0;num<10;num++)
  241.                                 {
  242.                                         write_date(table1[num]);               
  243.                                         //delay(10);
  244.                                 }
  245.                         }
  246.                         display();
  247.                 }
  248.                 else        //校驗失敗
  249.                 {
  250.                          write_com(0x01);//清屏
  251.                         diyihang(1);//顯示位置
  252.                         for(num=0;num<11;num++)
  253.                         {
  254.                                 write_date(table4[num]);
  255.                                 //delay(10);
  256.                         }
  257.                         flag=1;
  258.                 }
  259.         }
  260.             else    //沒有連接上
  261.     {
  262.     key_set=0;
  263.         write_com(0x01);//清屏
  264.         diyihang(1);//顯示位置
  265.         for(num=0;num<10;num++)
  266.         {
  267.             write_date(table2[num]);
  268.             //delay(10);
  269.         }
  270.         dierhang(1);//換行顯示
  271.         for(num=0;num<9;num++)
  272.         {
  273.             write_date(table3[num]);        
  274.             //delay(10);
  275.         }
  276.         flag=1;
  277.     }   
  278. }

  279. /*void init_t0()
  280. {
  281.     TMOD=0x01;
  282.     TH0=(65536-50000)/256;
  283.     TL0=(65536-50000)%256;
  284.     EA=1;
  285.     ET0=1;
  286.     TR0=1;
  287. }*/

  288. void main()
  289. {
  290.     init_1602();
  291.     while(1)
  292.     {
  293.         Delay_N1ms(2000);      // 延時 2S(兩次讀取間隔至少2S)
  294.         Clear_Data();         // 清除收到數據
  295.         Read_Sensor();          // 讀取傳感器數據
  296.         check_and_display();  // 檢測并顯示數據   
  297.     }
  298. }
  299. …………
  300. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
濕度.zip (35.71 KB, 下載次數: 99)


評分

參與人數 2黑幣 +51 收起 理由
siyaqq + 1 淡定
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:104846 發表于 2018-8-23 20:35 | 只看該作者
這個和http://www.zg4o1577.cn/bbs/dpj-103762-1.html的程序是一樣的
回復

使用道具 舉報

板凳
ID:261062 發表于 2019-5-5 14:47 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:345795 發表于 2019-6-9 12:13 | 只看該作者
謝謝感謝
回復

使用道具 舉報

5#
ID:916445 發表于 2021-5-7 16:09 | 只看該作者
無法在LCD1602上顯示溫濕度,不知道是我電路有問題 還是程序有問題
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产中文字幕 | 台湾av在线 | 国产亚洲精品区 | 在线成人精品视频 | 精品国产精品国产偷麻豆 | 免费观看的黄色网址 | 欧美xxxx黑人又粗又长 | 精品久久九九 | 在线欧美亚洲 | 欧美视频免费在线观看 | 国产亚洲欧美在线 | 逼逼网| 亚洲一区二区三区在线 | a免费视频 | 日韩av视屏 | 精品欧美一区二区中文字幕视频 | 黄色一级片视频 | 精品国产91乱码一区二区三区 | 日韩黄a| 红桃成人在线 | 欧美日韩精品综合 | 三级特黄特色视频 | 国产精品一区二区日韩 | 小川阿佐美pgd-606在线 | 91精品国产综合久久久密闭 | 青青草华人在线视频 | 久久99精品国产麻豆婷婷 | 日本高清在线一区 | 日韩欧美中文 | 午夜男人天堂 | www免费视频| 亚洲精品在线免费播放 | 成人网av | 九九色综合 | 一区二区免费看 | 91亚洲精品国偷拍自产在线观看 | 久久6视频 | 青青草一区二区三区 | 精品久久香蕉国产线看观看亚洲 | 亚洲第一视频网站 | 欧美精品1区2区3区 免费黄篇 |