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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32單片機pcf8563程序 庫函數i2c

[復制鏈接]
跳轉到指定樓層
樓主
ID:154876 發表于 2023-12-27 22:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <sys.h>
  2. #include <pcf8563.h>
  3. #include <delay.h>

  4. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
  5. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

  6. //IO操作函數         
  7. #define IIC_SCL    PBout(6) //SCL
  8. #define IIC_SDA    PBout(7) //SDA         
  9. #define READ_SDA   PBin(7)  //輸入SDA

  10. //初始化IIC
  11. void IIC_Init(void)
  12. {                                             
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB時鐘
  15.            
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  20.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 輸出高
  21. }

  22. //產生IIC起始信號
  23. void IIC_Start(void)
  24. {
  25.         SDA_OUT();     //sda線輸出
  26.         IIC_SDA=1;                    
  27.         IIC_SCL=1;
  28.         delay_us(4);
  29.          IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  30.         delay_us(4);
  31.         IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據
  32. }         
  33. //產生IIC停止信號
  34. void IIC_Stop(void)
  35. {
  36.         SDA_OUT();//sda線輸出
  37.         IIC_SCL=0;
  38.         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  39.          delay_us(4);
  40.         IIC_SCL=1;
  41.         IIC_SDA=1;//發送I2C總線結束信號
  42.         delay_us(4);                                                                  
  43. }
  44. //等待應答信號到來
  45. //返回值:1,接收應答失敗
  46. //        0,接收應答成功
  47. u8 IIC_Wait_Ack(void)
  48. {
  49.         u8 ucErrTime=0;
  50.         SDA_IN();      //SDA設置為輸入  
  51.         IIC_SDA=1;delay_us(1);           
  52.         IIC_SCL=1;delay_us(1);         
  53.         while(READ_SDA)
  54.         {
  55.                 ucErrTime++;
  56.                 if(ucErrTime>250)
  57.                 {
  58.                         IIC_Stop();
  59.                         return 1;
  60.                 }
  61.         }
  62.         IIC_SCL=0;//時鐘輸出0            
  63.         return 0;  
  64. }
  65. //產生ACK應答
  66. void IIC_Ack(void)
  67. {
  68.         IIC_SCL=0;
  69.         SDA_OUT();
  70.         IIC_SDA=0;
  71.         delay_us(2);
  72.         IIC_SCL=1;
  73.         delay_us(2);
  74.         IIC_SCL=0;
  75. }
  76. //不產生ACK應答                    
  77. void IIC_NAck(void)
  78. {
  79.         IIC_SCL=0;
  80.         SDA_OUT();
  81.         IIC_SDA=1;
  82.         delay_us(2);
  83.         IIC_SCL=1;
  84.         delay_us(2);
  85.         IIC_SCL=0;
  86. }                                                                              
  87. //IIC發送一個字節
  88. //返回從機有無應答
  89. //1,有應答
  90. //0,無應答                          
  91. void IIC_Send_Byte(u8 txd)
  92. {                        
  93.     u8 t;   
  94.         SDA_OUT();            
  95.     IIC_SCL=0;//拉低時鐘開始數據傳輸
  96.     for(t=0;t<8;t++)
  97.     {              
  98.       
  99.                 if((txd&0x80)>>7)
  100.                         IIC_SDA=1;
  101.                 else
  102.                         IIC_SDA=0;
  103.                 txd<<=1;           
  104.                 delay_us(2);   //對TEA5767這三個延時都是必須的
  105.                 IIC_SCL=1;
  106.                 delay_us(2);
  107.                 IIC_SCL=0;        
  108.                 delay_us(2);
  109.     }         
  110. }            
  111. //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK   
  112. u8 IIC_Read_Byte(unsigned char ack)
  113. {
  114.         unsigned char i,receive=0;
  115.         SDA_IN();//SDA設置為輸入
  116.     for(i=0;i<8;i++ )
  117.         {
  118.         IIC_SCL=0;
  119.         delay_us(2);
  120.                     IIC_SCL=1;
  121.         receive<<=1;
  122.    if(READ_SDA)receive++;   
  123.                 delay_us(1);
  124.    }                                         
  125.     if (!ack)
  126.         IIC_NAck();//發送nACK
  127.     else
  128.         IIC_Ack(); //發送ACK   
  129.     return receive;
  130. }

  131. void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat)
  132. {
  133.         
  134.   IIC_Start();
  135.         IIC_Send_Byte(PCF8563_Write);//發送寫命令并檢查應答位
  136.   while(IIC_Wait_Ack());
  137.         IIC_Send_Byte(REG_ADD);
  138.         IIC_Wait_Ack();
  139.         IIC_Send_Byte(dat);        //發送數據
  140.         IIC_Wait_Ack();
  141.         IIC_Stop();
  142.         
  143. }
  144. //讀取地數據
  145. // reg——add  要讀取的寄存器
  146. unsigned char PCF8563_Read_Byte(unsigned char REG_ADD)
  147. {        
  148.         u8 ReData;

  149.         IIC_Start( );        
  150.         IIC_Send_Byte(PCF8563_Write);//發送寫命令并檢查應答位        
  151.   while(IIC_Wait_Ack( ));        
  152.   IIC_Send_Byte(REG_ADD);        //確定要操作的寄存器
  153.         IIC_Wait_Ack();
  154.         IIC_Start();        //啟動總線
  155.         IIC_Send_Byte(PCF8563_Read);        //發送讀取命令
  156.         IIC_Wait_Ack();
  157.         ReData = IIC_Read_Byte(0);                //讀取數據,加發送非應答
  158.         IIC_Stop();        
  159.         return ReData;
  160. }

  161. //函數名稱:void rtc_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
  162. //功    能:設置RTC芯片PCF8563的時間
  163. //輸    入:year month day hour min second:年月日時分秒
  164. //輸    出:無
  165. void PCF8563_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
  166. {
  167.     PCF8563_Write_Byte(TIME_SECOND,second);
  168.           delay_us(20);
  169.     PCF8563_Write_Byte(TIME_MINUTE,min);
  170.                 delay_us(20);
  171.     PCF8563_Write_Byte(TIME_HOUR,hour);
  172.                 delay_us(20);
  173.     PCF8563_Write_Byte(TIME_DAY,day);
  174.                 delay_us(20);
  175.     PCF8563_Write_Byte(TIME_MONTH,month);
  176.                 delay_us(20);
  177.     PCF8563_Write_Byte(TIME_YEAR,year);
  178.                 delay_us(20);
  179.         
  180. }

  181. //函數名稱:Datetime_Structure rtc_get_time(void)
  182. //功    能:讀取RTC芯片PCF8563的時間
  183. //輸    入:無
  184. //輸    出:Datetime_Structure結構體變量
  185.   Datetime_Structure rtc_get_time(void)
  186. {
  187.     u32 m_unTempTime;
  188.     Datetime_Structure getTime_Struct;

  189.     /*get time---second****************/
  190.     m_unTempTime = PCF8563_Read_Byte(TIME_SECOND)&0x7f;
  191.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  192.     getTime_Struct.second = m_unTempTime;

  193.     /*get time---minute****************/
  194.     m_unTempTime = PCF8563_Read_Byte(TIME_MINUTE)&0x7f;
  195.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  196.     getTime_Struct.min = m_unTempTime;

  197.     /*get time---hour****************/
  198.     m_unTempTime = PCF8563_Read_Byte(TIME_HOUR)&0x3f;
  199.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  200.     getTime_Struct.hour = m_unTempTime;

  201.     /*get time---day****************/
  202.     m_unTempTime = PCF8563_Read_Byte(TIME_DAY)&0x3f;
  203.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  204.     getTime_Struct.day = m_unTempTime;        

  205.     /*get time---month****************/
  206.     m_unTempTime = PCF8563_Read_Byte(TIME_MONTH)&0x1f;
  207.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  208.     getTime_Struct.month = m_unTempTime;               

  209.     /*get time---year****************/
  210.     m_unTempTime = PCF8563_Read_Byte(TIME_YEAR)&0xff;
  211.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  212.     getTime_Struct.year = m_unTempTime;               

  213.     return getTime_Struct;
  214. }

復制代碼


原理圖: 無
仿真: 無
代碼: 庫函數i2c_pcf8563.7z (182.19 KB, 下載次數: 28)

評分

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

查看全部評分

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

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆一区| 久久成人免费 | 国产欧美精品一区二区三区 | 亚洲一区二区三区在线播放 | 日韩av免费在线电影 | 一级黄色毛片子 | 一区二区三区在线观看免费视频 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 亚洲精品永久免费 | 国产激情在线观看视频 | 欧美精品综合 | 欧美精品网 | 懂色中文一区二区在线播放 | 成人二区 | 久久久久久久久久毛片 | 99在线观看视频 | 日韩欧美在线观看 | 久久精品国产免费看久久精品 | 一级毛片免费完整视频 | 欧美四虎| 日日干夜夜操 | 免费精品 | 国产精品美女久久久久久久久久久 | 国产高清无av久久 | 国产亚洲精品美女久久久久久久久久 | 久久6| 国产精品视频一区二区三区 | 欧美福利视频 | 国产大学生情侣呻吟视频 | 国产精品久久久久久久久久久免费看 | 999久久久久久久久6666 | 日韩在线不卡 | 欧美日韩亚洲国产综合 | 九九久久久| 国产欧美在线观看 | 亚洲成人久久久 | 国产精品久久av | 日本精品视频在线观看 | 亚洲大片一区 | 亚洲色图综合网 | 国产精品一区二区三区99 |