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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機讀取單總線AM2301溫濕度源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:154876 發(fā)表于 2018-12-3 13:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    單片機讀取AM2301程序

單片機源程序如下:
  1. //****************************************************************//
  2. //單片機 :AT89S52 或 STC89C52RC
  3. // 功能  :串口發(fā)送溫濕度數(shù)據(jù)  波特率 9600
  4. // 晶振  :12M (用戶系統(tǒng)時鐘如不是12M 請更改相關宏定義及注釋的延時時間)
  5. //****************************************************************//

  6. #include "reg52.h"
  7. #include <intrins.h>

  8. //用戶根據(jù)自己的晶振修改相應值
  9. #define FOSC  12000000
  10. #define BAUD  9600

  11. //讀傳感器 端口位定義,可修改
  12. sbit Sensor_SDA = P1^0;
  13. //sbit Sensor_SCL = P1^1;

  14. // 變量定義
  15. unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
  16. unsigned char Sensor_Check;                  //校驗和

  17. unsigned char Sensor_AnswerFlag;  //收到起始標志位
  18. unsigned char Sensor_ErrorFlag;   //讀取傳感器錯誤標志
  19. unsigned int  Sys_CNT;
  20. unsigned int  Tmp;

  21. unsigned char *String;

  22. //字符串定義
  23. #define S_Temp "Temp:"
  24. #define S_RH   "RH:"
  25. #define S_CRCT "Check: True"
  26. #define S_CRCF "Check: Wrong"
  27. #define S_Data "Data: "
  28. #define S_NotS "Sensor Not Connected"

  29. /********************************************\
  30. |* 功能: 延時        晶振為12M時                                    *|
  31. |*  t = 1 為 20us  然后成倍增加10us左右                *|
  32. \********************************************/
  33. void Delay_N10us(unsigned char t)
  34. {
  35.     while(t--)
  36.    {
  37.             _nop_();
  38.    }
  39. }
  40. /********************************************\
  41. |* 功能: 延時        晶振為12M時                                        *|
  42. |* 延時大約 1ms                                                            *|
  43. \********************************************/
  44. void Delay_N1ms(unsigned int t)
  45. {
  46.   unsigned int i;
  47.   unsigned int j;
  48.   for(j=t;j>0;j--)
  49.      for(i=124;i>0;i--);  //延時大約 1ms
  50. }
  51. /********************************************\
  52. |* 功能: 初始化串口                                            *|
  53. \********************************************/
  54. void InitUART(void)
  55.   {
  56.     unsigned int iTmpBaud;
  57.     unsigned long lTmpBaud;
  58.     iTmpBaud = 0;
  59.     //首先選定定時器2作為波特率發(fā)生器,16位定時器,自動裝載
  60.     SCON = 0x50;        //SM0 SM1 SM2 REN TB8 RB8 TI RI                //0   1   0   1   0   0   0  0       
  61.           PCON = 0x00;        //PCON的地址是87H,這里SMOD =0

  62.           T2CON = 0x30;        //TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) //0 0 1 1 0 0 0 0
  63.           T2MOD = 0x00;        // /        /        /        /                /        /        T2OE        DCEN   //0 0 0 0 0 0 0 0

  64.           lTmpBaud = FOSC/BAUD;
  65.           lTmpBaud /= 32;                                                //12T-mode
  66.           iTmpBaud = lTmpBaud & 0xFFFF;               
  67.           iTmpBaud = 65536 - iTmpBaud;
  68.           RCAP2H = (iTmpBaud>>8) & 0x0FF;
  69.           RCAP2L = iTmpBaud & 0x0FF;

  70.           RI = 0;                        //清除接收中斷標志
  71.           REN = 1;                //允許串行接收
  72.           ES = 1;                        //允許串行中斷
  73.           TR2 = 1;                //啟動定時器1

  74.           EA=1;//開總中斷
  75.   }  

  76. /********************************************\
  77. |* 功能: 串口發(fā)送函數(shù)                                     *|
  78. \********************************************/
  79. void UARTSend(char UCHAR)
  80.   {
  81.     SBUF=UCHAR;
  82.     while(TI==0);
  83.     TI=0;
  84.   }
  85. /********************************************\
  86. |* 功能: 串口中斷函數(shù)                                     *|
  87. \********************************************/
  88. void UARTRead(void) interrupt 4
  89.   {
  90.     char temp;
  91.     if(RI)
  92.     {
  93.       RI=0;
  94.       temp = SBUF;
  95.     }
  96.   }
  97. /********************************************\
  98. |* 功能: 串口發(fā)送子函數(shù)                                 *|
  99. \********************************************/
  100. void UART_PutString(unsigned char *buf)
  101.   {
  102.         while(*buf)
  103.       UARTSend(*buf++);
  104.   }
  105. void UART_PutStringAndNum(unsigned char *buf ,unsigned int num)
  106.   {
  107.         unsigned char a[3],i;
  108.         a[3] = '0'+num%10;
  109.         a[2] = '.';
  110.         a[1] = '0'+num/10%10;
  111.         a[0] = '0'+num/100%10;
  112.         while(*buf)
  113.       UARTSend(*buf++);
  114.         UARTSend(' ');
  115.          for(i=0;i<4;i++)
  116.         {
  117.                 UARTSend(a[i]);
  118.         }
  119.   }
  120. void UART_PutStringAnd_Data(unsigned char *buf ,unsigned char *bufdata)
  121.   {
  122.         unsigned char a[2],i,j;
  123.         while(*buf)
  124.       UARTSend(*buf++);
  125.         UARTSend(' ');
  126.         for(i=0;i<5;i++)
  127.         {
  128.                 a[0] = bufdata[i]/16;
  129.                 a[1] = bufdata[i]%16;
  130.                 for(j=0;j<2;j++)
  131.                 {
  132.                   if(a[j]>9)
  133.                   {
  134.                     a[j] = (a[j]-10)+'A';
  135.                   }
  136.                   else
  137.                   {
  138.                     a[j] = a[j]+'0';
  139.                   }
  140.                   UARTSend(a[j]);
  141.                 }
  142.                 UARTSend(' ');
  143.         }
  144.   }
  145. /********************************************\
  146. |* 功能: 串口發(fā)送傳感器數(shù)據(jù)函數(shù)                         *|
  147. \********************************************/
  148. void UARTSend_Nbyte(void)
  149.   {
  150.            if(Sensor_AnswerFlag == 1)
  151.            {
  152.               Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
  153.                   //校驗成功
  154.                   if(Sensor_Check ==Sensor_Data[4])       
  155.                   {
  156.                      String = S_RH;//"RH:";          
  157.                  Tmp = Sensor_Data[0]*256+Sensor_Data[1];          
  158.                  UART_PutStringAndNum(String,Tmp);
  159.                             UARTSend(' ');
  160.                  UARTSend(' ');
  161.                 
  162.                          String = S_Temp;// "Temp:";          
  163.                         Tmp = Sensor_Data[2]*256+Sensor_Data[3];          
  164.                  UART_PutStringAndNum(String,Tmp);
  165.                             UARTSend(' ');
  166.                  UARTSend(' ');

  167.                      String = S_CRCT;//"Check: True";
  168.                      UART_PutString(String);
  169.                   }else        //校驗失敗 送上讀到數(shù)據(jù)
  170.                   {
  171.              String = S_Data;//"Data: ";
  172.                      UART_PutStringAnd_Data(String,Sensor_Data);
  173.                          UARTSend(' ');       
  174.                          UARTSend(' ');
  175.                          String = S_CRCF;//"Check: Wrong";
  176.                      UART_PutString(String);
  177.                   }
  178.                 }// 傳感器未連接
  179.                 else
  180.                 {
  181.                    String = S_NotS; //"Sensor Not Connected";
  182.                    UART_PutString(String);
  183.                 }            
  184.             UARTSend(0x0A);

  185.   }  
  186. void Clear_Data (void)
  187.   {
  188.         int i;
  189.         for(i=0;i<5;i++)
  190.         {
  191.            Sensor_Data[i] = 0x00;
  192.          }//接收數(shù)據(jù)清零
  193.   }


  194. /********************************************\
  195. |* 功能: 讀傳感器發(fā)送的單個字節(jié)                *|
  196. \********************************************/
  197. unsigned char Read_SensorData(void)
  198.   {
  199.         unsigned char i,cnt;
  200.         unsigned char buffer,tmp;
  201.         buffer = 0;
  202.         for(i=0;i<8;i++)
  203.         {
  204.                 cnt=0;
  205.                 while(!Sensor_SDA)        //檢測上次低電平是否結束
  206.                 {
  207.                   if(++cnt >= 300)
  208.                    {
  209.                           break;
  210.                    }
  211.                 }
  212.                 //延時Min=26us Max50us 跳過數(shù)據(jù)"0" 的高電平
  213.                 Delay_N10us(2);         //延時30us   
  214.                
  215.                 //判斷傳感器發(fā)送數(shù)據(jù)位
  216.                 tmp =0;
  217.                 if(Sensor_SDA)         
  218.                 {
  219.                   tmp = 1;
  220.                 }  
  221.                 cnt =0;
  222.                 while(Sensor_SDA)                //等待高電平 結束
  223.                 {
  224.                            if(++cnt >= 200)
  225.                         {
  226.                           break;
  227.                         }
  228.                 }
  229.                 buffer <<=1;
  230.                 buffer |= tmp;       
  231.         }
  232.         return buffer;
  233.   }

  234. /********************************************\
  235. |* 功能: 讀傳感器                              *|
  236. \********************************************/
  237. unsigned char Read_Sensor(void)
  238.   {
  239.         unsigned char i;
  240.         //主機拉低(Min=800US Max=20Ms)
  241.     Sensor_SDA = 0;
  242.         Delay_N1ms(2);  //延時2Ms
  243.           
  244.         //釋放總線 延時(Min=30us Max=50us)
  245.         Sensor_SDA = 1;        
  246.         Delay_N10us(1);//延時30us
  247.         //主機設為輸入 判斷傳感器響應信號
  248.         Sensor_SDA = 1;
  249.                
  250.         Sensor_AnswerFlag = 0;  // 傳感器響應標志         

  251.         //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行          
  252.         if(Sensor_SDA ==0)
  253.         {
  254.            Sensor_AnswerFlag = 1;//收到起始信號
  255.            Sys_CNT = 0;
  256.            //判斷從機是否發(fā)出 80us 的低電平響應信號是否結束         
  257.            while((!Sensor_SDA))
  258.            {
  259.              if(++Sys_CNT>300) //防止進入死循環(huán)
  260.                  {
  261.                    Sensor_ErrorFlag = 1;
  262.                    return 0;
  263.                   }
  264.             }
  265.             Sys_CNT = 0;
  266.             //判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
  267.             while((Sensor_SDA))
  268.             {
  269.                if(++Sys_CNT>300) //防止進入死循環(huán)
  270.                    {
  271.                      Sensor_ErrorFlag = 1;
  272.                      return 0;
  273.                    }
  274.             }                  
  275.             // 數(shù)據(jù)接收        傳感器共發(fā)送40位數(shù)據(jù)
  276.             // 即5個字節(jié) 高位先送  5個字節(jié)分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和
  277.             // 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位
  278.             for(i=0;i<5;i++)
  279.             {
  280.               Sensor_Data[i] = Read_SensorData();
  281.             }
  282.           }
  283.           else
  284.           {
  285.             Sensor_AnswerFlag = 0;          // 未收到傳感器響應       
  286.           }
  287.           return 1;
  288.   }   

  289. void main(void)
  290. {
  291.   //Sensor_SCL = 0;
  292.   InitUART();  //初始串口發(fā)送函數(shù)
  293.   while(1)
  294.   {
  295.         Clear_Data();         // 清除收到數(shù)據(jù)
  296.         Read_Sensor();                  // 讀取傳感器數(shù)據(jù)
  297.         UARTSend_Nbyte();          // 串口發(fā)送讀到傳感器數(shù)據(jù)
  298.     Delay_N1ms(2000);          // 延時 2S(兩次讀取間隔至少2S)
  299.   }
  300. }
復制代碼

所有資料51hei提供下載:
讀AM2301程序.zip (35.47 KB, 下載次數(shù): 21)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:466108 發(fā)表于 2019-1-10 21:38 | 只看該作者
濕度傳感器怎么連接單片機啊?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费人成激情视频在线观看冫 | 亚洲精品久久久久中文字幕二区 | 成人黄色av | 超碰在线人人 | 激情自拍偷拍 | 天天操天天拍 | 日韩在线播放网址 | 精品视频免费 | 成人精品一区二区三区中文字幕 | 亚洲狠狠 | 一区二区久久精品 | 成年人网站免费 | 99精品国产一区二区三区 | 激情视频一区 | 99久久99 | 中文字幕亚洲欧美日韩在线不卡 | 在线亚洲一区 | www.国产| 国产中文一区二区三区 | 又爽又黄axxx片免费观看 | 91在线精品视频 | 免费观看av | 国产一区精品在线 | 91视频日本| 亚洲视频一区二区三区 | 国产成人精品免费 | av网站免费观看 | 亚洲国产高清高潮精品美女 | 国产福利在线 | 国产偷录视频叫床高潮对白 | 久久成人免费 | 国产成人精品免高潮在线观看 | 欧美精品91 | 男女视频91 | 97久久精品午夜一区二区 | 精品日韩一区二区 | 中文字幕1区2区3区 日韩在线视频免费观看 | 国产成人一区二区三区电影 | 99久久久久久 | 在线欧美视频 | 亚洲高清视频在线观看 |