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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機AM2302濕度溫度+lcd1602+藍牙

  [復制鏈接]
跳轉到指定樓層
樓主
經過幾天的努力,終于搞出了89C51單片機控制AM2302濕度溫度傳感器+lcd1602+藍牙上顯示!
被店家坑死嘍,還好我會改電路,把傳感器模塊的電路改為單總線模式,接法如圖:(一定記得接地哦)

實物圖:


手繪電路原理圖:


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


這是部分程序:

  1. /*
  2. humidity  RH就是相對濕度        日常生活中所指的濕度為相對濕度,%rh表示
  3. 溫度(temperature)
  4. */

  5. #include<reg52.h>
  6. #include <intrins.h>
  7. #define uint unsigned int
  8. #define uchar unsigned char

  9. //uchar code table[]="    WELCOME ";
  10. uchar code table0[]="T:       'C";
  11. uchar code table1[]="RH:      %";
  12. uchar code table2[]="Sensor Not";
  13. uchar code table3[]="Connected";
  14. uchar code table4[]="Check wrong";

  15. sbit Sensor_SDA = P3^4;
  16. sbit lcdrs=P1^3;
  17. sbit lcdwr=P1^4;
  18. sbit lcden=P1^5;
  19. /*
  20. sbit lcdrs=P2^6;
  21. sbit lcdwr=P2^5;
  22. sbit lcden=P2^7;
  23. */
  24. uchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
  25. uchar Sensor_AnswerFlag;  //收到起始標志位
  26. uchar Sensor_ErrorFlag;   //讀取傳感器錯誤標志
  27. uchar Sensor_Check;                  //校驗和
  28. uint Sys_CNT;
  29. uint Tmp;
  30. uint T;
  31. uint Rh;
  32. uint t0;
  33. uchar num;
  34. uchar flag;

  35. void sendDataToProcessing(char symbol, int dat);                //串發送數據
  36. void Init_Timer0(void);//定時器初始化


  37. //串口發送函數
  38. void sendDataToProcessing(char symbol, int dat )
  39. {
  40.     putchar(symbol);              
  41.         printf("%d\r\n",dat);                                       
  42. }


  43. void UART_Init(void)
  44. {
  45.     SCON=0X50;                        //設置為工作方式1
  46.         TMOD=0X20;                        //設置計數器工作方式2
  47.         PCON=0X80;                        //波特率加倍
  48.         TH1=0XF3;                                //計數器初始值設置,注意波特率是4800的
  49.         TL1=0XF3;
  50. //        ES=1;                                                //打開接收中斷
  51. //        EA=1;                                                //打開總中斷
  52.         TR1=1;                                        //打開計數器
  53. }
  54. char putchar(unsigned char dat)
  55. {
  56.         TI=0;
  57.         SBUF=dat;
  58.         while(!TI);
  59.         TI=0;
  60.         return SBUF;
  61. }


  62.   //延時函數
  63. void delay(uint z)
  64. {
  65.         uint x,y;
  66.         for(x=z;x>0;x--)
  67.                 for(y=123;y>0;y--);
  68. }

  69. /********************************************\
  70. |* 功能: 延時        晶振為12M時                                    *|
  71. |*  t = 1 為 20us  然后成倍增加10us左右                *|
  72. \********************************************/
  73. void Delay_N10us(unsigned char t)
  74. {
  75.     while(t--)
  76.    {
  77.             _nop_();
  78.    }
  79. }
  80. /********************************************\
  81. |* 功能: 延時        晶振為12M時                                        *|
  82. |* 延時大約 1ms                                                            *|
  83. \********************************************/
  84. void Delay_N1ms(unsigned int t)
  85. {
  86.   unsigned int i;
  87.   unsigned int j;
  88.   for(j=t;j>0;j--)
  89.      for(i=124;i>0;i--);  //延時大約 1ms
  90. }
  91. void write_com(uchar com)                 //寫入命令
  92. {
  93.         lcdrs=0;
  94.         P0=com;
  95.         lcden=1;
  96.         delay(5);
  97.         lcden=0;
  98. }
  99. void write_date(uchar date)                 //寫入數據
  100. {
  101.         lcdrs=1;
  102.         P0=date;
  103.         lcden=1;
  104.         delay(5);
  105.         lcden=0;
  106. }
  107. void diyihang(uint z)                          //第一行
  108. {
  109.         z--;
  110.         write_com(0x80+z);
  111. }           
  112. void dierhang(uint z)                           //第二行
  113. {
  114.         z--;
  115.         write_com(0x80+0x40+z);
  116. }                                                                          
  117. void init_1602()                                        //1602初始化
  118. {
  119.         lcdwr=0;
  120.         lcden=0;
  121.         write_com(0x38);//模式
  122.         write_com(0x0c);//無光標不閃
  123.         write_com(0x01);//清屏

  124.         diyihang(1);                                                //顯示位置 第一行
  125.         for(num=0;num<11;num++)
  126.         {
  127.                 write_date(table0[num]);                         //顯示"    溫度 ";
  128.                 //delay(10);
  129.         }
  130.         
  131.         dierhang(1);                                                //換行顯示 第二行
  132.         for(num=0;num<10;num++)
  133.         {
  134.                 write_date(table1[num]);                          //顯示"RH:      %";
  135.                 //delay(10);
  136.         }
  137. }
  138. void Clear_Data (void)                                         
  139. {
  140.         int i;
  141.         for(i=0;i<5;i++)
  142.         {
  143.            Sensor_Data[i] = 0x00;
  144.         }                                                                        //接收數據清零
  145. }


  146. /********************************************\
  147. |* 功能: 讀傳感器發送的單個字節                *|
  148. \********************************************/
  149. unsigned char Read_SensorData(void)                         //讀取傳感器信號
  150. {
  151.         unsigned char i,cnt;
  152.         unsigned char buffer,tmp;
  153.         buffer = 0;
  154.         for(i=0;i<8;i++)
  155.         {
  156.                 cnt=0;
  157.                 while(!Sensor_SDA)        //檢測上次低電平是否結束
  158.                 {
  159.                   if(++cnt >= 300)
  160.                    {
  161.                           break;
  162.                    }
  163.                 }
  164.                 //延時Min=26us Max50us 跳過數據"0" 的高電平
  165.                 Delay_N10us(2);         //延時30us   
  166.                
  167.                 //判斷傳感器發送數據位
  168.                 tmp =0;
  169.                 if(Sensor_SDA)         
  170.                 {
  171.                   tmp = 1;
  172.                 }  
  173.                 cnt =0;
  174.                 while(Sensor_SDA)                //等待高電平 結束
  175.                 {
  176.                            if(++cnt >= 200)
  177.                         {
  178.                           break;
  179.                         }
  180.                 }
  181.                 buffer <<=1;
  182.                 buffer |= tmp;        
  183.         }
  184.         return buffer;
  185.   }

  186. /********************************************\
  187. |* 功能: 讀傳感器                              *|
  188. \********************************************/
  189. unsigned char Read_Sensor(void)
  190. {        
  191.         unsigned char i;
  192.         //主機拉低(Min=800US Max=20Ms)
  193.     Sensor_SDA = 0;
  194.         Delay_N1ms(2);  //延時2Ms
  195.          
  196.         //釋放總線 延時(Min=30us Max=50us)
  197.         Sensor_SDA = 1;         
  198.         Delay_N10us(2);//延時30us
  199.         //主機設為輸入 判斷傳感器響應信號
  200.         Sensor_SDA = 1;
  201.                
  202.         Sensor_AnswerFlag = 0;  // 傳感器響應標志         

  203.         //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行         
  204.         if(Sensor_SDA == 0)
  205.         {
  206.            Sensor_AnswerFlag = 1;//收到起始信號
  207.            
  208.            Sys_CNT = 0;
  209.            //判斷從機是否發出 80us 的低電平響應信號是否結束         
  210.            while((!Sensor_SDA))
  211.            {
  212.              if(++Sys_CNT>300) //防止進入死循環
  213.                  {
  214.                    Sensor_ErrorFlag = 1;
  215.                    return 0;
  216.                  }
  217.            }
  218.            
  219.             Sys_CNT = 0;
  220.             //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  221.             while((Sensor_SDA))
  222.             {
  223.                if(++Sys_CNT>300) //防止進入死循環
  224.                    {
  225.                      Sensor_ErrorFlag = 1;
  226.                      return 0;
  227.                    }
  228.             }                  

  229.                                                                                                 /*****************************************************************************************\
  230.                                                                                                 |*      // 數據接收        傳感器共發送40位數據                                                                                                  *|
  231.                                                                                                 |*            // 即5個字節 高位先送  5個字節分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和         *|
  232.                                                                                                 |*            // 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位                                       *|
  233.                                                                                                 \*****************************************************************************************/
  234.             for(i=0;i<5;i++)
  235.             {
  236.               Sensor_Data[i] = Read_SensorData();
  237.             }
  238.         }
  239.         else
  240.         {
  241.           Sensor_AnswerFlag = 0;          // 未收到傳感器響應        
  242.         }
  243.         return 1;
  244. }
  245. void display()                                                                         //顯示
  246. {
  247.         Tmp = Sensor_Data[2]*256+Sensor_Data[3];        // 溫度高位 溫度低位
  248.         T=Tmp/10;
  249.         diyihang(5);                                                                  //第一行第5個位置開始顯示
  250.         write_date(Tmp/100%10 + '0');                                        //十位
  251.         write_date(Tmp/10%10 + '0');                                        //個位
  252.         write_date('.');                                                                //小數點
  253.         write_date(Tmp%10 + '0');                                                 //小數位

  254.         Tmp = Sensor_Data[0]*256+Sensor_Data[1];         //濕度高位 濕度低位
  255.         Rh=Tmp/10;
  256.         dierhang(5);                                                                 //第二行第5個位置開始顯示
  257.         write_date(Tmp/100%10 + '0');                                        //十位
  258.         write_date(Tmp/10%10 + '0');                                        //個位
  259.         write_date('.');                                                                //小數點
  260.         write_date(Tmp%10 + '0');                                                 //小數位
  261. }
  262. void check_and_display()
  263. {
  264.         if(Sensor_AnswerFlag == 1)
  265.         {
  266.                 Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
  267.                                                                                                         
  268.                 if(Sensor_Check ==Sensor_Data[4])        /*校驗成功        */
  269.                 {
  270.                         if(flag == 1)
  271.                         {
  272.                                 flag = 0;
  273.                                 write_com(0x01);//清屏
  274.                                 diyihang(1);//顯示位置
  275.                                 for(num=0;num<11;num++)
  276.                                 {
  277.                                         write_date(table0[num]);         //顯示溫度
  278.                                         //delay(10);
  279.                                 }
  280.                                 dierhang(1);//換行顯示
  281.                                 for(num=0;num<10;num++)
  282.                                 {
  283.                                         write_date(table1[num]); //顯示RH:....%
  284.                                         //delay(10);
  285.                                 }
  286.                         }
  287.                         display();                                                                  //顯示溫度  濕度
  288.                 }
  289.                 else                                                                /*校驗失敗*/
  290.                 {        
  291.                          write_com(0x01);//清屏
  292.                         diyihang(1);//顯示位置
  293.                         for(num=0;num<10;num++)
  294.                         {
  295.                                 write_date(table4[num]);        //顯示 Check wrong
  296.                                 //delay(10);
  297.                         }
  298.                         flag=1;
  299.                 }
  300.         }
  301.         else                                                                    /*沒有連接上 */
  302.         {
  303.                 write_com(0x01);//清屏
  304.                 diyihang(1);//顯示位置
  305.                 for(num=0;num<10;num++)
  306.                 {
  307.                         write_date(table2[num]);           //顯示 Sensor Not
  308.                         //delay(10);
  309.                 }
  310.                 dierhang(1);//換行顯示
  311.                 for(num=0;num<8;num++)
  312.                 {
  313.                         write_date(table3[num]);                //顯示  Connected
  314.                         //delay(10);
  315.                 }
  316.                 flag=1;
  317.         }        
  318. }

  319. /*void init_t0()
  320. {
  321.         TMOD=0x01;
  322.         TH0=(65536-50000)/256;
  323.         TL0=(65536-50000)%256;
  324.         EA=1;
  325.         ET0=1;
  326.         TR0=1;
  327. }*/

  328. void main()
  329. {        Init_Timer0();
  330.         UART_Init();                          //串口初始化
  331.         init_1602();
  332.         while(1)
  333.         {
  334.                  

  335.                 Delay_N1ms(2000);          // 延時 2S(兩次讀取間隔至少2S)
  336.                 Clear_Data();         // 清除收到數據
  337.                 Read_Sensor();                  // 讀取傳感器數據         
  338.                 check_and_display();  // 檢測并顯示數據         
  339.                 sendDataToProcessing('T',T);   //發送脈率值
  340.                 sendDataToProcessing('H',Rh);   //發送脈率值
  341.         }
  342. }
  343. /*------------------------------------------------
  344.                     定時器初始化子程序
  345. ------------------------------------------------*/
  346. void Init_Timer0(void)
  347. {
  348. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  349. //TH0=0x00;              //給定初值
  350. //TL0=0x00;
  351. EA=1;            //總中斷打開
  352. ET0=1;           //定時器中斷打開
  353. TR0=1;           //定時器開關打開
  354. }
  355. /*------------------------------------------------
  356.                  定時器中斷子程序
  357. ------------------------------------------------*/
  358. void Timer0_isr(void) interrupt 1
  359. {
  360. static unsigned int num;
  361. TH0=(65536-2000)/256;                  //重新賦值 2ms
  362. TL0=(65536-2000)%256;

  363. num++;
  364. if(num==300)        
  365.    {
  366.     num=0;
  367.         }
  368. }
復制代碼

全部資料51hei下載地址:

濕度 溫度 藍牙 lcd1602.zip

44.64 KB, 下載次數: 77, 下載積分: 黑幣 -5

程序

電路.zip

160.99 KB, 下載次數: 40, 下載積分: 黑幣 -5

原理圖,封裝圖

AM2302模塊資料.zip

2.77 MB, 下載次數: 35, 下載積分: 黑幣 -5

單總線方式

評分

參與人數 3黑幣 +113 收起 理由
siyaqq + 5 很給力!
a752333902 + 8
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:289262 發表于 2018-3-9 11:14 | 只看該作者
非常感謝!。咱們互相幫助吧。

非常好的資料。 下載學習下
回復

使用道具 舉報

板凳
ID:208271 發表于 2018-3-18 14:15 | 只看該作者
樓主,DHT22說明書上不是說1腳VCC,2腳SDA,4腳GND,3腳懸空的嗎?
是要把3,4接到GND才能準確讀數嗎
回復

使用道具 舉報

地板
ID:208271 發表于 2018-3-18 14:17 | 只看該作者
樓主,DHT22說明書上不是說1:VCC  2:SDA   3.NC   4.GND 的嗎?是要將3,4接GND才能正確讀數嗎?急
回復

使用道具 舉報

5#
ID:104846 發表于 2018-8-23 09:32 | 只看該作者
//樓主,DHT22說明書上不是說1:VCC  2:SDA   3.NC   4.GND 的嗎?是要將3,4接GND才能正確讀數嗎?急//
3腳接不接都可以,本來就是空腳。
回復

使用道具 舉報

6#
ID:104846 發表于 2018-8-23 17:06 | 只看該作者
附件的程序有問題,和帖子的內容有差異,對不上!
回復

使用道具 舉報

7#
ID:186936 發表于 2018-10-28 20:23 | 只看該作者
有沒有藍牙E4A相關的資料
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区四区不卡 | 亚洲精品一 | 丝袜 亚洲 欧美 日韩 综合 | 男女视频免费 | 亚洲vs天堂 | 91在线影院 | 中文字幕在线观看第一页 | 欧美精品中文字幕久久二区 | 亚洲成人中文字幕 | 欧美精品一区在线发布 | 福利一区二区 | 天天夜天天操 | 国内av在线 | 久久国产综合 | 久久久久国产一区二区三区四区 | 成人欧美一区二区三区在线播放 | 亚洲一区二区三区国产 | 欧洲一级黄| 国产精品特级毛片一区二区三区 | 91porn成人精品 | 久色视频在线观看 | 午夜天堂 | 国产视频第一页 | 国产精品久久久久无码av | 日本精品一区二区三区在线观看 | www.99re5.com| 高清色| 久久精品99国产精品 | 天天av天天好逼 | 欧美高清视频一区 | 成人精品视频在线观看 | 免费毛片网站 | 成人免费在线播放 | 午夜一区二区三区在线观看 | 欧美一级精品片在线看 | 精品日韩在线 | 国产精品久久网 | a级免费黄色片 | 91久久精品一区二区三区 | 精品久久国产 | 色婷婷久久 |