📄 ep5x.lst
字号:
166 3 if(ComBuf[0]==0x07)//判断是否继续写
167 3 {
168 4 for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
169 4 {
170 5 if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
171 5 {
172 6 pw.fpProOver();//出错了就结束编程
173 6 ComBuf[0]=0xff;
174 6 SendResp();//回应上位机一个字节,表示写数据出错了
175 6 WaitData();//等待上位机的回应后就结束
176 6 return;
177 6 }
178 5 nAddress++;//下一个单元
179 5 }
C51 COMPILER V7.01 EP5X 03/09/2008 14:31:20 PAGE 4
180 4 ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
181 4 SendResp();
182 4 }
183 3 else if(ComBuf[0]==0x00)//写器件结束
184 3 break;
185 3 else//可能是通讯出错了
186 3 {
187 4 pw.fpProOver();
188 4 return;
189 4 }
190 3 }
191 2 else//等待数据失败
192 2 {
193 3 pw.fpProOver();
194 3 return;
195 3 }
196 2 }
197 1 pw.fpProOver();//编程结束后的工作
198 1 Delay_ms(50);//延时等待上位机写线程结束
199 1 ComBuf[0]=0;//通知上位机编程器进入就绪状态
200 1 SendData();
201 1 }
202
203 void Read()//读器件
204 {
205 1 BYTE n;
206 1 pw.fpInitPro();//先设置成编程状态
207 1 SendData();//回应上位机表示进入读状态
208 1 while(1)
209 1 {
210 2 if(WaitResp())//等待上位机回应1个字节
211 2 {
212 3 if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
213 3 {
214 4 break;
215 4 }
216 3 else if(ComBuf[0]==0xff)//0xff表示重发
217 3 {
218 4 nAddress=nAddress-0x0010;
219 4 }
220 3 for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
221 3 {
222 4 ComBuf[n]=pw.fpRead();//<<<<<<<<调用写该器件一个单元的函数
223 4 nAddress++;//下一个单元
224 4 }
225 3 ComBuf[0]=6;//向上位机发送读出的数据块
226 3 SendData();
227 3 }
228 2 else
229 2 break;//等待回应失败
230 2
231 2 }
232 1 pw.fpProOver();//操作结束设置为运行状态
233 1 ComBuf[0]=0;//通知上位机编程器进入就绪状态
234 1 SendData();
235 1 }
236
237 void Lock()//写锁定位
238 {
239 1 pw.fpLock();
240 1 SendData();
241 1 }
C51 COMPILER V7.01 EP5X 03/09/2008 14:31:20 PAGE 5
242
243 ///////////////////////////////////////////////////////////////////////////////////////////////////
244 //所支持的FID,请在这里继续添加
245 ///////////////////////////////////////////////////////////////////////////////////////////////////
246 extern void PreparePro00();//FID=00:AT89C51编程器
247 extern void PreparePro01();//FID=01:AT89C2051编程器
248 extern void PreparePro02();//FID=02:AT89S51编程器
249 void main()
250 {
251 1 SP=0x60;
252 1 SetVpp5V();//先初始化Vpp为5v
253 1 SCON=0x00;
254 1 TCON=0x00;
255 1 //PCON=0x00;//波特率*2
256 1 IE=0x00;
257 1 //TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
258 1 // 0 0 1 0 0 0 0 1
259 1 TMOD=0x21;//T0用于延时程序
260 1 TH1=0xff;
261 1 TL1=0xff;//波特率28800*2,注意PCON
262 1 //SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
263 1 // 0 1 0 1 0 0 0 0
264 1 SCON=0x50;
265 1 TR1=1;
266 1 Delay_ms(1000);//延时1秒后编程器自举
267 1 ComBuf[0]=0;
268 1 SendData();
269 1 while(1)//串口通讯采用查询方式
270 1 {
271 2 if(!WaitComm())//如果超时,通讯出错
272 2 {
273 3 Delay_ms(500);
274 3 ComBuf[0]=0;//让编程器复位,使编程器就绪
275 3 }
276 2 switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针
277 2 {
278 3 case 0://at89c51编程器
279 3 PreparePro00();
280 3 break;
281 3 case 1://at89c2051编程器
282 3 PreparePro01();
283 3 break;
284 3 case 2://at89s51编程器
285 3 PreparePro02();
286 3 break;
287 3 //case 3:支持新器件时,请继续向下添加
288 3 // break;
289 3 //case 4:
290 3 // break;
291 3 default:
292 3 ComBuf[0]=0xff;
293 3 ComBuf[1]=0xff;//表示无效的操作
294 3 break;
295 3 }
296 2 switch(ComBuf[0])//根据操作ID跳到不同的操作函数
297 2 {
298 3 case 0x00:
299 3 RstPro();//编程器复位
300 3 break;
301 3 case 0x01:
302 3 ReadSign();//读特征字
303 3 break;
C51 COMPILER V7.01 EP5X 03/09/2008 14:31:20 PAGE 6
304 3 case 0x02:
305 3 Erase();//擦除器件
306 3 break;
307 3 case 0x03:
308 3 Write();//写器件
309 3 break;
310 3 case 0x04:
311 3 Read();//读器件
312 3 break;
313 3 case 0x05:
314 3 Lock();//写锁定位
315 3 break;
316 3 default:
317 3 SendData();
318 3 break;
319 3 }
320 2 }
321 1 }
322
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 626 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 43 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -