📄 iic.lst
字号:
C51 COMPILER V7.20 IIC 05/31/2006 22:36:00 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC.c ROM(COMPACT)
line level source
1
2
3
4 #include <allseting.h>
5 #include <regx52.h> /*头文件的包含*/
6 #include <intrins.h>
7 #define _Nop() _nop_() /*定义空指令*/
8
9 /******************** 端口位定义 *******************************/
10
11
12 sbit SDA=P3^7; /*模拟I2C数据传送位*/
13 sbit SCL=P3^6; /*模拟I2C时钟控制位*/
14
15 bit ack; /*应答标志位*/
16
17
18
19
20
21
22 /*******************************************************************
23 起动总线函数
24 ********************************************************************/
25 void Start_I2c()
26 {
27 1 SDA=1; /*发送起始条件的数据信号*/
28 1 _Nop();
29 1 SCL=1;
30 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
31 1 _Nop();
32 1 _Nop();
33 1 _Nop();
34 1 _Nop();
35 1 SDA=0; /*发送起始信号*/
36 1 _Nop(); /* 起始条件锁定时间大于4μs*/
37 1 _Nop();
38 1 _Nop();
39 1 _Nop();
40 1 _Nop();
41 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
42 1 _Nop();
43 1 _Nop();
44 1 }
45
46
47
48
49 /*******************************************************************
50 结束总线函数
51 ********************************************************************/
52 void Stop_I2c()
53 {
54 1 SDA=0; /*发送结束条件的数据信号*/
55 1 _Nop(); /*发送结束条件的时钟信号*/
C51 COMPILER V7.20 IIC 05/31/2006 22:36:00 PAGE 2
56 1 SCL=1; /*结束条件建立时间大于4μs*/
57 1 _Nop();
58 1 _Nop();
59 1 _Nop();
60 1 _Nop();
61 1 _Nop();
62 1 SDA=1; /*发送I2C总线结束信号*/
63 1 _Nop();
64 1 _Nop();
65 1 _Nop();
66 1 _Nop();
67 1 }
68
69
70
71
72 /*******************************************************************
73 字节数据传送函数
74 ********************************************************************/
75 void SendByte(uchar c)
76 {
77 1 uchar BitCnt;
78 1
79 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
80 1 {
81 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
82 2 else SDA=0;
83 2 _Nop();
84 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
85 2 _Nop();
86 2 _Nop(); /*保证时钟高电平周期大于4μs*/
87 2 _Nop();
88 2 _Nop();
89 2 _Nop();
90 2 SCL=0;
91 2 }
92 1
93 1 _Nop();
94 1 _Nop();
95 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
96 1 _Nop();
97 1 _Nop();
98 1 SCL=1;
99 1 _Nop();
100 1 _Nop();
101 1 _Nop();
102 1 if(SDA==1)ack=0;
103 1 else ack=1; /*判断是否接收到应答信号*/
104 1 SCL=0;
105 1 _Nop();
106 1 _Nop();
107 1 }
108
109
110
111
112
113
114 /*******************************************************************
115 字节数据传送函数
116 ********************************************************************/
117 uchar RcvByte()
C51 COMPILER V7.20 IIC 05/31/2006 22:36:00 PAGE 3
118 {
119 1 uchar retc;
120 1 uchar BitCnt;
121 1
122 1 retc=0;
123 1 SDA=1; /*置数据线为输入方式*/
124 1 for(BitCnt=0;BitCnt<8;BitCnt++)
125 1 {
126 2 _Nop();
127 2 SCL=0; /*置时钟线为低,准备接收数据位*/
128 2 _Nop();
129 2 _Nop(); /*时钟低电平周期大于4.7μs*/
130 2 _Nop();
131 2 _Nop();
132 2 _Nop();
133 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
134 2 _Nop();
135 2 _Nop();
136 2 retc=retc<<1;
137 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
138 2 _Nop();
139 2 _Nop();
140 2 }
141 1 SCL=0;
142 1 _Nop();
143 1 _Nop();
144 1 return(retc);
145 1 }
146
147
148
149
150 /********************************************************************
151 应答子函数
152 ********************************************************************/
153 void Ack_I2c(bit a)
154 {
155 1
156 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
157 1 else SDA=1;
158 1 _Nop();
159 1 _Nop();
160 1 _Nop();
161 1 SCL=1;
162 1 _Nop();
163 1 _Nop(); /*时钟低电平周期大于4μs*/
164 1 _Nop();
165 1 _Nop();
166 1 _Nop();
167 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
168 1 _Nop();
169 1 _Nop();
170 1 }
171
172
173
174
175
176
177
C51 COMPILER V7.20 IIC 05/31/2006 22:36:00 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 159 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -