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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

apd9930接近傳感器STM32 IIC源碼

  [復制鏈接]
跳轉到指定樓層
樓主
apd9930接近傳感器IIC源碼C  stm32平臺


單片機源程序如下:
  1. /*******************************************************************************
  2. *Filename:       apd9930.c
  3. *Revised:        $Date: 2017-11-16 15:23 $
  4. *Author:             double       
  5. *Description:    溫濕度傳感器驅動
  6. *******************************************************************************
  7. *************************引腳配置**********************************************
  8. *******************************************************************************
  9. *                  
  10. *            --------------------
  11. *           |                PB8 |-->   SCL
  12. *           |                PB9 |-->   SDA
  13. *            --------------------
  14. *******************************************************************************/

  15. #include "apd9930.h"

  16. #define DISTANCE_DOWN_VLAUE                                1000                                        //距離的界限值
  17. unsigned char Distance_status = 0;
  18. unsigned char status[2];
  19.         unsigned short distance;
  20.        
  21. #define DISTANCE_READ_TIMES                        3
  22. unsigned char  DistanceReadCnt = 0;                                                        //ADC讀取計數
  23. unsigned int  diatnce_vlaue[2*DISTANCE_READ_TIMES];                //讀取值

  24. unsigned char  init_APDS9930(void);
  25. /*******************************************************************************
  26. * @fn        apd9930_init
  27. *
  28. * @brief    初始化
  29. *
  30. * @return  none
  31. *
  32. ******************************************************************************/
  33. void apd9930_init(void){
  34.        
  35. //  SCL_OUT();
  36.        
  37.         GPIO_InitTypeDef GPIO_InitStructure;

  38.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  39.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                        //推挽輸出
  41.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  42.         GPIO_SetBits(GPIOB, GPIO_Pin_8);
  43.        
  44.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  45.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  46.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                        //浮空輸入,或者改成上拉輸入
  47.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  48.        
  49. //  __HAL_RCC_GPIOB_CLK_ENABLE();
  50. //        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

  51. //  GPIO_InitStruct.Pin = GPIO_PIN_8;
  52. //  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  53. //  GPIO_InitStruct.Pull = GPIO_NOPULL;
  54. //  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  55. //  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  56. //       
  57. //        GPIO_InitStruct.Pin = GPIO_PIN_9;
  58. //  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  59. //  GPIO_InitStruct.Pull = GPIO_NOPULL;
  60. //  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  61. //  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  62.         delay_us(150);
  63.         init_APDS9930();
  64. }


  65. void APD9930_SDA_IN(void){
  66.         GPIO_InitTypeDef GPIO_InitStructure;
  67.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  68.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  69.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                        //浮空輸入,或者改成上拉輸入
  70.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  71. }
  72. void APD9930_SDA_OUT(void)
  73. {
  74.         GPIO_InitTypeDef GPIO_InitStructure;
  75.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  76.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  77.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                        //推挽輸出
  78.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  79. }

  80. void APD9930_SDA_H(void)
  81. {
  82.   APD9930_SDA_OUT();
  83.   APD9930_IIC_SDA_H;
  84. }
  85. void APD9930_SDA_L(void)
  86. {
  87.   APD9930_SDA_OUT();
  88.   APD9930_IIC_SDA_L;
  89. }
  90. unsigned char APD9930_SDA_Read(void)
  91. {
  92.   APD9930_SDA_IN();
  93.   return APD9930_READ_SDA;
  94. }
  95. void APD9930_SCL_H(void)
  96. {
  97.     APD9930_IIC_SCL_H;
  98. }
  99. void APD9930_SCL_L(void)
  100. {
  101.     APD9930_IIC_SCL_L;
  102. }


  103. void APD9930_i2c_delay(void)
  104. {
  105.   unsigned int z;
  106.        
  107.         for(z=0;z<10;z++);
  108.         //2M時鐘,一個指令周期就行。測量速度是20ms讀取完數據
  109.         __nop();
  110. }


  111. unsigned char APD9930_i2c_star(void)
  112. {
  113.   APD9930_SDA_H();
  114.   APD9930_SCL_H();
  115.   APD9930_i2c_delay();
  116.   if (!APD9930_SDA_Read())
  117.     return 1;
  118.   APD9930_SDA_L();
  119.   APD9930_i2c_delay();
  120.   if (APD9930_SDA_Read())
  121.     return 1;
  122.   APD9930_SDA_L();
  123.   APD9930_SCL_L();
  124.   APD9930_i2c_delay();
  125.   return 0;
  126. }

  127. void APD9930_i2c_stop(void)
  128. {
  129.   APD9930_SCL_L();
  130.   APD9930_i2c_delay();
  131.   APD9930_SDA_L();
  132.   APD9930_i2c_delay();
  133.   APD9930_SCL_H();
  134.   APD9930_i2c_delay();
  135.   APD9930_SDA_H();
  136.   APD9930_i2c_delay();
  137. }

  138. void APD9930_i2c_ack(void)
  139. {
  140.   APD9930_SCL_L();
  141.   APD9930_i2c_delay();
  142.   APD9930_SDA_L();
  143.   APD9930_i2c_delay();
  144.   APD9930_SCL_H();
  145.   APD9930_i2c_delay();
  146.   APD9930_SCL_L();
  147.   APD9930_i2c_delay();
  148. }

  149. void APD9930_i2c_noAck(void)
  150. {
  151.   APD9930_SCL_L();
  152.   APD9930_i2c_delay();
  153.   APD9930_SDA_H();
  154.   APD9930_i2c_delay();
  155.   APD9930_SCL_H();
  156.   APD9930_i2c_delay();
  157.   APD9930_SCL_L();
  158.   APD9930_i2c_delay();
  159. }

  160. unsigned char APD9930_i2c_waitAck(void)
  161. {
  162.   unsigned char t = 200;
  163.   
  164.   APD9930_SCL_L();
  165.   APD9930_i2c_delay();
  166.   APD9930_SDA_H();
  167.   APD9930_i2c_delay();
  168.   //////////////////////////此處為金句,IO輸入輸出切換的瞬間有抖動,造成異常應答
  169.   APD9930_SDA_Read();
  170.   //////////////////////////
  171.   APD9930_SCL_H();
  172.   APD9930_i2c_delay();   
  173.   
  174.   while( APD9930_SDA_Read() )
  175.   {
  176.     t --;
  177.     APD9930_i2c_delay();

  178.     if(t==0)
  179.     {
  180.        APD9930_SCL_L();
  181.         return 1;
  182.     }
  183.     APD9930_i2c_delay();
  184.   }
  185.   APD9930_i2c_delay();
  186.   APD9930_SCL_L();
  187.   APD9930_i2c_delay();
  188.   return 0;
  189. }

  190. void APD9930_i2c_sendByte( unsigned char byte )
  191. {
  192.   unsigned char i = 8;
  193.   while (i--) {
  194.     APD9930_SCL_L();
  195.     APD9930_i2c_delay();
  196.     if (byte & 0x80)
  197.         APD9930_SDA_H();
  198.     else
  199.         APD9930_SDA_L();
  200.     byte <<= 1;
  201.     APD9930_i2c_delay();
  202.     APD9930_SCL_H();
  203.     APD9930_i2c_delay();
  204.   }
  205.   APD9930_SCL_L();
  206.   APD9930_i2c_delay();

  207. }

  208. unsigned char APD9930_i2c_readByte(void)
  209. {
  210.   unsigned char i = 8;
  211.   unsigned char byte = 0;

  212.   APD9930_SDA_H();
  213.   APD9930_SDA_Read();
  214.   while (i--)
  215.   {
  216.     byte <<= 1;
  217.     APD9930_SCL_L();
  218.     APD9930_i2c_delay();
  219.     APD9930_SCL_H();
  220.     APD9930_i2c_delay();
  221.     if (APD9930_SDA_Read())
  222.     {
  223.         byte |= 0x01;
  224.     }
  225.   }
  226.   APD9930_SCL_L();
  227.   APD9930_i2c_delay();

  228.   return byte;
  229. }

  230. //--------------------------------------------------------------------------
  231. //  Function: void WriteCharToChip(unsigned int address,unsigned char dat)
  232. //  Discrption:

  233. //00000 Normal ?no action
  234. //00101 Proximity interrupt clear
  235. //00110 ALS interrupt clear
  236. //00111 Proximity and ALS interrupt clear
  237. //other Reserved ?Do not write
  238. //--------------------------------------------------------------------------
  239. void ClearINTF(unsigned char address)
  240. {
  241.   APD9930_i2c_star();
  242.   APD9930_i2c_sendByte(((0x39<<1)&(0XFE)));
  243.   APD9930_i2c_waitAck();
  244.   APD9930_i2c_sendByte(0xA0|address);  
  245.   APD9930_i2c_waitAck();
  246.   APD9930_i2c_stop();
  247. }

  248. //--------------------------------------------------------------------------
  249. //  Function: void WriteCharToChip(unsigned int address,unsigned char dat)
  250. //  Discrption:
  251. //--------------------------------------------------------------------------
  252. void WriteRegData(unsigned char address,unsigned char dat)
  253. {
  254.   APD9930_i2c_star();
  255.   APD9930_i2c_sendByte(((0x39<<1)&(0XFE)));
  256.   APD9930_i2c_waitAck();
  257.   APD9930_i2c_sendByte(0x80|address);  
  258.   APD9930_i2c_waitAck();
  259.   APD9930_i2c_sendByte(dat);
  260.   APD9930_i2c_waitAck();  
  261.   APD9930_i2c_stop();
  262. }
  263. void Delay(unsigned char x){
  264.         delay_us(x);
  265. }

  266. //--------------------------------------------------------------------------
  267. //  Function: unsigned char ReadCharFromChip(unsigned int Address)
  268. //  Discrption:
  269. //--------------------------------------------------------------------------
  270. unsigned short int Read_Word(unsigned char Address)
  271. {
  272.         unsigned char recv_data[2];///0  low; 1  high
  273.         APD9930_i2c_star();
  274.         APD9930_i2c_sendByte((0x39<<1)&(0XFE));
  275.         APD9930_i2c_waitAck();
  276.                

  277.         APD9930_i2c_sendByte(0xa0|Address);  
  278.         APD9930_i2c_waitAck();

  279.         //SCL_LOW();
  280.         APD9930_i2c_star();
  281.         APD9930_i2c_sendByte(((0x39<<1)|(0X01)));
  282.         APD9930_i2c_waitAck();

  283.         recv_data[0]=APD9930_i2c_readByte();
  284.         APD9930_i2c_ack();
  285.        
  286.         Delay(5);
  287.        
  288.         recv_data[1]=APD9930_i2c_readByte();
  289.         APD9930_i2c_noAck();  

  290.         APD9930_i2c_stop();
  291.        
  292.         return (unsigned short int)(recv_data[0] + 256 * recv_data[1]);
  293. }

  294. //--------------------------------------------------------------------------
  295. //read byte
  296. //--------------------------------------------------------------------------
  297. unsigned char Read_byte(unsigned char Address)
  298. {
  299.         unsigned char recv_data;
  300.         APD9930_i2c_star();
  301.         APD9930_i2c_sendByte((0x39<<1)&(0XFE));
  302.         APD9930_i2c_waitAck();
  303.         APD9930_i2c_sendByte(0xA0|Address);  
  304.         APD9930_i2c_waitAck();

  305. //SCL_LOW();
  306. //        SCL = 0;///////////////////////////////////////////////////////////////////////////////////////////////////
  307.         APD9930_i2c_star();
  308.         APD9930_i2c_sendByte(((0x39<<1)|(0X01)));
  309.         APD9930_i2c_waitAck();
  310.         recv_data=APD9930_i2c_readByte();
  311.         APD9930_i2c_noAck();  
  312.         APD9930_i2c_stop();

  313.         return recv_data;
  314. }

  315. unsigned char init_APDS9930(void)
  316. {
  317.         unsigned char ATIME,PTIME,WTIME,PPCOUNT;
  318.         unsigned char PDRIVE,PDIODE,PGAIN,AGAIN;
  319.         unsigned char WEN,PEN,AEN,PON;
  320. //        unsigned short int CH0_data, CH1_data, Prox_data_18,Prox_data_19,Prox_data,IAC1,IAC2;
  321. //        unsigned short int CH0_data1, CH1_data1, Prox_data1_18,Prox_data1_19,Prox_data1,IAC1a,IAC2a;
  322.         char CH0_data,CH1_data,Pro_data;

  323.         ATIME = 0xf6; // 2.7 ms ?minimum ALS integration time
  324.         WTIME = 0xff; // 2.7 ms ?minimum Wait time
  325.         PTIME = 0xf6; // 2.7 ms ?minimum Prox integration time
  326.         PPCOUNT = 0x08; // Minimum prox pulse count
  327.        
  328.         WriteRegData(0, 0); //Disable and Powerdown
  329.         WriteRegData (1, ATIME);
  330.         WriteRegData (2, PTIME);
  331.         WriteRegData (3, WTIME);   
  332.         //WriteRegData (0xd, 0);
  333.         WriteRegData (0xe, PPCOUNT);

  334.         Delay(120); //Wait for 12 ms
  335.         PDRIVE = 0; //100mA of LED Power
  336.         PDIODE = 0x20; // CH1 Diode
  337.         PGAIN = 0; //1x Prox gain
  338.         AGAIN = 0; //1x ALS gain
  339.         WriteRegData (0xf, PDRIVE | PDIODE | PGAIN |AGAIN);
  340.         //WriteRegData(0xc,0xf0);
  341.          
  342.        
  343.         WEN = 8; // Enable Wait
  344.         PEN = 4; // Enable Prox
  345.         AEN = 2; // Enable ALS
  346.         PON = 1; // Enable Power On
  347.         WriteRegData (0, WEN | PEN | AEN | PON);
  348.         //WriteRegData(0,0x0f );
  349.         Delay(120); //Wait for 12 ms
  350.         CH0_data = Read_Word(0x14);
  351.         CH1_data = Read_Word(0x16);
  352.         Pro_data = Read_Word(0x18);
  353.         if(CH0_data | CH1_data | Pro_data){}
  354.         return 1;
  355. }

  356. unsigned short int distance_value(void)   
  357. {
  358.         unsigned int dis;
  359.         unsigned int i,j,k;
  360.         DistanceReadCnt++;
  361.         if(DistanceReadCnt>=2*DISTANCE_READ_TIMES)        DistanceReadCnt = DISTANCE_READ_TIMES;
  362.         diatnce_vlaue[DistanceReadCnt%DISTANCE_READ_TIMES] = Read_Word(0x18);
  363.         if(DistanceReadCnt>=2*DISTANCE_READ_TIMES){
  364.                 DistanceReadCnt = DISTANCE_READ_TIMES;
  365.                 //排序
  366.                 for(i=0;i<DISTANCE_READ_TIMES;i++){
  367.                         for(k=i,j=k+1;j<DISTANCE_READ_TIMES;j++)
  368.                                 if(diatnce_vlaue[k]<diatnce_vlaue[j]) k=j;
  369.                        
  370.                         if(k!=i){
  371.                                 j=diatnce_vlaue[k];
  372.                                 diatnce_vlaue[k]=diatnce_vlaue[i];
  373.                                 diatnce_vlaue[i]=j;
  374.                         }
  375.                 }               
  376.                 dis = 0;
  377.                 if(DISTANCE_READ_TIMES>2){
  378. ……………………

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

所有資料51hei提供下載:
apd9930.zip (3.22 KB, 下載次數: 140)


評分

參與人數 3黑幣 +60 收起 理由
gmy2171 + 5 下載先來看看
zsy118 + 5
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:294649 發表于 2018-3-20 18:35 | 只看該作者
正好在調試 下來看看
回復

使用道具 舉報

板凳
ID:311946 發表于 2018-4-26 11:23 | 只看該作者
本帖最后由 zsy118 于 2018-4-26 17:44 編輯

正是我需要的,希望有用
回復

使用道具 舉報

地板
ID:349170 發表于 2018-6-11 08:44 | 只看該作者
試試看
回復

使用道具 舉報

5#
ID:171549 發表于 2020-6-24 23:08 | 只看該作者
學習一下。
回復

使用道具 舉報

6#
ID:651491 發表于 2020-12-17 15:08 | 只看該作者
下載來看看是不是我所需要的,先謝謝樓主的分享
回復

使用道具 舉報

7#
ID:941265 發表于 2022-7-1 13:54 | 只看該作者
51黑,有你更精彩
回復

使用道具 舉報

8#
ID:1124841 發表于 2024-6-13 10:44 | 只看該作者

正好在調試 下來看看
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品毛片无码 | www.99re| 日本电影免费完整观看 | 欧美成人一区二区三区 | 国产精品久久久久久久久免费 | 国产做爰 | 亚洲一区二区三区久久久 | 国产精品免费在线 | 免费国产一区 | 久草在线在线精品观看 | 成人免费一区二区 | 黄网站在线播放 | 天天色天天射天天干 | 中文字幕综合 | 97视频网站 | 久久久精品日本 | 色综合久久88色综合天天 | 岛国av免费看 | 免费在线看黄视频 | 久久精品久久久久久 | 成人在线免费观看视频 | 一级a爱片性色毛片免费 | 久久伊人青青草 | 国产亚洲精品久久久久动 | 国产精品久久精品 | 精品久久久999 | 日韩黄色小视频 | 99久久久久久 | 国产精品亚洲精品久久 | www.操.com| 亚洲国产成人精品久久久国产成人一区 | 99视频免费在线观看 | 亚洲成人网在线观看 | 免费在线观看黄网站 | 国产精品免费一区二区三区四区 | 亚洲性网 | 在线成人av | 天天av综合| 成人精品 | 久久精品中文 | 国产精品一区二区无线 |