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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機與24CXX通信的C程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:71259 發表于 2014-12-30 00:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /******************************************************************************************
  2. 端口定義
  3. ****************************************************************************************/
  4. sbit SCL=P2^1;         //將串行時鐘總線SCL位定義在為P3.4引腳
  5. sbit SDA=P2^0;          //將串行數據總線SDA位定義在為P3.5引腳

  6. #define OP_READ 0xa1  // 器件地址以及讀取操作,0xa1即為1010 0001B
  7. #define OP_WRITE 0xa0  // 器件地址以及寫入操作,0xa1即為1010 0000B

  8. /******************************************************************************************
  9. * 函數名稱    :Start
  10. * 功能描述    : 啟動I2C總線
  11. * 參數        : 無
  12. * 返回值      : 無
  13. * 創建日期    :2010-11-25
  14. * 作者        :zzj
  15. * 全局變量    :
  16. * 全局靜態變量:
  17. * 局部靜態變量:
  18. *----------------------------------------修改歷史------------------------------------------
  19. * 當前版本    :     修改人:                  修改日期:
  20. * 修改說明    :
  21. ******************************************************************************************/
  22. void Start()
  23. {
  24. SDA = 1;    //SDA初始化為高電平“1”
  25.     SCL = 1;    //開始數據傳送時,要求SCL為高電平“1”
  26. _nop_();     //等待一個機器周期
  27. _nop_();     //等待一個機器周期
  28. _nop_();     //等待一個機器周期
  29. _nop_();     //等待一個機器周期
  30. _nop_();     //等待一個機器周期
  31. SDA = 0;    //SDA的下降沿被認為是開始信號
  32. _nop_();     //等待一個機器周期
  33. _nop_();     //等待一個機器周期
  34. _nop_();     //等待一個機器周期
  35. _nop_();     //等待一個機器周期
  36. _nop_();     //等待一個機器周期
  37. SCL = 0;    //SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)
  38. }
  39. /******************************************************************************************
  40. * 函數名稱    :Stop
  41. * 功能描述    : 結束I2C總線
  42. * 參數        : 無
  43. * 返回值      : 無
  44. * 創建日期    :2010-11-25
  45. * 作者        :zzj
  46. * 全局變量    :
  47. * 全局靜態變量:
  48. * 局部靜態變量:
  49. *----------------------------------------修改歷史------------------------------------------
  50. * 當前版本    :     修改人:                  修改日期:
  51. * 修改說明    :
  52. ******************************************************************************************/
  53. void Stop()// 停止位
  54. {
  55. SDA = 0;     //SDA初始化為低電平“0” _n
  56. SCL = 1;     //結束數據傳送時,要求SCL為高電平“1”
  57. _nop_();     //等待一個機器周期
  58. _nop_();     //等待一個機器周期
  59. _nop_();     //等待一個機器周期
  60. _nop_();     //等待一個機器周期
  61. _nop_();     //等待一個機器周期
  62. SDA = 1;    //SDA的上升沿被認為是結束信號
  63. _nop_();     //等待一個機器周期
  64. _nop_();     //等待一個機器周期
  65. _nop_();     //等待一個機器周期
  66. _nop_();     //等待一個機器周期
  67. _nop_();     //等待一個機器周期
  68. SDA=0;
  69. SCL=0;
  70. }
  71. /******************************************************************************************
  72. * 函數名稱    :TeskAsk
  73. * 功能描述    : 檢測應答位
  74. * 參數        : 無
  75. * 返回值      : 無
  76. * 創建日期    :2010-11-25
  77. * 作者        :zzj
  78. * 全局變量    :
  79. * 全局靜態變量:
  80. * 局部靜態變量:
  81. *----------------------------------------修改歷史------------------------------------------
  82. * 當前版本    :     修改人:                  修改日期:
  83. * 修改說明    :
  84. ******************************************************************************************/
  85. void TestAsk()               
  86. {
  87.     bit ack_bit;        //儲存應答位
  88.     SDA = 1;  // 發送設備(主機)應在時鐘脈沖的高電平期間(SCL=1)釋放SDA線,
  89.                  //以讓SDA線轉由接收設備(AT24Cxx)控制
  90. _nop_();        //等待一個機器周期
  91. _nop_();        //等待一個機器周期
  92. SCL = 1;       //根據上述規定,SCL應為高電平
  93. _nop_();       //等待一個機器周期
  94. _nop_();       //等待一個機器周期
  95. _nop_();       //等待一個機器周期
  96. _nop_();       //等待一個機器周期
  97. _nop_();       //等待一個機器周期
  98. ack_bit = SDA; //接受設備(AT24Cxx)向SDA送低電平,表示已經接收到一個字節
  99.                 //若送高電平,表示沒有接收到,傳送異常 結束發送
  100. SCL = 0;       //SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)
  101. while(ack_bit!=0);
  102. }
  103. /******************************************************************************************
  104. * 函數名稱    :SendAsk
  105. * 功能描述    :發送應答位
  106. * 參數        : 無
  107. * 返回值      : 無
  108. * 創建日期    :2010-11-25
  109. * 作者        :zzj
  110. * 全局變量    :
  111. * 全局靜態變量:
  112. * 局部靜態變量:
  113. *----------------------------------------修改歷史------------------------------------------
  114. * 當前版本    :     修改人:                  修改日期:
  115. * 修改說明    :
  116. ******************************************************************************************/
  117. void SendAsk()
  118. {
  119.   SCL=0;
  120.   _nop_();
  121.   _nop_();     
  122.   SDA=0;    //將SDA拉低并持續4.5us以上
  123.    SCL=1;  
  124.    
  125. _nop_();
  126. _nop_();
  127. _nop_();
  128. _nop_();
  129. _nop_();

  130. SCL=0;
  131. SDA=1;
  132. }
  133. /******************************************************************************************
  134. * 函數名稱    :ReadData
  135. * 功能描述    :從24CXX里讀一個字節
  136. * 參數        : 無
  137. * 返回值      : x
  138. * 創建日期    :2010-11-25
  139. * 作者        :zzj
  140. * 全局變量    :
  141. * 全局靜態變量:
  142. * 局部靜態變量:
  143. *----------------------------------------修改歷史------------------------------------------
  144. * 當前版本    :     修改人:                  修改日期:
  145. * 修改說明    :
  146. ******************************************************************************************/
  147. unsigned char ReadData()
  148. // 從AT24Cxx移入數據到MCU
  149. {
  150. unsigned char i;
  151. unsigned char x;   //儲存從AT24Cxx中讀出的數據
  152. for(i = 0; i < 8; i++)
  153. {
  154.   SCL = 1;                //SCL置為高電平
  155.   x<<=1;                  //將x中的各二進位向左移一位
  156.   x|=(unsigned char)SDA;  //將SDA上的數據通過按位“或“運算存入x中
  157.   SCL = 0;                        //在SCL的下降沿讀出數據
  158. }
  159. return(x);                //將讀取的數據返回
  160. }
  161. /******************************************************************************************
  162. * 函數名稱    :WriteCurrent
  163. * 功能描述    :向AT24Cxx的當前地址寫入數據
  164. * 參數        : y (儲存待寫入的數據)
  165. * 返回值      : 無
  166. * 創建日期    :2010-11-25
  167. * 作者        :zzj
  168. * 全局變量    :
  169. * 全局靜態變量:
  170. * 局部靜態變量:
  171. *----------------------------------------修改歷史------------------------------------------
  172. * 當前版本    :     修改人:                  修改日期:
  173. * 修改說明    :
  174. ******************************************************************************************/
  175. //在調用此數據寫入函數前需首先調用開始函數start(),所以SCL=0
  176. void WriteCurrent(unsigned char y)
  177. {
  178. unsigned char i;
  179. for(i = 0; i < 8; i++)  // 循環移入8個位
  180. {
  181.      SDA = (bit)(y&0x80);   //通過按位“與”運算將最高位數據送到S
  182.                                     //因為傳送時高位在前,低位在后
  183.   _nop_();            //等待一個機器周期  
  184.      SCL = 1;            //在SCL的上升沿將數據寫入AT24Cxx     
  185.      _nop_();            //等待一個機器周期
  186.      _nop_();             //等待一個機器周期      
  187.   
  188.     SCL = 0;            //將SCL重新置為低電平,以在SCL線形成傳送數據所需的8個脈沖
  189.   y <<= 1;           //將y中的各二進位向左移一位
  190.               
  191. }
  192. }
  193. /******************************************************************************************
  194. * 函數名稱    :WriteSet
  195. * 功能描述    :向AT24Cxx中的指定地址寫入數據
  196. * 參數        :add (儲存指定的地址);dat(儲存待寫入的數據)
  197. * 返回值      : 無
  198. * 創建日期    :2010-11-25
  199. * 作者        :zzj
  200. * 全局變量    :
  201. * 全局靜態變量:
  202. * 局部靜態變量:
  203. *----------------------------------------修改歷史------------------------------------------
  204. * 當前版本    :     修改人:                  修改日期:
  205. * 修改說明    :
  206. ******************************************************************************************/
  207. void WriteSet(unsigned char add, unsigned char dat)
  208. // 在指定地址addr處寫入數據WriteCurrent
  209. {
  210. Start();               //開始數據傳遞
  211. WriteCurrent(OP_WRITE);  //選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
  212. TestAsk();
  213. WriteCurrent(add);       //寫入指定地址
  214. TestAsk();
  215. WriteCurrent(dat);       //向當前地址(上面指定的地址)寫入數據
  216. TestAsk();
  217. Stop();                //停止數據傳遞
  218. delay(4);        //1個字節的寫入周期為1ms, 最好延時1ms以上
  219. }
  220. /******************************************************************************************
  221. * 函數名稱    :ReadCurrent
  222. * 功能描述    :從AT24Cxx中的當前地址讀取數據
  223. * 參數        : 無
  224. * 返回值      : x (儲存讀出的數據)
  225. * 創建日期    :2010-11-25
  226. * 作者        :zzj
  227. * 全局變量    :
  228. * 全局靜態變量:
  229. * 局部靜態變量:
  230. *----------------------------------------修改歷史------------------------------------------
  231. * 當前版本    :     修改人:                  修改日期:
  232. * 修改說明    :
  233. ******************************************************************************************/
  234. unsigned char ReadCurrent()
  235. {
  236. unsigned char x;
  237. Start();               //開始數據傳遞
  238. WriteCurrent(OP_READ);   //選擇要操作的AT24Cxx芯片,并告知要讀其數據
  239. TestAsk();
  240. x=ReadData();         //將讀取的數據存入x
  241. Stop();                //停止數據傳遞
  242. return x;              //返回讀取的數據
  243. }
  244. /******************************************************************************************
  245. * 函數名稱    :ReadSet
  246. * 功能描述    :從AT24Cxx中的指定地址讀取數據
  247. * 參數        : set_addr
  248. * 返回值      : x
  249. * 創建日期    :2010-11-25
  250. * 作者        :zzj
  251. * 全局變量    :
  252. * 全局靜態變量:
  253. * 局部靜態變量:
  254. *----------------------------------------修改歷史------------------------------------------
  255. * 當前版本    :     修改人:                  修改日期:
  256. * 修改說明    :
  257. ******************************************************************************************/
  258. unsigned char ReadSet(unsigned char set_addr)
  259. // 在指定地址讀取
  260. {
  261. Start();                      //開始數據傳遞
  262. WriteCurrent(OP_WRITE);       //選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
  263. TestAsk();
  264. WriteCurrent(set_addr);       //寫入指定地址
  265. TestAsk();
  266. return(ReadCurrent());        //從指定地址讀出數據并返回
  267. }
  268. /******************************************************************************************
  269. * 函數名稱    :WritePage
  270. * 功能描述    :從AT24Cxx中的指定頁地址寫8字節數據
  271. * 參數        : address,*s(要寫進去的數組首地址)
  272. * 返回值      : 無
  273. * 創建日期    :2010-11-25
  274. * 作者        :zzj
  275. * 全局變量    :
  276. * 全局靜態變量:
  277. * 局部靜態變量:
  278. *----------------------------------------修改歷史------------------------------------------
  279. * 當前版本    :     修改人:                  修改日期:
  280. * 修改說明    :
  281. ******************************************************************************************/
  282. void WritePage(unsigned char address,unsigned char *s)  //按頁寫
  283. {
  284. unsigned char i;

  285. Start();
  286. WriteCurrent(OP_WRITE);  //發送控制寫字節
  287. TestAsk();
  288. WriteCurrent(address);   //存儲器地址;每次讀完之后指針自動加1
  289. TestAsk();

  290. for(i=0;i<8;i++)       //直接連續寫8次,每頁含有16個字節
  291. {
  292.   WriteCurrent(*s);
  293.   TestAsk();
  294.   s++;

  295. }
  296. Stop();
  297. delay(4);        //1個字節的寫入周期為1ms, 最好延時1ms以上
  298. }
  299. /******************************************************************************************
  300. * 函數名稱    :ReadPage
  301. * 功能描述    :從AT24Cxx中的指定頁地址讀取8字節數據
  302. * 參數        : address,tmp[](存放讀出來的數據)
  303. * 返回值      : 無
  304. * 創建日期    :2010-11-25
  305. * 作者        :zzj
  306. * 全局變量    :
  307. * 全局靜態變量:
  308. * 局部靜態變量:
  309. *----------------------------------------修改歷史------------------------------------------
  310. * 當前版本    :     修改人:                  修改日期:
  311. * 修改說明    :
  312. ******************************************************************************************/
  313. void ReadPage(unsigned char address,unsigned char tmp[]) //按頁讀取、可以連續讀,不需要按頁讀
  314. {
  315. unsigned char i;

  316. Start();
  317. WriteCurrent(OP_WRITE);  //發送控制寫字節
  318. TestAsk();
  319. WriteCurrent(address);  //存儲器地址;每次讀完之后指針自動加1
  320. TestAsk();

  321. Start();
  322. WriteCurrent(OP_READ);   //選擇要操作的AT24Cxx芯片,并告知要讀其數據
  323. TestAsk();

  324. tmp[0]=ReadData();
  325. for(i=1;i<8;i++)  
  326. {
  327.   SendAsk();
  328.   tmp[i]=ReadData();
  329. }  /**/


  330. Stop();
  331. }
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日摸夜夜爽人人添av | 颜色网站在线观看 | 欧洲成人免费视频 | 99精品国产成人一区二区 | 二区中文 | 激情视频中文字幕 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 中文字幕精品一区二区三区精品 | 亚洲资源站 | 欧美日韩在线免费观看 | 成人午夜精品 | 中文字幕一级 | 草草草网站 | 在线中文字幕亚洲 | 亚洲午夜精品久久久久久app | 最新中文字幕 | 欧美一区二区视频 | 久久久久久黄 | 日韩免费一二三区 | 国产ts人妖一区二区三区 | 亚洲综合婷婷 | 日韩一区在线视频 | 国产夜恋视频在线观看 | 在线国产一区二区三区 | 中文字幕在线观看视频一区 | 中文字幕第7页 | 欧美激情视频一区二区三区在线播放 | 黄色a视频 | 欧美一区免费 | 欧美激情免费在线 | 久久99深爱久久99精品 | 日韩在线观看视频一区 | 在线亚洲一区二区 | 一区二区三区视频在线观看 | 中文字幕中文字幕 | 亚洲精品一区二区冲田杏梨 | 91电影院| 精品日韩在线 | 日批日韩在线观看 | 亚洲一二三区av | 伊人免费观看视频 |