📄 text1.lst
字号:
C51 COMPILER V7.06 TEXT1 03/20/2009 15:29:23 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<reg51.h>
2 #include<intrins.h>
3
4 #define delay_time _nop_();_nop_();_nop_();_nop_();_nop_();
5
6 sbit SCL = P3^7;
7 sbit SDA = P3^6;
8
9 bit ack;
10
11 sbit P10 = P1^0;
12
13 unsigned char datas[2]={0x01,0x02};
14 unsigned char hai[2]={0};
15
16 /* 启动I2C总线 */
17 void Start_I2c(void)
18 {
19 1 SDA=1; /*发送起始条件的数据信号*/
20 1 delay_time;
21 1 SCL=1;
22 1 delay_time; /*起始条件建立时间大于4.7us,延时*/
23 1
24 1 SDA=0; /*发送起始信号*/
25 1 delay_time; /* 起始条件锁定时间大于4μs*/
26 1
27 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
28 1 delay_time;
29 1 }
30
31 /*******************************************************************
32 结束总线函数
33 函数原型: void Stop_I2c();
34 功能: 结束I2C总线,即发送I2C结束条件.
35 ********************************************************************/
36 void Stop_I2c()
37 {
38 1 SDA=0; /*发送结束条件的数据信号*/
39 1 delay_time; /*发送结束条件的时钟信号*/
40 1 SCL=1; /*结束条件建立时间大于4us*/
41 1 delay_time;
42 1
43 1 SDA=1; /*发送I2C总线结束信号*/
44 1 delay_time;
45 1 }
46
47 /*******************************************************************
48 字节数据发送函数
49 函数原型: void SendByte(uchar c);
50 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
51 此状态位进行操作.(不应答或非应答都使ack=0)
52 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
53 ********************************************************************/
54 void SendByte(unsigned char c)
55 {
C51 COMPILER V7.06 TEXT1 03/20/2009 15:29:23 PAGE 2
56 1 unsigned char BitCnt;
57 1
58 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
59 1 {
60 2 if((c<<BitCnt)&0x80) SDA=1; /*判断发送位*/
61 2 else SDA=0;
62 2 delay_time;
63 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
64 2
65 2 delay_time; /*保证时钟高电平周期大于4μs*/
66 2
67 2 SCL=0;
68 2 }
69 1
70 1 delay_time;
71 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
72 1 delay_time;
73 1 SCL=1;
74 1 delay_time;
75 1 if(SDA==1)ack=0;
76 1 else ack=1; /*判断是否接收到应答信号*/
77 1 SCL=0;
78 1 delay_time;
79 1 }
80
81 /*******************************************************************
82 字节数据接收函数
83 函数原型: uchar RcvByte();
84 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
85 发完后请用应答函数应答从机。
86 ********************************************************************/
87 unsigned char RcvByte()
88 {
89 1 unsigned char retc;
90 1 unsigned char BitCnt;
91 1
92 1 retc=0;
93 1 SDA=1; /*置数据线为输入方式*/
94 1 for(BitCnt=0;BitCnt<8;BitCnt++)
95 1 {
96 2 delay_time;
97 2 SCL=0; /*置时钟线为低,准备接收数据位*/
98 2
99 2 delay_time; /*时钟低电平周期大于4.7μs*/
100 2
101 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
102 2 delay_time;
103 2 retc=retc<<1;
104 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
105 2 delay_time;
106 2 }
107 1 SCL=0;
108 1 delay_time;
109 1 return(retc);
110 1 }
111
112 /********************************************************************
113 应答子函数
114 函数原型: void Ack_I2c(bit a);
115 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
116 ********************************************************************/
117 void Ack_I2c(bit a)
C51 COMPILER V7.06 TEXT1 03/20/2009 15:29:23 PAGE 3
118 {
119 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
120 1 else SDA=1;
121 1 delay_time;
122 1 SCL=1;
123 1
124 1 delay_time; /*时钟低电平周期大于4μs*/
125 1
126 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
127 1 delay_time;
128 1 }
129
130 /*******************************************************************
131 向有子地址器件发送多字节数据函数
132 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
133 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
134 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
135 如果返回1表示操作成功,否则操作有误。
136 注意: 使用前必须已结束总线。
137 ********************************************************************/
138 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
139 {
140 1 unsigned char i;
141 1
142 1 Start_I2c(); /*启动总线*/
143 1 SendByte(sla); /*发送器件地址*/
144 1 if(ack==0) return(0);
145 1
146 1 SendByte(suba); /*发送器件子地址*/
147 1 if(ack==0) return(0);
148 1
149 1 for(i=0;i<no;i++)
150 1 {
151 2 SendByte(*s); /*发送数据*/
152 2 if(ack==0) return(0);
153 2 s++;
154 2 }
155 1
156 1 Stop_I2c(); /*结束总线*/
157 1
158 1 return(1);
159 1 }
160
161 /*******************************************************************
162 向有子地址器件读取多字节数据函数
163 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
164 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
165 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
166 如果返回1表示操作成功,否则操作有误。
167 注意: 使用前必须已结束总线。
168 ********************************************************************/
169 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
170 {
171 1 unsigned char i;
172 1
173 1 Start_I2c(); /*启动总线*/
174 1 SendByte(sla); /*发送器件地址*/
175 1 if(ack==0) return(0);
176 1
177 1 SendByte(suba); /*发送器件子地址*/
178 1 if(ack==0) return(0);
179 1
C51 COMPILER V7.06 TEXT1 03/20/2009 15:29:23 PAGE 4
180 1 Start_I2c(); /*重新启动总线*/
181 1 SendByte(sla+1);
182 1 if(ack==0) return(0);
183 1
184 1 for(i=0;i<no-1;i++)
185 1 {
186 2 *s=RcvByte(); /*发送数据*/
187 2 Ack_I2c(0); /*发送应答位*/
188 2 s++;
189 2 }
190 1
191 1 *s=RcvByte();
192 1 Ack_I2c(1); /*发送非应答位*/
193 1
194 1 Stop_I2c(); /*结束总线*/
195 1 return(1);
196 1 }
197
198 main()
199 {
200 1 P10=0;
201 1
202 1 while((ISendStr(0xae,0x10,datas,2))==0);
203 1
204 1 while((IRcvStr(0xae,0x10,hai,2))==0);
205 1
206 1 if((hai[0]==datas[0])&&(hai[1]==datas[1])){
207 2 P10=1;
208 2 }
209 1
210 1 while(1);
211 1 }
212
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 401 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 12
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 + -