You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

179 lines
7.1 KiB

C51 COMPILER V9.56.0.0 I2C 04/28/2022 23:10:25 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/28/2022 23:10:25 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/28/2022 23:10:25 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)