📄 i2c.lst
字号:
C51 COMPILER V7.06 I2C 07/20/2008 03:32:37 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN E:\温度表\I2C.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE E:\温度表\I2C.C DB SB OE
stmt level source
1 /******************************************************************************
2 I2C.C
3 标准80C51模拟I2C总线程序(主模式,通用)
4 ******************************************************************************/
5 #include <REG52.H>
6 #include "I2C.H"
7 #include <intrins.h>
8
9 //模拟I2C总线的管脚定义
10 sbit I2C_SCL = P3^6; //定义I2C总线时钟信号
11 sbit I2C_SDA = P3^7; //定义I2C总线数据信号
12 /*******************************************************************************/
13 /******************************************************************************
14 函数:I2C_Delay()
15 功能:模拟I2C总线延时
16 说明:请根据具体情况调整延时值
17 ******************************************************************************/
18 void I2C_Delay()
19 {
20 1 unsigned char t;
21 1 t = 100;
22 1 while ( --t != 0 ); //延时2*t个机器周期
23 1 }
24 /******************************************************************************
25 函数:I2C_Init()
26 功能:I2C总线初始化,使总线处于空闲状态
27 说明:在main()函数的开始处,应当执行一次本函数
28 ******************************************************************************/
29 void I2C_Init()
30 {
31 1 I2C_SCL = 1;
32 1 I2C_Delay();
33 1 I2C_SDA = 1;
34 1 I2C_Delay();
35 1 }
36 /******************************************************************************
37 函数:I2C_Start()
38 功能:产生I2C总线的起始条件
39 说明:SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
40 本函数也用来产生重复起始条件
41 ******************************************************************************/
42 void I2C_Start()
43 {
44 1 I2C_SDA = 1;
45 1 I2C_Delay();
46 1 I2C_SCL = 1;
47 1 I2C_Delay();
48 1 I2C_SDA = 0;
49 1 I2C_Delay();
50 1 I2C_SCL = 0;
51 1 I2C_Delay();
52 1 }
53 /******************************************************************************
54 函数:I2C_Write()
55 功能:向I2C总线写1个字节的数据
C51 COMPILER V7.06 I2C 07/20/2008 03:32:37 PAGE 2
56 参数:dat是要写到总线上的数据
57 ******************************************************************************/
58 void I2C_Write(unsigned char dat)
59 {
60 1 unsigned char t = 8;
61 1 do
62 1 {
63 2 I2C_SDA = (bit)(dat & 0x80);
64 2 dat <<= 1;
65 2 I2C_SCL = 1;
66 2 I2C_Delay();
67 2 while(!I2C_SCL);
68 2 I2C_SCL = 0;
69 2 I2C_Delay();
70 2 } while ( --t != 0 );
71 1 }
72 /******************************************************************************
73 函数:I2C_Read()
74 功能:从从机读取1个字节的数据
75 返回:读取的1个字节数据
76 ******************************************************************************/
77 unsigned char I2C_Read()
78 {
79 1 unsigned char dat = 0;
80 1 unsigned char t = 8;
81 1 I2C_SDA = 1; //在读取数据之前,要把SDA拉高,使之处于输入状态
82 1 do
83 1 {
84 2 dat <<= 1;
85 2 I2C_SCL = 1;
86 2 while(!I2C_SCL);
87 2 I2C_Delay();
88 2 if ( I2C_SDA ) dat++;
89 2 I2C_SCL = 0;
90 2 I2C_Delay();
91 2 } while ( --t != 0 );
92 1 return dat;
93 1 }
94 /******************************************************************************
95 函数:I2C_GetAck()
96 功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据
97 返回:0-从机应答
98 1-从机非应答
99 说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输
100 ******************************************************************************/
101 bit I2C_GetAck()
102 {
103 1 bit Ack;
104 1 I2C_SDA = 1;
105 1 I2C_Delay();
106 1 I2C_SCL = 1;
107 1 I2C_Delay();
108 1 while(!I2C_SCL);
109 1 Ack = I2C_SDA;
110 1 I2C_SCL = 0;
111 1 I2C_Delay();
112 1 return Ack;
113 1 }
114 /******************************************************************************
115 函数:I2C_PutAck()
116 功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据
117 参数: Ack = 0:主机应答
C51 COMPILER V7.06 I2C 07/20/2008 03:32:37 PAGE 3
118 Ack = 1:主机非应答
119 说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节时,应当产生非应答
120 ******************************************************************************/
121 void I2C_PutAck(bit Ack)
122 {
123 1 I2C_SDA = Ack;
124 1 I2C_Delay();
125 1 I2C_SCL = 1;
126 1 I2C_Delay();
127 1 while(!I2C_SCL);
128 1 I2C_SCL = 0;
129 1 I2C_Delay();
130 1 }
131 /******************************************************************************
132 函数:I2C_Stop()
133 功能:产生I2C总线的停止条件
134 说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
135 ******************************************************************************/
136 void I2C_Stop()
137 {
138 1 I2C_SDA = 0;
139 1 I2C_Delay();
140 1 I2C_SCL = 1;
141 1 I2C_Delay();
142 1 I2C_SDA = 1;
143 1 I2C_Delay();
144 1 }
145 /******************************************************************************
146 函数:clock()
147 功能:延时一段时间,并产生应答位
148 说明:
149 ******************************************************************************/
150 void clock()
151 {
152 1 unsigned char i=0;
153 1 I2C_SCL=1; _nop_();
154 1 while ((I2C_SDA==1)&&(i<255))i++;
155 1 I2C_SCL=0;
156 1 _nop_();
157 1 }
158 //------------------------------------------------------------------------------
159
C51 COMPILER V7.06 I2C 07/20/2008 03:32:37 PAGE 4
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
I2C_SCL. . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B6H 1
P3 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B0H 1
_I2C_Write . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
dat. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0006H 1
t. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
IE . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A8H 1
clock. . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
i. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
I2C_Delay. . . . . . . . . . . . . . . PUBLIC CODE PROC 0007H -----
t. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
IP . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B8H 1
I2C_Read . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
dat. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0006H 1
t. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
I2C_Start. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
SCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0098H 1
I2C_Init . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
TCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0088H 1
I2C_Stop . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
I2C_GetAck . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
Ack. . . . . . . . . . . . . . . . . AUTO DATA BIT 0000H 1
T2CON. . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00C8H 1
I2C_PutAck . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
Ack. . . . . . . . . . . . . . . . . AUTO DATA BIT 0000H 1
I2C_SDA. . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B7H 1
PSW. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00D0H 1
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 159 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -