📄 i2c.lst
字号:
C51 COMPILER V7.06 I2C 06/02/2010 10:03:45 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\obj\i2c.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\i2c.lst) OBJECT(.\obj\i2c.obj)
stmt level source
1 /*-----------------------------------------------
2 名称:IIC协议
3 论坛:www.doflye.net
4 编写:shifang
5 修改:无
6 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
7 周期,即晶振频率要小于12MHZ)
8 ------------------------------------------------*/
9
10
11 #include "i2c.h"
12
13
14 #define _Nop() _nop_() //定义空指令
15
16 bit ack; //应答标志位
17
18 sbit SDA=P2^1;
19 sbit SCL=P2^0;
20 /*------------------------------------------------
21 uS延时函数,含有输入参数 unsigned char t,无返回值
22 unsigned char 是定义无符号字符变量,其值的范围是
23 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
24 长度如下 T=tx2+5 uS
25 ------------------------------------------------*/
26 void DelayUs2x(unsigned char t)
27 {
28 1 while(--t);
29 1 }
30 /*------------------------------------------------
31 mS延时函数,含有输入参数 unsigned char t,无返回值
32 unsigned char 是定义无符号字符变量,其值的范围是
33 0~255 这里使用晶振12M,精确延时请使用汇编
34 ------------------------------------------------*/
35 void DelayMs(unsigned char t)
36 {
37 1
38 1 while(t--)
39 1 {
40 2 //大致延时1mS
41 2 DelayUs2x(245);
42 2 DelayUs2x(245);
43 2 }
44 1 }
45
46 /*------------------------------------------------
47 启动总线
48 ------------------------------------------------*/
49 void Start_I2c()
50 {
51 1 SDA=1; //发送起始条件的数据信号
52 1 _Nop();
53 1 SCL=1;
54 1 _Nop(); //起始条件建立时间大于4.7us,延时
55 1 _Nop();
C51 COMPILER V7.06 I2C 06/02/2010 10:03:45 PAGE 2
56 1 _Nop();
57 1 _Nop();
58 1 _Nop();
59 1 SDA=0; //发送起始信号
60 1 _Nop(); //起始条件锁定时间大于4μ
61 1 _Nop();
62 1 _Nop();
63 1 _Nop();
64 1 _Nop();
65 1 SCL=0; //钳住I2C总线,准备发送或接收数据
66 1 _Nop();
67 1 _Nop();
68 1 }
69 /*------------------------------------------------
70 结束总线
71 ------------------------------------------------*/
72 void Stop_I2c()
73 {
74 1 SDA=0; //发送结束条件的数据信号
75 1 _Nop(); //发送结束条件的时钟信号
76 1 SCL=1; //结束条件建立时间大于4μ
77 1 _Nop();
78 1 _Nop();
79 1 _Nop();
80 1 _Nop();
81 1 _Nop();
82 1 SDA=1; //发送I2C总线结束信号
83 1 _Nop();
84 1 _Nop();
85 1 _Nop();
86 1 _Nop();
87 1 }
88
89
90
91
92 /*----------------------------------------------------------------
93 字节数据传送函数
94 函数原型: void SendByte(unsigned char c);
95 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
96 此状态位进行操作.(不应答或非应答都使ack=0 假)
97 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
98 ------------------------------------------------------------------*/
99 void SendByte(unsigned char c)
100 {
101 1 unsigned char BitCnt;
102 1
103 1 for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
104 1 {
105 2 if((c<<BitCnt)&0x80)SDA=1; //判断发送位
106 2 else SDA=0;
107 2 _Nop();
108 2 SCL=1; //置时钟线为高,通知被控器开始接收数据位
109 2 _Nop();
110 2 _Nop(); //保证时钟高电平周期大于4μ
111 2 _Nop();
112 2 _Nop();
113 2 _Nop();
114 2 SCL=0;
115 2 }
116 1
117 1 _Nop();
C51 COMPILER V7.06 I2C 06/02/2010 10:03:45 PAGE 3
118 1 _Nop();
119 1 SDA=1; //8位发送完后释放数据线,准备接收应答位
120 1 _Nop();
121 1 _Nop();
122 1 SCL=1;
123 1 _Nop();
124 1 _Nop();
125 1 _Nop();
126 1 if(SDA==1)ack=0;
127 1 else ack=1; //判断是否接收到应答信号
128 1 SCL=0;
129 1 _Nop();
130 1 _Nop();
131 1 }
132
133
134
135
136
137
138
139 /*----------------------------------------------------------------
140 字节数据传送函数
141 函数原型: unsigned char RcvByte();
142 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
143 发完后请用应答函数。
144 ------------------------------------------------------------------*/
145 unsigned char RcvByte()
146 {
147 1 unsigned char retc;
148 1 unsigned char BitCnt;
149 1
150 1 retc=0;
151 1 SDA=1; //置数据线为输入方式
152 1 for(BitCnt=0;BitCnt<8;BitCnt++)
153 1 {
154 2 _Nop();
155 2 SCL=0; //置时钟线为低,准备接收数据位
156 2 _Nop();
157 2 _Nop(); //时钟低电平周期大于4.7us
158 2 _Nop();
159 2 _Nop();
160 2 _Nop();
161 2 SCL=1; //置时钟线为高使数据线上数据有效
162 2 _Nop();
163 2 _Nop();
164 2 retc=retc<<1;
165 2 if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
166 2 _Nop();
167 2 _Nop();
168 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -