?? 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 + -