📄 e51pro.lst
字号:
C51 COMPILER V7.08 E51PRO 03/22/2008 06:47:24 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE E51PRO
OBJECT MODULE PLACED IN e51pro.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE e51pro.c ROM(SMALL) WARNINGLEVEL(1) OPTIMIZE(5,SIZE) REGFILE(.\E51Pro.ORC)
-BROWSE INCDIR(G:\MCU工程\E51Pro\) DEBUG OBJECTEXTEND CODE
line level source
1 //////////////////////////////////////////////////////////////////////////////////////////////////
2 //E51Pro.c
3 //Easy 51Pro编程器主程序,负责通讯,管理编程操作
4 ///////////////////////////////////////////////////////////////////////////////////////////////////
5
6
7 ///////////////////////////////////////////////////////////////////////////////////////////////////
8 //2008-01-05由wangafu修改以下功能:
9 //适应K5i原理图
10 //目标芯片仅支持AT89S51/52
11 //烧写母片采用AT89C2051@11.0592Mhz
12 //增加AT89C2051为编程模式和红外模式
13 //编程模式下(ISP_MOD)下AT89C2051只做编程器烧写AT89S51/52
14 //红外模式下(IRD_MOD)下AT89C2051只做红外遥控器按键
15 ///////////////////////////////////////////////////////////////////////////////////////////////////
16
17
18 //////////////////////////////////////////////////////////////////////////////////////////////////
19 //目前版本日期为2008-03-13
20 /////////////////////////////////////////////////////////////////////////////////////////////////
21
22 #include <E51Pro.h>
23
24 BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
25 UINT nAddress;//ROM中地址计数
26 UINT nTimeOut;//超时计数
27 ProWork pw;//编程器一般操作
28
29
30 void Delay_us(BYTE nUs)//微秒级延时<255us
31 {
32 1 TH0=0;
33 1 TL0=0;
34 1 TR0=1;
35 1 while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值
36 1 {
37 2 }
38 1 TR0=0;
39 1 }
40
41 void Delay_ms(UINT nMs)//毫秒级的延时<65535ms
42 {
43 1 UINT n=0;
44 1 TR0=1;
45 1 while(n<nMs)////利用T0做定时计数器,循环采样,直到达到定时值
46 1 {
47 2 TH0=0;
48 2 TL0=20;
49 2 while(TH0<4)
50 2 {
51 3 }
52 2 n++;
53 2 }
54 1 TR0=0;
C51 COMPILER V7.08 E51PRO 03/22/2008 06:47:24 PAGE 2
55 1 }
56
57 BOOL WaitComm()//等待上位机的命令,18字节
58 {
59 1 BYTE n=0;
60 1 RI=0;
61 1 while(!RI){}//等待第一个字节
62 1 ComBuf[n]=SBUF;
63 1 RI=0;
64 1 n++;
65 1 for(n;n<=17;n++)
66 1 {
67 2 nTimeOut=0;
68 2 while(!RI)
69 2 {
70 3 nTimeOut++;
71 3 if(nTimeOut>10000)//后17个字节都有超时限制
72 3 return 0;
73 3 }
74 2 ComBuf[n]=SBUF;
75 2 RI=0;
76 2 }
77 1 return 1;
78 1 }
79
80 BOOL WaitResp()//等待上位机回应,1字节,有超时限制
81 {
82 1 nTimeOut=0;
83 1 RI=0;
84 1 while(!RI)
85 1 {
86 2 nTimeOut++;
87 2 if(nTimeOut>50000)
88 2 {
89 3 return 0;
90 3 }
91 2 }
92 1 RI=0;
93 1 ComBuf[0]=SBUF;
94 1 return 1;
95 1 }
96
97 BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制
98 {
99 1 BYTE n;
100 1 RI=0;
101 1 for(n=0;n<=17;n++)
102 1 {
103 2 nTimeOut=0;
104 2 while(!RI)
105 2 {
106 3 nTimeOut++;
107 3 if(nTimeOut>10000)
108 3 {
109 4 return 0;
110 4 }
111 3 }
112 2 RI=0;
113 2 ComBuf[n]=SBUF;
114 2 }
115 1 return 1;
116 1 }
C51 COMPILER V7.08 E51PRO 03/22/2008 06:47:24 PAGE 3
117
118 void SendData()//发送数据或回应操作完成,18字节
119 {
120 1 BYTE n=0;
121 1 for(n;n<=17;n++)
122 1 {
123 2 TI=0;
124 2 SBUF=ComBuf[n];
125 2 while(!TI){}
126 2 TI=0;
127 2 }
128 1 }
129
130 void SendResp()//回应上位机1个字节,在写器件函数中使用
131 {
132 1 TI=0;
133 1 SBUF=ComBuf[0];
134 1 while(!TI){}
135 1 TI=0;
136 1 }
137
138
139
140 void RstPro()//编程器复位
141 {
142 1 pw.fpProOver();//直接编程结束
143 1 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同
144 1 }
145
146 void ReadSign()//读特征字
147 {
148 1 pw.fpReadSign();
149 1 SendData();//通知上位机,送出读出器件特征字
150 1 }
151
152 void Erase()//擦除器件
153 {
154 1 pw.fpErase();
155 1 SendData();//通知上位机,擦除了器件
156 1 }
157
158 void Write()//写器件
159 {
160 1 BYTE n;
161 1 pw.fpInitPro();//编程前的准备工作
162 1 SendData();//回应上位机表示进入写器件状态,可以发来数据
163 1 while(1)
164 1 {
165 2 if(WaitData())//如果等待数据成功
166 2 {
167 3 if(ComBuf[0]==0x07)//判断是否继续写
168 3 {
169 4 for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
170 4 {
171 5 if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
172 5 {
173 6 pw.fpProOver();//出错了就结束编程
174 6 ComBuf[0]=0xff;
175 6 SendResp();//回应上位机一个字节,表示写数据出错了
176 6 WaitData();//等待上位机的回应后就结束
177 6 return;
178 6 }
C51 COMPILER V7.08 E51PRO 03/22/2008 06:47:24 PAGE 4
179 5 nAddress++;//下一个单元
180 5 }
181 4 ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
182 4 SendResp();
183 4 }
184 3 else if(ComBuf[0]==0x00)//写器件结束
185 3 break;
186 3 else//可能是通讯出错了
187 3 {
188 4 pw.fpProOver();
189 4 return;
190 4 }
191 3 }
192 2 else//等待数据失败
193 2 {
194 3 pw.fpProOver();
195 3 return;
196 3 }
197 2 }
198 1 pw.fpProOver();//编程结束后的工作
199 1 Delay_ms(50);//延时等待上位机写线程结束
200 1 ComBuf[0]=0;//通知上位机编程器进入就绪状态
201 1 SendData();
202 1 }
203
204 void Read()//读器件
205 {
206 1 BYTE n;
207 1 pw.fpInitPro();//先设置成编程状态
208 1 SendData();//回应上位机表示进入读状态
209 1 while(1)
210 1 {
211 2 if(WaitResp())//等待上位机回应1个字节
212 2 {
213 3 if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
214 3 {
215 4 break;
216 4 }
217 3 else if(ComBuf[0]==0xff)//0xff表示重发
218 3 {
219 4 nAddress=nAddress-0x0010;
220 4 }
221 3 for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
222 3 {
223 4 ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
224 4 nAddress++;//下一个单元
225 4 }
226 3 ComBuf[0]=6;//向上位机发送读出的数据块
227 3 SendData();
228 3 }
229 2 else
230 2 break;//等待回应失败
231 2
232 2 }
233 1 pw.fpProOver();//操作结束设置为运行状态
234 1 ComBuf[0]=0;//通知上位机编程器进入就绪状态
235 1 SendData();
236 1 }
237
238 void Lock()//写锁定位
239 {
240 1 pw.fpLock();
C51 COMPILER V7.08 E51PRO 03/22/2008 06:47:24 PAGE 5
241 1 SendData();
242 1 }
243
244 ///////////////////////////////////////////////////////////////////////////////////////////////////
245 //所支持的FID,请在这里继续添加
246 ///////////////////////////////////////////////////////////////////////////////////////////////////
247 //extern void PreparePro00();//FID=00:AT89C51编程器
248 //extern void PreparePro01();//FID=01:AT89C2051编程器
249
250 extern void PreparePro02();//FID=02:AT89S51编程器
251
252 //Only For K5i define
253 #define IRD_LED P1_1
254 #define ISP_LED P1_2 //for test
255
256 #define ISP_XY P1_3 //模式控制输出引脚 ISP_MOD : ISP_XY=0 / IRD_MOD :ISP_XY=1
257
258 #define ISP_SL P3_2 //模式选择输入引脚 ISP_SL=0: ISP_MOD / ISP_SL=1:IRD_MOD
259
260 #define IRD_K1 P3_3
261 #define IRD_K2 P3_4
262 #define IRD_K3 P3_5
263 #define IRD_K4 P3_7
264
265 #define T_K1 32 //K1按键按下后,IRD_LED发送的脉冲数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -