?? 51 c
字號:
C51 COMPILER V7.06 I2C 06/02/2010 10:03:45 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\obj\i2c.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\i2c.lst) OBJECT(.\obj\i2c.obj)
stmt level source
1 /*-----------------------------------------------
2 名稱:IIC協(xié)議
3 論壇:www.doflye.net
4 編寫:shifang
5 修改:無
6 內(nèi)容:函數(shù)是采用軟件延時的方法產(chǎn)生SCL脈沖,固對高晶振頻率要作 一定的修改....(本例是1us機(jī)器
7 周期,即晶振頻率要小于12MHZ)
8 ------------------------------------------------*/
9
10
11 #include "i2c.h"
12
13
14 #define _Nop() _nop_() //定義空指令
15
16 bit ack; //應(yīng)答標(biāo)志位
17
18 sbit SDA=P2^1;
19 sbit SCL=P2^0;
20 /*------------------------------------------------
21 uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
22 unsigned char 是定義無符號字符變量,其值的范圍是
23 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
24 長度如下 T=tx2+5 uS
25 ------------------------------------------------*/
26 void DelayUs2x(unsigned char t)
27 {
28 1 while(--t);
29 1 }
30 /*------------------------------------------------
31 mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
32 unsigned char 是定義無符號字符變量,其值的范圍是
33 0~255 這里使用晶振12M,精確延時請使用匯編
34 ------------------------------------------------*/
35 void DelayMs(unsigned char t)
36 {
37 1
38 1 while(t--)
39 1 {
40 2 //大致延時1mS
41 2 DelayUs2x(245);
42 2 DelayUs2x(245);
43 2 }
44 1 }
45
46 /*------------------------------------------------
47 啟動總線
48 ------------------------------------------------*/
49 void Start_I2c()
50 {
51 1 SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號
52 1 _Nop();
53 1 SCL=1;
54 1 _Nop(); //起始條件建立時間大于4.7us,延時
55 1 _Nop();
C51 COMPILER V7.06 I2C 06/02/2010 10:03:45 PAGE 2
56 1 _Nop();
57 1 _Nop();
58 1 _Nop();
59 1 SDA=0; //發(fā)送起始信號
60 1 _Nop(); //起始條件鎖定時間大于4μ
61 1 _Nop();
62 1 _Nop();
63 1 _Nop();
64 1 _Nop();
65 1 SCL=0; //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
66 1 _Nop();
67 1 _Nop();
68 1 }
69 /*------------------------------------------------
70 結(jié)束總線
71 ------------------------------------------------*/
72 void Stop_I2c()
73 {
74 1 SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號
75 1 _Nop(); //發(fā)送結(jié)束條件的時鐘信號
76 1 SCL=1; //結(jié)束條件建立時間大于4μ
77 1 _Nop();
78 1 _Nop();
79 1 _Nop();
80 1 _Nop();
81 1 _Nop();
82 1 SDA=1; //發(fā)送I2C總線結(jié)束信號
83 1 _Nop();
84 1 _Nop();
85 1 _Nop();
86 1 _Nop();
87 1 }
88
89
90
91
92 /*----------------------------------------------------------------
93 字節(jié)數(shù)據(jù)傳送函數(shù)
94 函數(shù)原型: void SendByte(unsigned char c);
95 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
96 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)
97 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
98 ------------------------------------------------------------------*/
99 void SendByte(unsigned char c)
100 {
101 1 unsigned char BitCnt;
102 1
103 1 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
104 1 {
105 2 if((c<<BitCnt)&0x80)SDA=1; //判斷發(fā)送位
106 2 else SDA=0;
107 2 _Nop();
108 2 SCL=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
109 2 _Nop();
110 2 _Nop(); //保證時鐘高電平周期大于4μ
111 2 _Nop();
112 2 _Nop();
113 2 _Nop();
114 2 SCL=0;
115 2 }
116 1
117 1 _Nop();
C51 COMPILER V7.06 I2C 06/02/2010 10:03:45 PAGE 3
118 1 _Nop();
119 1 SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
120 1 _Nop();
121 1 _Nop();
122 1 SCL=1;
123 1 _Nop();
124 1 _Nop();
125 1 _Nop();
126 1 if(SDA==1)ack=0;
127 1 else ack=1; //判斷是否接收到應(yīng)答信號
128 1 SCL=0;
129 1 _Nop();
130 1 _Nop();
131 1 }
132
133
134
135
136
137
138
139 /*----------------------------------------------------------------
140 字節(jié)數(shù)據(jù)傳送函數(shù)
141 函數(shù)原型: unsigned char RcvByte();
142 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
143 發(fā)完后請用應(yīng)答函數(shù)。
144 ------------------------------------------------------------------*/
145 unsigned char RcvByte()
146 {
147 1 unsigned char retc;
148 1 unsigned char BitCnt;
149 1
150 1 retc=0;
151 1 SDA=1; //置數(shù)據(jù)線為輸入方式
152 1 for(BitCnt=0;BitCnt<8;BitCnt++)
153 1 {
154 2 _Nop();
155 2 SCL=0; //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
156 2 _Nop();
157 2 _Nop(); //時鐘低電平周期大于4.7us
158 2 _Nop();
159 2 _Nop();
160 2 _Nop();
161 2 SCL=1; //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
162 2 _Nop();
163 2 _Nop();
164 2 retc=retc<<1;
165 2 if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
166 2 _Nop();
167 2 _Nop();
168 2 }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -