欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機虛擬I2C總線匯編與C語言軟件包,很實用的

[復制鏈接]
跳轉到指定樓層
樓主
      該軟件包只用在100K或400K速度的I2C器件,如果用在低速一些的器件(如:ZLG7290)就需要調整運行時間,如在通信過程中增加NOP指令等增加延時時間.


虛擬 I2C總線匯編程序軟件包概述
為了非常方便地對 I2C 從器件進行快速的 正確的讀寫操作,我們為此而設計出虛擬 I2C 總線操作平臺軟件包 本軟件包是主方式下的虛擬 I2C 總線軟件包,只要用戶給子程序提供幾個主要的參數,即可輕松地完成任何I2C 總線外圍器件的應用程序設計  

全部資料51hei下載地址:
I2C軟件包,很有用,移植性好.rar (67.11 KB, 下載次數: 25)


單片機源程序如下:
  1. /********************************************************************
  2.                        VIIC_C51.C
  3.   此程序是I2C操作平臺(主方式的軟件平臺)的底層的C子程序,如發送數據
  4. 及接收數據,應答位發送,并提供了幾個直接面對器件的操作函數,它很方便的
  5. 與用戶程序連接并擴展.....  
  6.   
  7.     注意:函數是采用軟件延時的方法產生SCL脈沖,固對高晶振頻率要作
  8. 一定的修改....(本例是1us機器周期,即晶振頻率要小于12MHZ)

  9. ********************************************************************/
  10.   
  11.   
  12.               
  13. #include <reg764.h>          /*頭文件的包含*/
  14. #include <intrins.h>

  15. #define  uchar unsigned char /*宏定義*/
  16. #define  uint  unsigned int

  17. #define  _Nop()  _nop_()        /*定義空指令*/

  18. /* 常,變量定義區 */

  19.                                                  /*端口位定義*/
  20. sbit SDA=P1^3;            /*模擬I2C數據傳送位*/
  21. sbit SCL=P1^2;            /*模擬I2C時鐘控制位*/

  22.                                                  /*狀態標志*/
  23. bit ack;                 /*應答標志位*/
  24.    





  25. /*******************************************************************
  26.                      起動總線函數               
  27. 函數原型: void  Start_I2c();  
  28. 功能:       啟動I2C總線,即發送I2C起始條件.
  29.   
  30. ********************************************************************/
  31. void Start_I2c()
  32. {
  33.   SDA=1;   /*發送起始條件的數據信號*/
  34.   _Nop();
  35.   SCL=1;
  36.   _Nop();    /*起始條件建立時間大于4.7us,延時*/
  37.   _Nop();
  38.   _Nop();
  39.   _Nop();
  40.   _Nop();   
  41.   SDA=0;   /*發送起始信號*/
  42.   _Nop();    /* 起始條件鎖定時間大于4μs*/
  43.   _Nop();
  44.   _Nop();
  45.   _Nop();
  46.   _Nop();      
  47.   SCL=0;   /*鉗住I2C總線,準備發送或接收數據 */
  48.   _Nop();
  49.   _Nop();
  50. }




  51. /*******************************************************************
  52.                       結束總線函數               
  53. 函數原型: void  Stop_I2c();  
  54. 功能:       結束I2C總線,即發送I2C結束條件.
  55.   
  56. ********************************************************************/
  57. void Stop_I2c()
  58. {
  59.   SDA=0;  /*發送結束條件的數據信號*/
  60.   _Nop();   /*發送結束條件的時鐘信號*/
  61.   SCL=1;  /*結束條件建立時間大于4μs*/
  62.   _Nop();
  63.   _Nop();
  64.   _Nop();
  65.   _Nop();
  66.   _Nop();
  67.   SDA=1;  /*發送I2C總線結束信號*/
  68.   _Nop();
  69.   _Nop();
  70.   _Nop();
  71.   _Nop();
  72. }




  73. /*******************************************************************
  74.                  字節數據傳送函數               
  75. 函數原型: void  SendByte(uchar c);
  76. 功能:  將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
  77.      此狀態位進行操作.(不應答或非應答都使ack=0 假)     
  78.      發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
  79. ********************************************************************/
  80. void  SendByte(uchar c)
  81. {
  82. uchar BitCnt;

  83. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數據長度為8位*/
  84.     {
  85.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發送位*/
  86.        else  SDA=0;               
  87.      _Nop();
  88.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數據位*/
  89.       _Nop();
  90.       _Nop();               /*保證時鐘高電平周期大于4μs*/
  91.       _Nop();
  92.       _Nop();
  93.       _Nop();         
  94.      SCL=0;
  95.     }
  96.    
  97.     _Nop();
  98.     _Nop();
  99.     SDA=1;               /*8位發送完后釋放數據線,準備接收應答位*/
  100.     _Nop();
  101.     _Nop();   
  102.     SCL=1;
  103.     _Nop();
  104.     _Nop();
  105.     _Nop();
  106.     if(SDA==1)ack=0;     
  107.        else ack=1;        /*判斷是否接收到應答信號*/
  108.     SCL=0;
  109.     _Nop();
  110.     _Nop();
  111. }






  112. /*******************************************************************
  113.                  字節數據傳送函數               
  114. 函數原型: uchar  RcvByte();
  115. 功能:  用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
  116.      發完后請用應答函數。  
  117. ********************************************************************/       
  118. uchar  RcvByte()
  119. {
  120.   uchar retc;
  121.   uchar BitCnt;
  122.   
  123.   retc=0;
  124.   SDA=1;             /*置數據線為輸入方式*/
  125.   for(BitCnt=0;BitCnt<8;BitCnt++)
  126.       {
  127.         _Nop();           
  128.         SCL=0;       /*置時鐘線為低,準備接收數據位*/
  129.         _Nop();
  130.         _Nop();         /*時鐘低電平周期大于4.7μs*/
  131.         _Nop();
  132.         _Nop();
  133.         _Nop();
  134.         SCL=1;       /*置時鐘線為高使數據線上數據有效*/
  135.         _Nop();
  136.         _Nop();
  137.         retc=retc<<1;
  138.         if(SDA==1)retc=retc+1; /*讀數據位,接收的數據位放入retc中 */
  139.         _Nop();
  140.         _Nop();
  141.       }
  142.   SCL=0;   
  143.   _Nop();
  144.   _Nop();
  145.   return(retc);
  146. }




  147. /********************************************************************
  148.                      應答子函數
  149. 原型:  void Ack_I2c(bit a);

  150. 功能:主控器進行應答信號,(可以是應答或非應答信號)
  151. ********************************************************************/
  152. void Ack_I2c(bit a)
  153. {
  154.   
  155.   if(a==0)SDA=0;     /*在此發出應答或非應答信號 */
  156.         else SDA=1;
  157.   _Nop();
  158.   _Nop();
  159.   _Nop();      
  160.   SCL=1;
  161.     _Nop();
  162.     _Nop();              /*時鐘低電平周期大于4μs*/
  163.     _Nop();
  164.     _Nop();
  165.     _Nop();  
  166. SCL=0;                /*清時鐘線,鉗住I2C總線以便繼續接收*/
  167.     _Nop();
  168.     _Nop();   
  169. }






  170. /*******************************************************************
  171.                     向無子地址器件發送字節數據函數               
  172. 函數原型: bit  ISendByte(uchar sla,ucahr c);  
  173. 功能:     從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla.
  174.            如果返回1表示操作成功,否則操作有誤。
  175. 注意:    使用前必須已結束總線。
  176. ********************************************************************/
  177. bit ISendByte(uchar sla,uchar c)
  178. {
  179.    Start_I2c();               /*啟動總線*/
  180.    SendByte(sla);            /*發送器件地址*/
  181.      if(ack==0)return(0);
  182.    SendByte(c);               /*發送數據*/
  183.      if(ack==0)return(0);
  184.   Stop_I2c();                 /*結束總線*/
  185.   return(1);
  186. }




  187. /*******************************************************************
  188.                     向有子地址器件發送多字節數據函數               
  189. 函數原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
  190. 功能:     從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件
  191.           地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。
  192.            如果返回1表示操作成功,否則操作有誤。
  193. 注意:    使用前必須已結束總線。
  194. ********************************************************************/
  195. bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
  196. {
  197.    uchar i;

  198.    Start_I2c();               /*啟動總線*/
  199.    SendByte(sla);            /*發送器件地址*/
  200.      if(ack==0)return(0);
  201.    SendByte(suba);            /*發送器件子地址*/
  202.      if(ack==0)return(0);

  203.    for(i=0;i<no;i++)
  204.     {   
  205.      SendByte(*s);               /*發送數據*/
  206.        if(ack==0)return(0);
  207.      s++;
  208.     }
  209. Stop_I2c();                 /*結束總線*/
  210.   return(1);
  211. }






  212. /*******************************************************************
  213.                     向無子地址器件讀字節數據函數               
  214. 函數原型: bit  IRcvByte(uchar sla,ucahr *c);  
  215. 功能:     從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地
  216.           址sla,返回值在c.
  217.            如果返回1表示操作成功,否則操作有誤。
  218. 注意:    使用前必須已結束總線。
  219. ********************************************************************/
  220. bit IRcvByte(uchar sla,uchar *c)
  221. {
  222.    Start_I2c();                /*啟動總線*/
  223.    SendByte(sla+1);           /*發送器件地址*/
  224.      if(ack==0)return(0);
  225.    *c=RcvByte();               /*讀取數據*/
  226.      Ack_I2c(1);               /*發送非就答位*/
  227.   Stop_I2c();                  /*結束總線*/
  228.   return(1);
  229. }



  230. /*******************************************************************
  231.                     向有子地址器件讀取多字節數據函數               
  232. 函數原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
  233. 功能:     從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件
  234.           地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。
  235.            如果返回1表示操作成功,否則操作有誤。
  236. 注意:    使用前必須已結束總線。
  237. ********************************************************************/
  238. bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
  239. ……………………

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

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:250287 發表于 2018-6-24 21:06 | 只看該作者
感謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表