📄 iic.lst
字号:
C51 COMPILER V8.02 IIC 03/21/2008 20:17:21 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4 sbit SCL=P3^5;//I2C时钟线
5 sbit SDA=P3^6;//I2C数据线
6 sbit PROM_CS=P3^4;//片选
7 sbit WP=P3^7;
8
9 bit receive;//接收标志
10 bit re_finish;//接收一串字符完成标志
11 sbit LED = P0^0;//LED指示灯
12
13 uchar i,buffer[8];//串口缓冲区
14 uchar sbuffer,number;//发送字符个数
15 //uchar sendFINS ;//发送完成标志
16 uchar copyOK , cmd_numb ;//发送缓冲区填充完成
17
18 extern void Start_I2c();
19 extern void Stop_I2c();
20 extern uchar RcvB();
21 void send(void);
22 void vGet_Send(void);
23 extern void Ack_I2c(bit a);
24 extern void SendB(uchar c);
25 extern void delay(unsigned int loop);
26
27 /*******************************系统初始化***********************/
28 void initial()
29 { unsigned char j;
30 1
31 1 SCON=0x50; //串口工作方式1,允许接收
32 1 PCON=0x80; //波特率翻倍
33 1 TCON=0;
34 1 TMOD=0x26; //T1用于串口波特率控制
35 1 TL1=0xfa; //初始化T1,波特率为9600(晶振11.0592M)
36 1 TH1=0xfa;
37 1 TR1=1; //开定时器
38 1 EA=1; //开总中断
39 1 ES=1; //开串口中断
40 1 copyOK = 0; //缓冲区准备好标志清零
41 1 receive = 0; //接收标志清零
42 1 re_finish = 0; //接受完成标志清零
43 1 cmd_numb = 0; //接受计数器清零
44 1 PROM_CS=0;
45 1 WP=0;
46 1
47 1 for(j=0; j<8; j++) //串口缓冲区清空
48 1 buffer[i] = 0xff; //table[18]为空显示
49 1 }
50
51 /******************************主函数**************************/
52
53 main()
54 {
55 1 initial();
C51 COMPILER V8.02 IIC 03/21/2008 20:17:21 PAGE 2
56 1 while(1){
57 2 if(re_finish){//接收一串字符完成
58 3 re_finish = 0;
59 3 vGet_Send();
60 3 }
61 2 }
62 1 }
63
64 /*****************************保存和串口发送**************************/
65 void vGet_Send(void)
66 { uchar i;
67 1
68 1 Start_I2c();
69 1 SendB(0xa0);
70 1 SendB(6); //数据存放初始地址为0x06
71 1 for(i=0;i<6;i++)
72 1 {SendB(buffer[i]); //向24C02写6个数据
73 2 delay(2); }
74 1 Stop_I2c();
75 1
76 1 delay(1000); //非常关键!!!
77 1
78 1 for(i=0;i<8;i++)
79 1 buffer[i] = 0xff; //用0xff填充发送缓冲区
80 1
81 1 for(i=0;i<6;i++){
82 2 Start_I2c();
83 2 SendB(0xa0); //从24C02读取刚才写入的数据
84 2 SendB(6+i); //数据存放地址为0x06+i
85 2 Start_I2c();
86 2 SendB(0xa1);
87 2 buffer[i]=RcvB(); //读取的值送串口缓冲区
88 2 Ack_I2c(1);
89 2 Stop_I2c();
90 2 }
91 1 copyOK = 1; //置准备好标志
92 1 send(); //向串口发送
93 1 }
94
95 /*****************************串口发送***************************/
96
97 void send(void)//向串口发送字符串
98 {
99 1
100 1 if(copyOK) //串口准备好且缓冲区准备好
101 1 {
102 2 i = 0;
103 2 REN = 0; //发送过程中禁止接收数据
104 2 copyOK = 0; //清缓冲区准备好标志
105 2 SBUF = buffer[i++]; //发送字符串首字符
106 2 number = 7; //置发送计数器
107 2 }
108 1 else
109 1 return; //没准备好则返回
110 1 }
111
112
113 /***************************串口中断响应*************************/
114
115 void serial(void) interrupt 4//串口中断响应
116 {
117 1 if(RI)//为接收中断
C51 COMPILER V8.02 IIC 03/21/2008 20:17:21 PAGE 3
118 1 {
119 2 RI=0; //清接收中断标志
120 2 LED = ~LED; //闪串口指示LED
121 2 sbuffer = SBUF; //读取串口缓冲区数据
122 2
123 2 if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
124 2 {
125 3 receive = 1; //开始接收标志
126 3 cmd_numb = 0; //清接收计数器
127 3 re_finish = 0; //清接收完成标志
128 3 }
129 2 else if(sbuffer == 'e') //判断数据尾
130 2 {
131 3 re_finish = 1; //置接收完成标志
132 3 receive =0; //清接收标志
133 3 }
134 2 else if(receive){ //判断当前是否处于接收状态
135 3
136 3 buffer[cmd_numb++] = sbuffer-'0'; //当前字符送缓冲区
137 3 }
138 2 else //无效命令则返回
139 2 return;
140 2 }
141 1 else{
142 2 TI=0; //为单个字符发送完中断
143 2 if(!number) //字符串发送完
144 2 { REN = 1; //允许接收
145 3 }
146 2 else{ //字符串未发送完
147 3 SBUF = buffer[i++]; //发送下一字符
148 3 number--; //发送字符数减一
149 3 }
150 2 }
151 1 }
152
153 /*****************************延时函数**************************/
154 void delay(unsigned int loop)
155 { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
156 1 for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
157 1 }
158
159
160 /*******************************I2C开始*****************************/
161 void Start_I2c()
162 {
163 1 SDA=1;
164 1 delay(1);
165 1 SCL=1;
166 1 delay(3);
167 1 SDA=0;
168 1 delay(3);
169 1 SCL=0;
170 1 delay(1);
171 1 }
172
173
174
175 /*********************************I2C结束*****************************/
176 void Stop_I2c()
177 {
178 1 SDA=0;
179 1 delay(1);
C51 COMPILER V8.02 IIC 03/21/2008 20:17:21 PAGE 4
180 1 SCL=1;
181 1 delay(3);
182 1 SDA=1;
183 1 delay(1);
184 1
185 1 }
186
187
188 /*********************************I2C写一个字节************************/
189 void SendB(uchar c)
190 {
191 1 uchar BitCnt;//,ack ;
192 1 for(BitCnt=0;BitCnt<8;BitCnt++)
193 1 {
194 2 if((c<<BitCnt)&0x80)SDA=1;
195 2 else SDA=0;
196 2 delay(2);
197 2 SCL=1;
198 2 delay(5);
199 2 SCL=0;
200 2 delay(2);
201 2
202 2 }
203 1 delay(1);
204 1 SDA=1;
205 1 delay(5);
206 1 SCL=1;
207 1 delay(1);
208 1 // if(SDA==1)ack=0;
209 1 //else ack=1;
210 1 SCL=0;
211 1 delay(1);
212 1
213 1 }
214
215 /******************************I2C读取一个字节****************************/
216 uchar RcvB()
217 {
218 1 uchar retc;
219 1 uchar BitCnt;
220 1 retc=0;
221 1 SDA=1;
222 1 for(BitCnt=0;BitCnt<8;BitCnt++)
223 1 {
224 2 delay(1);
225 2 SCL=0;
226 2 delay(5);
227 2 SCL=1;
228 2 delay(2);
229 2 retc=retc<<1;
230 2 if(SDA==1)retc=retc+1;
231 2 delay(1);
232 2 }
233 1 SCL=0;
234 1 delay(1);
235 1 return(retc);
236 1 }
237
238 /*********************************I2C应答*********************************/
239 void Ack_I2c(bit a)
240 {
241 1 if(a==0)SDA=0;
C51 COMPILER V8.02 IIC 03/21/2008 20:17:21 PAGE 5
242 1 else SDA=1;
243 1 delay(1);
244 1 SCL=1;
245 1 delay(2);
246 1 SCL=0;
247 1 delay(1);
248 1
249 1 }
250
251 /**********************************结束***********************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 526 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 1
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -