?? zlg_i2c.lst
字號(hào):
C51 COMPILER V8.02 ZLG_I2C 11/30/2007 14:28:45 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE ZLG_I2C
OBJECT MODULE PLACED IN ZLG_I2C.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\ZLG_I2C.c BROWSE DEBUG OBJECTEXTEND PRINT(.\ZLG_I2C.lst) OBJECT(ZLG_I2C
-.obj)
line level source
1 /********************************************************************
2 ZLG_I2C.C
3 此程序是I2C操作平臺(tái)(主方式的軟件平臺(tái))的底層的C子程序,如發(fā)送數(shù)據(jù)
4 及接收數(shù)據(jù),應(yīng)答位發(fā)送,并提供了幾個(gè)直接面對(duì)器件的操作函數(shù),它很方便的
5 與用戶程序連接并擴(kuò)展.....
6
7 注意:函數(shù)是采用軟件延時(shí)的方法產(chǎn)生SCL脈沖,固對(duì)高晶振頻率要作
8 一定的修改....(本例是1us機(jī)器周期,即晶振頻率要小于12MHZ)
9
10 ********************************************************************/
11
12 #include "..\inc\main.h"
13
14 sbit SDA=P3^5; /*模擬I2C數(shù)據(jù)傳送位*/
15 sbit SCL=P3^4; /*模擬I2C時(shí)鐘控制位*/
16
17 //bit ack; /*應(yīng)答標(biāo)志位*/
18 uchar ack; //應(yīng)答位標(biāo)志位可設(shè)置成這樣.
19
20 /*******************************************************************
21 起動(dòng)總線函數(shù)
22 函數(shù)原型: void start_i2c(void);
23 功能: 啟動(dòng)I2C總線,即發(fā)送I2C起始條件.
24
25 ********************************************************************/
26 void start_i2c(void)
27 {
28 1 SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
29 1 _Nop();
30 1 SCL=1;
31 1 _Nop(); /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
32 1 _Nop();
33 1 _Nop();
34 1 _Nop();
35 1 _Nop();
36 1 SDA=0; /*發(fā)送起始信號(hào)*/
37 1 _Nop(); /* 起始條件鎖定時(shí)間大于4μs*/
38 1 _Nop();
39 1 _Nop();
40 1 _Nop();
41 1 _Nop();
42 1 SCL=0; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
43 1 _Nop();
44 1 _Nop();
45 1 }
46
47
48
49
50 /*******************************************************************
51 結(jié)束總線函數(shù)
52 函數(shù)原型: void stop_i2c(void);
53 功能: 結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.
54
C51 COMPILER V8.02 ZLG_I2C 11/30/2007 14:28:45 PAGE 2
55 ********************************************************************/
56 void stop_i2c(void)
57 {
58 1 SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/
59 1 _Nop(); /*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/
60 1 SCL=1; /*結(jié)束條件建立時(shí)間大于4μs*/
61 1 _Nop();
62 1 _Nop();
63 1 _Nop();
64 1 _Nop();
65 1 _Nop();
66 1 SDA=1; /*發(fā)送I2C總線結(jié)束信號(hào)*/
67 1 _Nop();
68 1 _Nop();
69 1 _Nop();
70 1 _Nop();
71 1 }
72
73
74
75
76 /*******************************************************************
77 字節(jié)數(shù)據(jù)傳送函數(shù)
78 函數(shù)原型: void send_byte(uchar c);
79 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
80 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)
81 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
82 ********************************************************************/
83 void send_byte(uchar c)
84 {
85 1 uchar BitCnt;
86 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數(shù)據(jù)長(zhǎng)度為8位*/
87 1 {
88 2 if((c<<BitCnt)&0x80) SDA=1; /*判斷發(fā)送位*/
89 2 else SDA=0;
90 2 _Nop();
91 2 SCL=1; /*置時(shí)鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
92 2 _Nop();
93 2 _Nop(); /*保證時(shí)鐘高電平周期大于4μs*/
94 2 _Nop();
95 2 _Nop();
96 2 _Nop();
97 2 SCL=0;
98 2 }
99 1 _Nop();
100 1 _Nop();
101 1 SDA=1; /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
102 1 _Nop();
103 1 _Nop();
104 1 SCL=1;
105 1 _Nop();
106 1 _Nop();
107 1 _Nop();
108 1 if(SDA==1) ack=0;
109 1 else ack=1; /*判斷是否接收到應(yīng)答信號(hào)*/
110 1 SCL=0;
111 1 _Nop();
112 1 _Nop();
113 1 }
114
115
116
C51 COMPILER V8.02 ZLG_I2C 11/30/2007 14:28:45 PAGE 3
117
118
119
120 /*******************************************************************
121 字節(jié)數(shù)據(jù)傳送函數(shù)
122 函數(shù)原型: uchar receive_byte(void);
123 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
124 發(fā)完后請(qǐng)用應(yīng)答函數(shù)。
125 ********************************************************************/
126 uchar receive_byte(void)
127 {
128 1 uchar retc;
129 1 uchar BitCnt;
130 1 retc=0;
131 1 SDA=1; /*置數(shù)據(jù)線為輸入方式*/
132 1 for(BitCnt=0;BitCnt<8;BitCnt++)
133 1 {
134 2 _Nop();
135 2 SCL=0; /*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
136 2 _Nop();
137 2 _Nop(); /*時(shí)鐘低電平周期大于4.7μs*/
138 2 _Nop();
139 2 _Nop();
140 2 _Nop();
141 2 SCL=1; /*置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
142 2 _Nop();
143 2 _Nop();
144 2 retc=retc<<1;
145 2 if(SDA==1)
146 2 retc=retc+1; /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
147 2 _Nop();
148 2 _Nop();
149 2 }
150 1 SCL=0;
151 1 _Nop();
152 1 _Nop();
153 1 return (retc);
154 1 }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -