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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AM2320_I2C溫濕度51單片機程序

  [復制鏈接]
跳轉到指定樓層
樓主

包含:
AM2320_I2C.C文件
AM2320_I2C.h頭文件

51單片機源程序如下:
  1. //****************************************************************//
  2. //               AM系列讀IIC使用范例
  3. //單片機 :AT89S52 或 STC89C52RC
  4. // 功能  :串口發送溫濕度數據  波特率 9600
  5. // 晶振  :12M (用戶系統時鐘如不是12M 請更改相關宏定義及注釋的延時時間)
  6. // 編譯環境:  Keil3
  7. // 公司  :奧松電子   
  8. //****************************************************************//

  9. #include "STC15W4K.h"
  10. #include "AM2320_I2C.h"
  11. #include <intrins.h>

  12. //端口位定義,可修改
  13. //sbit AM2320_SDA = P3^4;
  14. //sbit AM2320_SCL = P3^5;
  15. //器件地址
  16. #define IIC_Add 0xB8
  17. #define IIC_RX_Length 8
  18. //內部數據定義
  19. unsigned char idata IIC_TX_Buffer[]={0x03,0x00,0x04}; //讀溫濕度命令(無CRC校驗)
  20. unsigned char idata IIC_RX_Buffer[IIC_RX_Length] = {0x00};//讀回的溫濕度

  21. unsigned char *String;
  22. unsigned char WR_Flag;

  23. //***************************************************
  24. void delay10us()                //@18.432MHz這個延時函數 要大于5US以上
  25. {
  26.         unsigned char i;

  27.         _nop_();
  28.         _nop_();
  29.         i = 43;
  30.         while (--i);
  31. }
  32. //***************************************************
  33. void Delay2ms()                //@18.432MHz
  34. {
  35.         unsigned char i, j;

  36.         i = 36;
  37.         j = 217;
  38.         do{
  39.                 while (--j);
  40.         } while (--i);
  41. }
  42. //**********************************************
  43. //送起始位 AM2320_SDA =1->0
  44. void I2C_Start()
  45. {
  46.   AM2320_SDA =1;
  47.   AM2320_SCL=1;
  48.   delay10us();
  49.   AM2320_SDA =0;
  50.   delay10us();
  51.   AM2320_SCL=0;
  52. }
  53. //************************************************
  54. //送停止位 AM2320_SDA =0->1
  55. void I2C_Stop()
  56. {
  57.    AM2320_SDA =0;
  58.    delay10us();
  59.    AM2320_SCL=1;
  60.    delay10us();
  61.    AM2320_SDA =1;
  62. }
  63. //************************************************
  64. //主應答(包含ack:AM2320_SDA =0和no_ack:AM2320_SDA =0)
  65. void Ack()
  66. {  
  67.    AM2320_SDA =0;//設置AM2320_SDA  口為輸出
  68.    AM2320_SCL=0;
  69.    delay10us();
  70.    AM2320_SCL=1;
  71.    delay10us();        
  72.    AM2320_SCL=0;
  73.    AM2320_SDA =1;
  74. }
  75. //***************************************************
  76. void NoAck()
  77. {  
  78.    AM2320_SDA =1;  //設置AM2320_SDA  口為輸出
  79.    AM2320_SCL=0;
  80.    delay10us();
  81.    AM2320_SCL=1;
  82.    delay10us();
  83.    AM2320_SDA =1;
  84.    AM2320_SCL=0;
  85. }
  86. //***************************************************
  87. // 檢測 AM2320_SDA 是否回ACK
  88. bit Test_Ack()
  89. {  //設置AM2320_SDA 口為輸入
  90.    bit ACK_Flag=0;
  91.    AM2320_SCL=0;
  92.    AM2320_SDA =1;   
  93.    delay10us();
  94.    AM2320_SCL=1;
  95.    delay10us();
  96.    if(AM2320_SDA ==0) ACK_Flag = 1;
  97.    else ACK_Flag = 0;
  98.    AM2320_SCL=0;
  99.    return ACK_Flag;
  100. }
  101. //*************************************************
  102. //字節發送程序
  103. //發送c(可以是數據也可是地址),送完后接收從應答
  104. //不考慮從應答位
  105. void SendData(unsigned char buffer)
  106. {
  107.    unsigned char BitCnt=8;//一字節8位
  108.    //設置AM2320_SDA  口為輸出
  109.    do{
  110.            AM2320_SCL=0;
  111.           delay10us();
  112.       if((buffer&0x80)==0) AM2320_SDA =0;//判斷最高位是0還是1
  113.       else AM2320_SDA =1;
  114.       AM2320_SCL=1;
  115.           delay10us();
  116.       buffer=buffer<<1;//將buffer中的數據左移一位
  117.       BitCnt--;
  118.    }
  119.    while(BitCnt);
  120.    AM2320_SCL=0;        
  121. }
  122. //**************************************************
  123. //字節接收程序
  124. //接收器件傳來的數據,此程序應配合|主應答函數|i2c_ack_main()使用
  125. //return: uchar型1字節
  126. unsigned char ReceiveData()
  127. {
  128.   unsigned char BitCnt=8,IIC_RX_Data=0;
  129.   unsigned char temp=0;
  130.   AM2320_SDA =1;           //讀入數據 設置AM2320_SDA  口為輸入
  131.   do{
  132.      AM2320_SCL=0;
  133.          delay10us();  
  134.          IIC_RX_Data=_crol_(IIC_RX_Data,1);   //數據左移一位
  135.          BitCnt--;         
  136.          AM2320_SCL=1;
  137.          delay10us();
  138.      if(AM2320_SDA ==1) IIC_RX_Data = IIC_RX_Data|0x01;  //低位置1
  139.      else IIC_RX_Data = IIC_RX_Data&0x0fe; //低位清0            
  140.    }
  141.    while(BitCnt);
  142.    AM2320_SCL=0;
  143.    return IIC_RX_Data;
  144. }
  145. //***************************************************
  146. bit WriteNByte(unsigned char sla,unsigned char *ss,unsigned char nn)
  147. {
  148.    unsigned char ii;
  149.    
  150.    I2C_Start();  //啟動I2C
  151.    SendData(sla);//發送器件地址
  152.    if(!Test_Ack()){        
  153.       WR_Flag = 1;
  154.           return(0);
  155.    }
  156.    for(ii=0;ii<nn;ii++){//寫入8字節數據
  157.       SendData(*(ss+ii));
  158.           if(!Test_Ack()){
  159.             WR_Flag = 1;
  160.                 return(0);
  161.           }
  162.    }
  163.    I2C_Stop();
  164.    return(1);
  165. }
  166. //***************************************************
  167. bit ReadNByte(unsigned char Sal, unsigned char *pp,unsigned char nn)
  168. {
  169.   unsigned char ii;

  170.   I2C_Start();    // 啟動I2C
  171.   SendData((Sal)| 0x01); //發送器件地址
  172.   if(!Test_Ack()){
  173.           WR_Flag = 1;
  174.         return(0);
  175.   }
  176.   delay10us();  
  177.   delay10us();
  178.   delay10us(); // 延時時間必須大于30us 只要大于 30us 以上的值都可以 但是最好不要太長 ,測試時,試過25MS都OK!
  179.         
  180.   for(ii=0;ii<nn-1;ii++){  //讀取字節數據
  181.      *(pp+ii)=ReceiveData(); //讀取數據
  182.      Ack();
  183.   }
  184.   *(pp+nn-1)=ReceiveData();        
  185.   NoAck();
  186.   I2C_Stop();
  187.   return(1);         
  188. }
  189. //***************************************************
  190. ///計算CRC校驗碼        
  191. unsigned int CRC16(unsigned char *ptr, unsigned char len)
  192. {
  193.    unsigned int crc=0xffff;
  194.    unsigned char i;
  195.    while(len--){
  196.        crc ^=*ptr++;
  197.        for(i=0;i<8;i++){
  198.                if(crc & 0x1){
  199.                       crc>>=1;
  200.                           crc^=0xa001;
  201.                    }
  202.                    else{
  203.                       crc>>=1;
  204.                    }
  205.            }
  206.    }
  207.    return crc;
  208. }
  209. //***************************************************
  210. ///檢測CRC校驗碼是否正確
  211. unsigned char CheckCRC(unsigned char *ptr,unsigned char len)
  212. {
  213.   unsigned int crc;
  214.         crc=(unsigned int)CRC16(ptr,len-2);
  215.         if(ptr[len-1]==(crc>>8) && ptr[len-2]==(crc & 0x00ff)) return 0xff;
  216.         else return 0x0;
  217. }
  218. //***************************************************
  219. void Waken()
  220. {

  221.         I2C_Start();       // 啟動I2C
  222.         SendData(IIC_Add); // 發送器件地址
  223.         Test_Ack();               // 喚醒指令時 傳感器不會回ACK 但是第一定要發檢測ACK的時鐘 否則會出錯
  224.         Delay2ms();       // 至少延時1個Ms        說明書里,有個最大值 ,實際當中 你只要大于1MS
  225. ……………………

  226. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
AM2320_I2C.zip (2.68 KB, 下載次數: 156)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:228391 發表于 2017-8-19 14:32 | 只看該作者
謝謝分享3333333333333
回復

使用道具 舉報

無效樓層,該帖已經被刪除
無效樓層,該帖已經被刪除
5#
ID:246282 發表于 2017-12-15 20:27 | 只看該作者
謝謝分享,用89C52RC可以,但是換了12C5A60S2或者STC15就是怎么也不行,正好對照一下試試。
回復

使用道具 舉報

6#
ID:195568 發表于 2017-12-27 11:43 | 只看該作者
謝謝分享,我學習一下
回復

使用道具 舉報

7#
ID:267777 發表于 2017-12-27 15:39 | 只看該作者
謝謝分享,學習了 哈哈哈
回復

使用道具 舉報

8#
ID:156204 發表于 2018-5-10 16:29 | 只看該作者
下載不了了,幣也扣了
回復

使用道具 舉報

9#
ID:437789 發表于 2018-12-23 15:32 | 只看該作者
學習了。
回復

使用道具 舉報

10#
ID:471763 發表于 2019-1-22 18:06 | 只看該作者
好好學習一下
回復

使用道具 舉報

11#
ID:364538 發表于 2019-2-24 10:46 | 只看該作者
程序不完整樣的。
回復

使用道具 舉報

12#
無效樓層,該帖已經被刪除
13#
ID:484008 發表于 2019-3-4 08:46 | 只看該作者
謝謝分享
回復

使用道具 舉報

14#
ID:581122 發表于 2019-7-9 18:38 | 只看該作者
謝謝分享,很有用的資源
回復

使用道具 舉報

15#
ID:407603 發表于 2019-8-6 15:06 | 只看該作者
下來看看 正好有要用到
回復

使用道具 舉報

16#
無效樓層,該帖已經被刪除
17#
無效樓層,該帖已經被刪除
18#
無效樓層,該帖已經被刪除
19#
無效樓層,該帖已經被刪除
20#
ID:970754 發表于 2021-10-9 15:58 | 只看該作者
為什么發送和接收數據要左移
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清一区二区 | 国产成人精品一区二区三区在线 | 国产在线永久免费 | 91国内精精品久久久久久婷婷 | 亚洲精品1区 | 亚洲国产精品美女 | 日本免费视频 | 国产jizz女人多喷水99 | 欧美午夜精品久久久久久浪潮 | 超碰精品在线观看 | 中文无吗 | 亚欧洲精品在线视频免费观看 | 亚洲综合免费 | 国产免费拔擦拔擦8x高清 | 999精品视频在线观看 | 亚洲欧美中文日韩在线v日本 | ww亚洲ww亚在线观看 | 欧美一区二区三区精品免费 | 天天综合网天天综合色 | 国产欧美久久一区二区三区 | 亚洲男女视频在线观看 | www.色五月.com | 在线精品亚洲欧美日韩国产 | 成人国产精品久久 | 最近日韩中文字幕 | 五月婷婷激情网 | 九七午夜剧场福利写真 | 国产精品免费福利 | 91精品久久久久久久 | 在线一区视频 | 天堂色综合 | 超碰成人在线观看 | 国产精品久久久久久久久久久久午夜片 | 欧美精品一区二区蜜桃 | 青青草原综合久久大伊人精品 | 日韩高清一区二区 | 日本午夜免费福利视频 | 久久久久国产精品人 | 国产高清自拍视频在线观看 | 国产一区二区在线视频 | 久久久久久久一区二区三区 |