|
|
C51 COMPILER V9.56.0.0 I2C 04/09/2022 14:48:34 PAGE 1 |
|
|
|
|
|
|
|
|
C51 COMPILER V9.56.0.0, COMPILATION OF MODULE I2C |
|
|
OBJECT MODULE PLACED IN i2c.OBJ |
|
|
COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE i2c.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND TABS(2) |
|
|
|
|
|
line level source |
|
|
|
|
|
1 #include"i2c.h" |
|
|
2 |
|
|
3 /******************************************************************************* |
|
|
4 * 函数名 : Delay10us() |
|
|
5 * 函数功能 : 延时10us |
|
|
6 * 输入 : 无 |
|
|
7 * 输出 : 无 |
|
|
8 *******************************************************************************/ |
|
|
9 |
|
|
10 void Delay10us() |
|
|
11 { |
|
|
12 1 unsigned char a,b; |
|
|
13 1 for(b=1;b>0;b--) |
|
|
14 1 for(a=2;a>0;a--); |
|
|
15 1 |
|
|
16 1 } |
|
|
17 /******************************************************************************* |
|
|
18 * 函数名 : I2cStart() |
|
|
19 * 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿 |
|
|
20 * 输入 : 无 |
|
|
21 * 输出 : 无 |
|
|
22 * 备注 : 起始之后SDA和SCL都为0 |
|
|
23 *******************************************************************************/ |
|
|
24 |
|
|
25 void I2cStart() |
|
|
26 { |
|
|
27 1 SDA=1; |
|
|
28 1 Delay10us(); |
|
|
29 1 SCL=1; |
|
|
30 1 Delay10us();//建立时间是SDA保持时间>4.7us |
|
|
31 1 SDA=0; |
|
|
32 1 Delay10us();//保持时间是>4us |
|
|
33 1 SCL=0; |
|
|
34 1 Delay10us(); |
|
|
35 1 } |
|
|
36 /******************************************************************************* |
|
|
37 * 函数名 : I2cStop() |
|
|
38 * 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿 |
|
|
39 * 输入 : 无 |
|
|
40 * 输出 : 无 |
|
|
41 * 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲 |
|
|
42 *******************************************************************************/ |
|
|
43 |
|
|
44 void I2cStop() |
|
|
45 { |
|
|
46 1 SDA=0; |
|
|
47 1 Delay10us(); |
|
|
48 1 SCL=1; |
|
|
49 1 Delay10us();//建立时间大于4.7us |
|
|
50 1 SDA=1; |
|
|
51 1 Delay10us(); |
|
|
52 1 } |
|
|
53 /******************************************************************************* |
|
|
54 * 函数名 : I2cSendByte(unsigned char dat) |
|
|
55 * 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定 |
|
|
C51 COMPILER V9.56.0.0 I2C 04/09/2022 14:48:34 PAGE 2 |
|
|
|
|
|
56 * 输入 : num |
|
|
57 * 输出 : 0或1。发送成功返回1,发送失败返回0 |
|
|
58 * 备注 : 发送完一个字节SCL=0,SDA=1 |
|
|
59 *******************************************************************************/ |
|
|
60 |
|
|
61 unsigned char I2cSendByte(unsigned char dat) |
|
|
62 { |
|
|
63 1 unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。 |
|
|
64 1 for(a=0;a<8;a++)//要发送8位,从最高位开始 |
|
|
65 1 { |
|
|
66 2 SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号 |
|
|
67 2 dat=dat<<1; |
|
|
68 2 Delay10us(); |
|
|
69 2 SCL=1; |
|
|
70 2 Delay10us();//建立时间>4.7us |
|
|
71 2 SCL=0; |
|
|
72 2 Delay10us();//时间大于4us |
|
|
73 2 } |
|
|
74 1 SDA=1; |
|
|
75 1 Delay10us(); |
|
|
76 1 SCL=1; |
|
|
77 1 while(SDA)//等待应答,也就是等待从设备把SDA拉低 |
|
|
78 1 { |
|
|
79 2 b++; |
|
|
80 2 if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束 |
|
|
81 2 { |
|
|
82 3 SCL=0; |
|
|
83 3 Delay10us(); |
|
|
84 3 return 0; |
|
|
85 3 } |
|
|
86 2 } |
|
|
87 1 SCL=0; |
|
|
88 1 Delay10us(); |
|
|
89 1 return 1; |
|
|
90 1 } |
|
|
91 /******************************************************************************* |
|
|
92 * 函数名 : I2cReadByte() |
|
|
93 * 函数功能 : 使用I2c读取一个字节 |
|
|
94 * 输入 : 无 |
|
|
95 * 输出 : dat |
|
|
96 * 备注 : 接收完一个字节SCL=0,SDA=1. |
|
|
97 *******************************************************************************/ |
|
|
98 |
|
|
99 unsigned char I2cReadByte() |
|
|
100 { |
|
|
101 1 unsigned char a=0,dat=0; |
|
|
102 1 SDA=1; //起始和发送一个字节之后SCL都是0 |
|
|
103 1 Delay10us(); |
|
|
104 1 for(a=0;a<8;a++)//接收8个字节 |
|
|
105 1 { |
|
|
106 2 SCL=1; |
|
|
107 2 Delay10us(); |
|
|
108 2 dat<<=1; |
|
|
109 2 dat|=SDA; |
|
|
110 2 Delay10us(); |
|
|
111 2 SCL=0; |
|
|
112 2 Delay10us(); |
|
|
113 2 } |
|
|
114 1 return dat; |
|
|
115 1 } |
|
|
116 |
|
|
117 |
|
|
C51 COMPILER V9.56.0.0 I2C 04/09/2022 14:48:34 PAGE 3 |
|
|
|
|
|
118 /******************************************************************************* |
|
|
119 * 函数名 : void At24c02Write(unsigned char addr,unsigned char dat) |
|
|
120 * 函数功能 : 往24c02的一个地址写入一个数据 |
|
|
121 * 输入 : 无 |
|
|
122 * 输出 : 无 |
|
|
123 *******************************************************************************/ |
|
|
124 |
|
|
125 void At24c02Write(unsigned char addr,unsigned char dat) |
|
|
126 { |
|
|
127 1 I2cStart(); |
|
|
128 1 I2cSendByte(0xa0);//发送写器件地址 |
|
|
129 1 I2cSendByte(addr);//发送要写入内存地址 |
|
|
130 1 I2cSendByte(dat); //发送数据 |
|
|
131 1 I2cStop(); |
|
|
132 1 } |
|
|
133 /******************************************************************************* |
|
|
134 * 函数名 : unsigned char At24c02Read(unsigned char addr) |
|
|
135 * 函数功能 : 读取24c02的一个地址的一个数据 |
|
|
136 * 输入 : 无 |
|
|
137 * 输出 : 无 |
|
|
138 *******************************************************************************/ |
|
|
139 |
|
|
140 unsigned char At24c02Read(unsigned char addr) |
|
|
141 { |
|
|
142 1 unsigned char num; |
|
|
143 1 I2cStart(); |
|
|
144 1 I2cSendByte(0xa0); //发送写器件地址 |
|
|
145 1 I2cSendByte(addr); //发送要读取的地址 |
|
|
146 1 I2cStart(); |
|
|
147 1 I2cSendByte(0xa1); //发送读器件地址 |
|
|
148 1 num=I2cReadByte(); //读取数据 |
|
|
149 1 I2cStop(); |
|
|
150 1 return num; |
|
|
151 1 } |
|
|
152 |
|
|
|
|
|
|
|
|
MODULE INFORMATION: STATIC OVERLAYABLE |
|
|
CODE SIZE = 201 ---- |
|
|
CONSTANT SIZE = ---- ---- |
|
|
XDATA SIZE = ---- ---- |
|
|
PDATA SIZE = ---- ---- |
|
|
DATA SIZE = ---- ---- |
|
|
IDATA SIZE = ---- ---- |
|
|
BIT SIZE = ---- ---- |
|
|
END OF MODULE INFORMATION. |
|
|
|
|
|
|
|
|
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|
|
|
|