?? 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];//串口通訊數(shù)據(jù)緩存,發(fā)送和接收都使用
9 UINT nAddress;//ROM中地址計數(shù)
10 UINT nTimeOut;//超時計數(shù)
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做定時計數(shù)器,循環(huán)采樣,直到達到定時值
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做定時計數(shù)器,循環(huán)采樣,直到達到定時值
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字節(jié)
41 {
42 1 BYTE n=0;
43 1 RI=0;
44 1 while(!RI){}//等待第一個字節(jié)
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個字節(jié)都有超時限制
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字節(jié),有超時限制
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()//寫器件時等待上位機數(shù)據(jù),18字節(jié),有超時限制
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()//發(fā)送數(shù)據(jù)或回應操作完成,18字節(jié)
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個字節(jié),在寫器件函數(shù)中使用
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();//通知上位機,表示編程器就緒,可以直接用此函數(shù)因為協(xié)議號(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();//回應上位機表示進入寫器件狀態(tài),可以發(fā)來數(shù)據(jù)
162 1 while(1)
163 1 {
164 2 if(WaitData())//如果等待數(shù)據(jù)成功
165 2 {
166 3 if(ComBuf[0]==0x07)//判斷是否繼續(xù)寫
167 3 {
168 4 for(n=2;n<=17;n++)//ComBuf[2~17]為待寫入數(shù)據(jù)塊
169 4 {
170 5 if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<調用寫該器件一個單元的函數(shù)
171 5 {
172 6 pw.fpProOver();//出錯了就結束編程
173 6 ComBuf[0]=0xff;
174 6 SendResp();//回應上位機一個字節(jié),表示寫數(shù)據(jù)出錯了
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;//回應上位機一個字節(jié),表示數(shù)據(jù)塊順利完成,請求繼續(xù)
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//等待數(shù)據(jù)失敗
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;//通知上位機編程器進入就緒狀態(tài)
200 1 SendData();
201 1 }
202
203 void Read()//讀器件
204 {
205 1 BYTE n;
206 1 pw.fpInitPro();//先設置成編程狀態(tài)
207 1 SendData();//回應上位機表示進入讀狀態(tài)
208 1 while(1)
209 1 {
210 2 if(WaitResp())//等待上位機回應1個字節(jié)
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表示重發(fā)
217 3 {
218 4 nAddress=nAddress-0x0010;
219 4 }
220 3 for(n=2;n<=17;n++)//ComBuf[2~17]保存讀出的數(shù)據(jù)塊
221 3 {
222 4 ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<調用寫該器件一個單元的函數(shù)
223 4 nAddress++;//下一個單元
224 4 }
225 3 ComBuf[0]=6;//向上位機發(fā)送讀出的數(shù)據(jù)塊
226 3 SendData();
227 3 }
228 2 else
229 2 break;//等待回應失敗
230 2
231 2 }
232 1 pw.fpProOver();//操作結束設置為運行狀態(tài)
233 1 ComBuf[0]=0;//通知上位機編程器進入就緒狀態(tài)
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,請在這里繼續(xù)添加
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 + -