📄 e51pro.lst
字号:
C51 COMPILER V7.07 E51PRO 10/28/2003 18:27:17 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE E51PRO
OBJECT MODULE PLACED IN e51pro.OBJ
COMPILER INVOKED BY: f:\winsoft\Keil\C51\BIN\C51.EXE e51pro.c WARNINGLEVEL(1) OPTIMIZE(5,SIZE) REGFILE(.\E51Pro.ORC) BRO
-WSE INCDIR(G:\MCU工程\E51Pro\) DEBUG OBJECTEXTEND CODE
stmt level source
1 //////////////////////////////////////////////////////////////////////////////////////////////////
2 //E51Pro.c
3 //Easy 51Pro编程器主程序,负责通讯,管理编程操作
4 ///////////////////////////////////////////////////////////////////////////////////////////////////
5
6 #include <E51Pro.h>
7
8 BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
9 UINT nAddress;//ROM中地址计数
10 UINT nTimeOut;//超时计数
11 ProWork pw;//编程器一般操作
12
13 void Delay_us(BYTE nUs)//微秒级延时<255us
14 {
15 1 TH0=0;
16 1 TL0=0;
17 1 TR0=1;
18 1 while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值
19 1 {
20 2 }
21 1 TR0=0;
22 1 }
23
24 void Delay_ms(UINT nMs)//豪秒级的延时<65535ms
25 {
26 1 UINT n=0;
27 1 TR0=1;
28 1 while(n<nMs)////利用T0做定时计数器,循环采样,直到达到定时值
29 1 {
30 2 TH0=0;
31 2 TL0=20;
32 2 while(TH0<4)
33 2 {
34 3 }
35 2 n++;
36 2 }
37 1 TR0=0;
38 1 }
39
40 BOOL WaitComm()//等待上位机的命令,18字节
41 {
42 1 BYTE n=0;
43 1 RI=0;
44 1 while(!RI){}//等待第一个字节
45 1 ComBuf[n]=SBUF;
46 1 RI=0;
47 1 n++;
48 1 for(n;n<=17;n++)
49 1 {
50 2 nTimeOut=0;
51 2 while(!RI)
52 2 {
53 3 nTimeOut++;
54 3 if(nTimeOut>10000)//后17个字节都有超时限制
C51 COMPILER V7.07 E51PRO 10/28/2003 18:27:17 PAGE 2
55 3 return 0;
56 3 }
57 2 ComBuf[n]=SBUF;
58 2 RI=0;
59 2 }
60 1 return 1;
61 1 }
62
63 BOOL WaitResp()//等待上位机回应,1字节,有超时限制
64 {
65 1 nTimeOut=0;
66 1 RI=0;
67 1 while(!RI)
68 1 {
69 2 nTimeOut++;
70 2 if(nTimeOut>50000)
71 2 {
72 3 return 0;
73 3 }
74 2 }
75 1 RI=0;
76 1 ComBuf[0]=SBUF;
77 1 return 1;
78 1 }
79
80 BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制
81 {
82 1 BYTE n;
83 1 RI=0;
84 1 for(n=0;n<=17;n++)
85 1 {
86 2 nTimeOut=0;
87 2 while(!RI)
88 2 {
89 3 nTimeOut++;
90 3 if(nTimeOut>10000)
91 3 {
92 4 return 0;
93 4 }
94 3 }
95 2 RI=0;
96 2 ComBuf[n]=SBUF;
97 2 }
98 1 return 1;
99 1 }
100
101 void SendData()//发送数据或回应操作完成,18字节
102 {
103 1 BYTE n=0;
104 1 for(n;n<=17;n++)
105 1 {
106 2 TI=0;
107 2 SBUF=ComBuf[n];
108 2 while(!TI){}
109 2 TI=0;
110 2 }
111 1 }
112
113 void SendResp()//回应上位机1个字节,在写器件函数中使用
114 {
115 1 TI=0;
116 1 SBUF=ComBuf[0];
C51 COMPILER V7.07 E51PRO 10/28/2003 18:27:17 PAGE 3
117 1 while(!TI){}
118 1 TI=0;
119 1 }
120
121 void SetVpp5V()//设置Vpp为5v
122 {
123 1 P3_4=0;
124 1 P3_3=0;
125 1 }
126
127 void SetVpp0V()//设置Vpp为0v
128 {
129 1 P3_3=0;
130 1 P3_4=1;
131 1 }
132
133 void SetVpp12V()//设置Vpp为12v
134 {
135 1 P3_4=0;
136 1 P3_3=1;
137 1 }
138
139 void RstPro()//编程器复位
140 {
141 1 pw.fpProOver();//直接编程结束
142 1 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同
143 1 }
144
145 void ReadSign()//读特征字
146 {
147 1 pw.fpReadSign();
148 1 SendData();//通知上位机,送出读出器件特征字
149 1 }
150
151 void Erase()//擦除器件
152 {
153 1 pw.fpErase();
154 1 SendData();//通知上位机,擦除了器件
155 1 }
156
157 void Write()//写器件
158 {
159 1 BYTE n;
160 1 pw.fpInitPro();//编程前的准备工作
161 1 SendData();//回应上位机表示进入写器件状态,可以发来数据
162 1 while(1)
163 1 {
164 2 if(WaitData())//如果等待数据成功
165 2 {
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++;//下一个单元
C51 COMPILER V7.07 E51PRO 10/28/2003 18:27:17 PAGE 4
179 5 }
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();
C51 COMPILER V7.07 E51PRO 10/28/2003 18:27:17 PAGE 5
241 1 }
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
250 void main()
251 {
252 1 SP=0x60;
253 1 SetVpp5V();//先初始化Vpp为5v
254 1 SCON=0x00;
255 1 TCON=0x00;
256 1 //PCON=0x00;//波特率*2
257 1 IE=0x00;
258 1 //TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
259 1 // 0 0 1 0 0 0 0 1
260 1 TMOD=0x21;//T0用于延时程序
261 1 TH1=0xff;
262 1 TL1=0xff;//波特率28800*2,注意PCON
263 1 //SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -