📄 iic.lst
字号:
C51 COMPILER V8.02 IIC 03/30/2009 08:19:12 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN iic.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE iic.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 ZLG_I2C.C
3 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
4 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
5 与用户程序连接并扩展.....
6
7 注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作
8 一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)
9
10 ********************************************************************/
11 #include "main.h"
12
13 sbit SDA=P2^4; /*模拟I2C数据传送位*/
14 sbit SCL=P2^3; /*模拟I2C时钟控制位*/
15
16
17 uchar ack; //应答位标志位可设置成这样.
18
19 /*******************************************************************
20 起动总线函数
21 函数原型: void start_i2c(void);
22 功能: 启动I2C总线,即发送I2C起始条件.
23
24 ********************************************************************/
25 void start_i2c(void)
26 {
27 1 SDA=1; /*发送起始条件的数据信号*/
28 1 _Nop();
29 1
30 1 SCL=1;
31 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
32 1 _Nop();
33 1 _Nop();
34 1 _Nop();
35 1 _Nop();
36 1
37 1 SDA=0; /*发送起始信号*/
38 1 _Nop(); /* 起始条件锁定时间大于4μs*/
39 1 _Nop();
40 1 _Nop();
41 1 _Nop();
42 1 _Nop();
43 1
44 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
45 1 _Nop();
46 1 _Nop();
47 1
48 1 }
49
50
51
52
53 /*******************************************************************
54 结束总线函数
55 函数原型: void stop_i2c(void);
C51 COMPILER V8.02 IIC 03/30/2009 08:19:12 PAGE 2
56 功能: 结束I2C总线,即发送I2C结束条件.
57
58 ********************************************************************/
59 void stop_i2c(void)
60 {
61 1 SDA=0; /*发送结束条件的数据信号*/
62 1 _Nop(); /*发送结束条件的时钟信号*/
63 1
64 1 SCL=1; /*结束条件建立时间大于4μs*/
65 1 _Nop();
66 1 _Nop();
67 1 _Nop();
68 1 _Nop();
69 1 _Nop();
70 1
71 1 SDA=1; /*发送I2C总线结束信号*/
72 1 _Nop();
73 1 _Nop();
74 1 _Nop();
75 1 _Nop();
76 1
77 1 }
78
79
80
81
82 /*******************************************************************
83 字节数据传送函数
84 函数原型: void send_byte(uchar c);
85 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
86 此状态位进行操作.(不应答或非应答都使ack=0 假)
87 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
88 ********************************************************************/
89 void send_byte(uchar c)
90 {
91 1 uchar BitCnt;
92 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
93 1 {
94 2 if((c<<BitCnt)&0x80) SDA=1; /*判断发送位*/
95 2 else SDA=0;
96 2 _Nop();
97 2
98 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
99 2 _Nop();
100 2 _Nop(); /*保证时钟高电平周期大于4μs*/
101 2 _Nop();
102 2 _Nop();
103 2
104 2 SCL=0;
105 2 }
106 1 _Nop();
107 1 _Nop();
108 1
109 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
110 1 _Nop();
111 1 _Nop();
112 1
113 1 SCL=1;
114 1 _Nop();
115 1 _Nop();
116 1 _Nop();
117 1
C51 COMPILER V8.02 IIC 03/30/2009 08:19:12 PAGE 3
118 1 if(SDA==1) ack=0;
119 1 else ack=1; /*判断是否接收到应答信号*/
120 1 SCL=0;
121 1 _Nop();
122 1 _Nop();
123 1
124 1 }
125
126
127
128
129
130
131 /*******************************************************************
132 字节数据传送函数
133 函数原型: uchar receive_byte(void);
134 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
135 发完后请用应答函数。
136 ********************************************************************/
137 uchar receive_byte(void)
138 {
139 1 uchar retc;
140 1 uchar BitCnt;
141 1 retc=0;
142 1 SDA=1; /*置数据线为输入方式*/
143 1 for(BitCnt=0;BitCnt<8;BitCnt++)
144 1 {
145 2 _Nop();
146 2
147 2 SCL=0; /*置时钟线为低,准备接收数据位*/
148 2 _Nop();
149 2 _Nop();
150 2 _Nop();
151 2 _Nop(); /*时钟低电平周期大于4.7μs*/
152 2
153 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
154 2 _Nop();
155 2 _Nop();
156 2
157 2 retc=retc<<1;
158 2 if(SDA==1)
159 2 retc=retc+1; /*读数据位,接收的数据位放入retc中 */
160 2 _Nop();
161 2 _Nop();
162 2
163 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -