📄 i2c.lst
字号:
C51 COMPILER V8.05a I2C 01/11/2008 12:42:15 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil C\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 I2C.c
3 标准80C51单片机模拟I2C总线的主机程序
4 Copyright (c) 2005,广州周立功单片机发展有限公司
5 All rights reserved.
6 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的
7 */
8
9 #include "I2C.h"
10
11 //定义延时变量,用于宏I2C_Delay()
12 unsigned char data I2C_Delay_t;
13
14 /*-------------------------------------------------------------
15 宏定义:I2C_Delay()
16 功能:延时,模拟I2C总线专用
17 -------------------------------------------------------------*/
18 #define I2C_Delay()\
19 {\
20 I2C_Delay_t = (I2C_DELAY_VALUE);\
21 while ( --I2C_Delay_t != 0 );\
22 }
23
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 /*-------------------------------------------------------------
38 函数:I2C_Start()
39 功能:产生I2C总线的起始状态
40 说明:
41 SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
42 不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
43 本函数也可以用来产生重复起始状态
44 本函数执行后,I2C总线处于忙状态
45 -------------------------------------------------------------*/
46 void I2C_Start()
47 {
48 1 I2C_SDA = 1;
49 1 I2C_Delay();
50 1 I2C_SCL = 1;
51 1 I2C_Delay();
52 1 I2C_SDA = 0;
53 1 I2C_Delay();
54 1 I2C_SCL = 0;
55 1 I2C_Delay();
C51 COMPILER V8.05a I2C 01/11/2008 12:42:15 PAGE 2
56 1 }
57
58 /*-------------------------------------------------------------
59 函数:I2C_Write()
60 功能:向I2C总线写1个字节的数据
61 参数:
62 dat:要写到总线上的数据
63 -------------------------------------------------------------*/
64 void I2C_Write(char dat)
65 {
66 1 unsigned char t = 8;
67 1 do
68 1 {
69 2 I2C_SDA = (bit)(dat & 0x80);
70 2 dat <<= 1;
71 2 I2C_SCL = 1;
72 2 I2C_Delay();
73 2 I2C_SCL = 0;
74 2 I2C_Delay();
75 2 } while ( --t != 0 );
76 1 }
77
78 /*-------------------------------------------------------------
79 函数:I2C_Read()
80 功能:从从机读取1个字节的数据
81 返回:读取的一个字节数据
82 -------------------------------------------------------------*/
83 char I2C_Read()
84 {
85 1 char dat;
86 1 unsigned char t = 8;
87 1 I2C_SDA = 1; //在读取数据之前,要把SDA拉高
88 1 do
89 1 {
90 2 I2C_SCL = 1;
91 2 I2C_Delay();
92 2 dat <<= 1;
93 2 if ( I2C_SDA ) dat |= 0x01;
94 2 I2C_SCL = 0;
95 2 I2C_Delay();
96 2 } while ( --t != 0 );
97 1 return dat;
98 1 }
99
100 /* -------------------------------------------------------------
101 函数:I2C_GetAck()
102 功能:读取从机应答位
103 返回:
104 0:从机应答
105 1:从机非应答
106 说明:
107 从机在收到每个字节的数据后,要产生应答位
108 从机在收到最后1个字节的数据后,一般要产生非应答位
109 -------------------------------------------------------------*/
110 bit I2C_GetAck()
111 {
112 1 bit ack;
113 1 I2C_SDA = 1;
114 1 I2C_Delay();
115 1 I2C_SCL = 1;
116 1 I2C_Delay();
117 1 ack = I2C_SDA;
C51 COMPILER V8.05a I2C 01/11/2008 12:42:15 PAGE 3
118 1 I2C_SCL = 0;
119 1 I2C_Delay();
120 1 return ack;
121 1 }
122
123 /*-------------------------------------------------------------
124 函数:I2C_PutAck()
125 功能:主机产生应答位或非应答位
126 参数:
127 ack=0:主机产生应答位
128 ack=1:主机产生非应答位
129 说明:
130 主机在接收完每一个字节的数据后,都应当产生应答位
131 主机在接收完最后一个字节的数据后,应当产生非应答位
132 -------------------------------------------------------------*/
133 void I2C_PutAck(bit ack)
134 {
135 1 I2C_SDA = ack;
136 1 I2C_Delay();
137 1 I2C_SCL = 1;
138 1 I2C_Delay();
139 1 I2C_SCL = 0;
140 1 I2C_Delay();
141 1 }
142
143 /*-------------------------------------------------------------
144 函数:I2C_Stop()
145 功能:产生I2C总线的停止状态
146 说明:
147 SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
148 不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
149 本函数执行后,I2C总线处于空闲状态
150 -------------------------------------------------------------*/
151 void I2C_Stop()
152 {
153 1 unsigned int t = I2C_STOP_WAIT_VALUE;
154 1 I2C_SDA = 0;
155 1 I2C_Delay();
156 1 I2C_SCL = 1;
157 1 I2C_Delay();
158 1 I2C_SDA = 1;
159 1 I2C_Delay();
160 1 while ( --t != 0 ); //在下一次产生Start之前,要加一定的延时
161 1 }
162
163 /*-------------------------------------------------------------
164 函数:I2C_Puts()
165 功能:I2C总线综合发送函数,向从机发送多个字节的数据
166 参数:
167 SlaveAddr:从机地址(7位纯地址,不含读写位)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -