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

標(biāo)題: AM2320_I2C溫濕度51單片機(jī)程序 [打印本頁(yè)]

作者: JNXNKJ    時(shí)間: 2017-7-29 11:21
標(biāo)題: AM2320_I2C溫濕度51單片機(jī)程序

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

51單片機(jī)源程序如下:
  1. //****************************************************************//
  2. //               AM系列讀IIC使用范例
  3. //單片機(jī) :AT89S52 或 STC89C52RC
  4. // 功能  :串口發(fā)送溫濕度數(shù)據(jù)  波特率 9600
  5. // 晶振  :12M (用戶系統(tǒng)時(shí)鐘如不是12M 請(qǐng)更改相關(guān)宏定義及注釋的延時(shí)時(shí)間)
  6. // 編譯環(huán)境:  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. //內(nèi)部數(shù)據(jù)定義
  19. unsigned char idata IIC_TX_Buffer[]={0x03,0x00,0x04}; //讀溫濕度命令(無(wú)CRC校驗(yàn))
  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這個(gè)延時(shí)函數(shù) 要大于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. //主應(yīng)答(包含ack:AM2320_SDA =0和no_ack:AM2320_SDA =0)
  65. void Ack()
  66. {  
  67.    AM2320_SDA =0;//設(shè)置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;  //設(shè)置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. // 檢測(cè) AM2320_SDA 是否回ACK
  88. bit Test_Ack()
  89. {  //設(shè)置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. //字節(jié)發(fā)送程序
  103. //發(fā)送c(可以是數(shù)據(jù)也可是地址),送完后接收從應(yīng)答
  104. //不考慮從應(yīng)答位
  105. void SendData(unsigned char buffer)
  106. {
  107.    unsigned char BitCnt=8;//一字節(jié)8位
  108.    //設(shè)置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中的數(shù)據(jù)左移一位
  117.       BitCnt--;
  118.    }
  119.    while(BitCnt);
  120.    AM2320_SCL=0;        
  121. }
  122. //**************************************************
  123. //字節(jié)接收程序
  124. //接收器件傳來(lái)的數(shù)據(jù),此程序應(yīng)配合|主應(yīng)答函數(shù)|i2c_ack_main()使用
  125. //return: uchar型1字節(jié)
  126. unsigned char ReceiveData()
  127. {
  128.   unsigned char BitCnt=8,IIC_RX_Data=0;
  129.   unsigned char temp=0;
  130.   AM2320_SDA =1;           //讀入數(shù)據(jù) 設(shè)置AM2320_SDA  口為輸入
  131.   do{
  132.      AM2320_SCL=0;
  133.          delay10us();  
  134.          IIC_RX_Data=_crol_(IIC_RX_Data,1);   //數(shù)據(jù)左移一位
  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();  //啟動(dòng)I2C
  151.    SendData(sla);//發(fā)送器件地址
  152.    if(!Test_Ack()){        
  153.       WR_Flag = 1;
  154.           return(0);
  155.    }
  156.    for(ii=0;ii<nn;ii++){//寫入8字節(jié)數(shù)據(jù)
  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();    // 啟動(dòng)I2C
  171.   SendData((Sal)| 0x01); //發(fā)送器件地址
  172.   if(!Test_Ack()){
  173.           WR_Flag = 1;
  174.         return(0);
  175.   }
  176.   delay10us();  
  177.   delay10us();
  178.   delay10us(); // 延時(shí)時(shí)間必須大于30us 只要大于 30us 以上的值都可以 但是最好不要太長(zhǎng) ,測(cè)試時(shí),試過(guò)25MS都OK!
  179.         
  180.   for(ii=0;ii<nn-1;ii++){  //讀取字節(jié)數(shù)據(jù)
  181.      *(pp+ii)=ReceiveData(); //讀取數(shù)據(jù)
  182.      Ack();
  183.   }
  184.   *(pp+nn-1)=ReceiveData();        
  185.   NoAck();
  186.   I2C_Stop();
  187.   return(1);         
  188. }
  189. //***************************************************
  190. ///計(jì)算CRC校驗(yàn)碼        
  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. ///檢測(cè)CRC校驗(yàn)碼是否正確
  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();       // 啟動(dòng)I2C
  222.         SendData(IIC_Add); // 發(fā)送器件地址
  223.         Test_Ack();               // 喚醒指令時(shí) 傳感器不會(huì)回ACK 但是第一定要發(fā)檢測(cè)ACK的時(shí)鐘 否則會(huì)出錯(cuò)
  224.         Delay2ms();       // 至少延時(shí)1個(gè)Ms        說(shuō)明書里,有個(gè)最大值 ,實(shí)際當(dāng)中 你只要大于1MS
  225. ……………………

  226. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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



作者: ppa8086xp    時(shí)間: 2017-8-19 14:32
謝謝分享3333333333333
作者: yayuncn    時(shí)間: 2017-12-15 20:27
謝謝分享,用89C52RC可以,但是換了12C5A60S2或者STC15就是怎么也不行,正好對(duì)照一下試試。
作者: dragon_gao    時(shí)間: 2017-12-27 11:43
謝謝分享,我學(xué)習(xí)一下
作者: 903039401    時(shí)間: 2017-12-27 15:39
謝謝分享,學(xué)習(xí)了 哈哈哈
作者: 5swords    時(shí)間: 2018-5-10 16:29
下載不了了,幣也扣了
作者: sdfadfadf    時(shí)間: 2018-12-23 15:32
學(xué)習(xí)了。
作者: 飛翔的啥    時(shí)間: 2019-1-22 18:06
好好學(xué)習(xí)一下
作者: chenfengfa    時(shí)間: 2019-2-24 10:46
程序不完整樣的。
作者: 15195858826    時(shí)間: 2019-3-4 08:46
謝謝分享
作者: FADST    時(shí)間: 2019-7-9 18:38
謝謝分享,很有用的資源
作者: jasonact    時(shí)間: 2019-8-6 15:06
下來(lái)看看 正好有要用到
作者: YANGZHONGYI    時(shí)間: 2021-10-9 15:58
為什么發(fā)送和接收數(shù)據(jù)要左移




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一区二区三区四区不卡视频 | 久久久精品久久久 | 国产免费自拍 | 毛片一级黄色 | 高清一区二区三区 | 一区天堂 | 免费毛片网站在线观看 | 精品久久久久久久久久久久久久 | 婷婷一级片 | 91精品国产高清一区二区三区 | 91视视频在线观看入口直接观看 | 在线免费观看日本视频 | 国产精品久久久久久久久久久新郎 | 欧美一级黄色片 | 日韩福利在线 | 国产免费一区二区 | 日韩精品一二三 | 亚洲欧美国产视频 | 久草在线在线精品观看 | 欧美一级二级视频 | 亚洲精品一区二三区不卡 | 国产欧美日韩一区二区三区在线观看 | 色网在线看 | 色综合久久久 | 99精品视频在线观看 | 四虎永久影院 | 精品视频久久久久久 | 色网站入口 | 国产欧美精品一区二区三区 | a毛片| 免费观看黄色一级片 | 亚洲视频在线免费观看 | 国产精品免费一区二区三区 | 日韩久久久久久久久久久 | 一级做a爰片性色毛片视频停止 | 国产精品久久久久影院色老大 | 久久一二区 | 免费在线观看一区二区 | 日韩精品一区在线 | 亚洲欧美日韩成人在线 | 亚洲欧美自拍偷拍视频 |