📄 i2c.lst
字号:
C51 COMPILER V8.02 I2C 04/18/2008 11:57:43 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include<intrins.h>
3 #define BYTE unsigned char //宏定义
4 #define WORD int
5 #define _Nop() _nop_() //定义空指令
6 /*常量、变量定义区*/
7 /*端口位定义区*/
8 sibt SCL=P3^0; //模拟I2C时钟控制位
*** ERROR C129 IN LINE 8 OF I2C.C: missing ';' before 'SCL'
9 sibt SDA=P3^1; //模拟I2C数据传送位
10 /*状态标志*/
11 bit ack;
12 /**************************************************
13 启动总线函数
14 函数原形:
15 void start_I2C();
16 功能:
17 启动I2C总线,即发送I2C起始条件
18 参数:无
19 返回值:无
20 *****************************************************/
21 void start_I2C()
22 { SDA=1; //发送起始条件的数据信号\
*** WARNING C329 IN LINE 22 OF i2c.c: single-line comment contains line-continuation
23 _Nop();
24 SCL=1;
25 _Nop(); //起始条件建立时间大于4uS
26 _Nop();
27 _Nop();
28 _Nop();
29 _Nop();
30 SDA=0; //发送起始信号
31 _Nop(); //起始条件锁定时间大于4us
32 _Nop();
33 _Nop();
34 _Nop();
35 _Nop();
36 SCL=0; //准备发送或接受数据
37 _Nop();
38 _Nop();
39 }
40 /**************************************************
41 结束总线函数
42 函数原形:
43 void stop_I2C();
44 功能:
45 结束I2C总线,即发送I2C结束条件
46 参数:无
47 返回值:无
48 *****************************************************/
49 void stop_I2C()
50 { SDA=0; //发送结束条件的数据信号
51 _Nop();
52 SCL=1; //发送结束条件的时钟信号
53 _Nop(); //结束条件建立时间大于4uS
C51 COMPILER V8.02 I2C 04/18/2008 11:57:43 PAGE 2
54 _Nop();
55 _Nop();
56 _Nop();
57 _Nop();
58 SDA=1; //发送结束信号
59 _Nop(); //结束条件锁定时间大于4us
60 _Nop();
61 _Nop();
62 _Nop();
63 }
64 /*******************************************************
65 字节数据传送函数
66 函数原形:
67 void sendbyte(BYTE data);
68 功能:
69 发送数据,可以是地址,发送后等待回应,并对此状态位进行操作.
70 应答或非应答都使ack=0,发送正常,ack=1;
71 ack=0,表示接收器无应答或损坏
72 参数:
73 data:需要发送的数据
74 返回值:无
75 ********************************************************/
76 void sendbyte(BYTE data)
77 {
78 BYTE bitcount;
79 for(bitcount=0;bitcount<8;bitcount++) //要传送的数据长度为8位
80 {
81 if((data<<bitcount)&0x80) //判断发送位
82 SDA=1;
83 else
84 SDA=0;
85 _Nop();
86 SCL=1; //置时钟线为高,通知被控器开始接收数据位
87 _Nop(); //保证时钟高电平周期大于4um
88 _Nop();
89 _Nop();
90 _Nop();
91 _Nop();
92 SCL=0;
93 }
94 _Nop();
95 _Nop();
96 SDA=1; //8位发送后释放数据线,准备接收应答位
97 _Nop();
98 _Nop();
99 SCL=1;
100 _Nop();
101 _Nop();
102 _Nop();
103 if(SDA==1)
104 ack=0;
105 else ack=1; 、 //判断是否接收到应答信号
106 SCL=0;
107 _Nop();
108 _Nop();
109 }
110 /*******************************************************
111 字节数据接收函数
112 函数原形:
113 BYTE recbyte();
114 功能:用来接收从器件传来的数据,并判断总线错误(不发生应答信号),发送后请用应答函数
115 参数:无
C51 COMPILER V8.02 I2C 04/18/2008 11:57:43 PAGE 3
116 返回值:读到的数据
117 ********************************************************/
118 BYTE recbyte()
119 { BYTE recdata;
120 BYTE bitcount;
121 recdata=0;
122 SDA=1; //置数据线为输入方式
123 for(bitcount=0;bitcount<8;bitcount++)
124 { _Nop();
125 _Nop();
126 SCL=0; 、//置时钟线为低,准备接收数据位
127 _Nop(); //保证时钟低电平周期大于4um
128 _Nop();
129 _Nop();
130 _Nop();
131 _Nop();
132 SCL=1; //置时钟为高使数据线上数据有效
133 _Nop();
134 _Nop();
135 _Nop();
136 recdata=recdata<<1;
137 if(SDA=1)
138 recdata=recdata+1; //读数据位,接收的数据位放入recdata中
139 _Nop();
140 _Nop();
141 _Nop();
142 }
143 SCL=0;
144 _Nop();
145 _Nop();
146 _Nop();
147 return(recdata);
148 、、
149 }
150 /*******************************************************
151 应答子函数
152 函数原形:void ack_i2c(bit a);
153 功能:主控器进行应答信号,可以是应答或非应答信号。
154 参数:a应答信号
155 返回值:无
156 ********************************************************/
157 void ack_i2c(bit a)
158 { if(a==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -