?? at89s51pro.lst
字號:
C51 COMPILER V7.07 AT89S51PRO 10/28/2003 18:27:18 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE AT89S51PRO
OBJECT MODULE PLACED IN AT89S51PRO.OBJ
COMPILER INVOKED BY: f:\winsoft\Keil\C51\BIN\C51.EXE AT89S51PRO.C WARNINGLEVEL(1) OPTIMIZE(5,SIZE) REGFILE(.\E51Pro.ORC)
- BROWSE INCDIR(G:\MCU工程\E51Pro\) DEBUG OBJECTEXTEND CODE
stmt level source
1 ///////////////////////////////////////////////////////////////////////////////////////////////////
2 //FID=02:AT89S51系列編程器
3 //實現編程的讀,寫,擦等細節
4 //特殊處:采用ISP編程方式,只需對P1.5,P1.6,P1.7,RST引腳控制;用MOSI串行發送命令的同時用MISO接收相關數據
5 //SCK輸出同步時鐘脈沖
6 ///////////////////////////////////////////////////////////////////////////////////////////////////
7
8 #include <e51pro.h>
9
10 #define MOSI P1_5
11 #define MISO P1_6
12 #define SCK P1_7
13
14 BYTE OutBuf[4];//發送命令緩沖
15 BYTE InBuf[4];//接收緩沖
16
17 void SendInstrc(BYTE nByte)//用MOSI串行發送命令的同時用MISO接收相關數據
18 {
19 1 BYTE n;
20 1 for(n=0;n<nByte;n++)//發送nByte個字節
21 1 {
22 2 ACC=OutBuf[n];
23 2 SCK=0;
24 2 MOSI=A_7;//低電平時輸出一位
25 2 SCK=1;
26 2 B_7=MISO;//高電平時接收一位
27 2 SCK=0;
28 2 MOSI=A_6;
29 2 SCK=1;
30 2 B_6=MISO;
31 2 SCK=0;
32 2 MOSI=A_5;
33 2 SCK=1;
34 2 B_5=MISO;
35 2 SCK=0;
36 2 MOSI=A_4;
37 2 SCK=1;
38 2 B_4=MISO;
39 2 SCK=0;
40 2 MOSI=A_3;
41 2 SCK=1;
42 2 B_3=MISO;
43 2 SCK=0;
44 2 MOSI=A_2;
45 2 SCK=1;
46 2 B_2=MISO;
47 2 SCK=0;
48 2 MOSI=A_1;
49 2 SCK=1;
50 2 B_1=MISO;
51 2 SCK=0;
52 2 MOSI=A_0;
53 2 SCK=1;
54 2 B_0=MISO;
C51 COMPILER V7.07 AT89S51PRO 10/28/2003 18:27:18 PAGE 2
55 2 SCK=0;
56 2 InBuf[n]=B;
57 2 }
58 1 }
59
60 void InitPro02()//編程前的準備工作
61 {
62 1 SetVpp5V();
63 1 P3_5=0;//p3.5接RST
64 1 P3_2=1;//p3.2接PROG
65 1 P0=0xff;
66 1 P1=0xff;
67 1 P2=0xff;
68 1 Delay_ms(10);
69 1 MOSI=0;
70 1 MISO=1;
71 1 SCK=1;
72 1 P3_5=1;
73 1 Delay_ms(10);
74 1 nAddress=0x0000;
75 1 OutBuf[0]=0xac;//正好在這里可以安排DataSheet上所規定的
76 1 OutBuf[1]=0x53;//Eanable Programming命令
77 1 OutBuf[2]=0;
78 1 OutBuf[3]=0;
79 1 SendInstrc(4);
80 1 }
81
82 void ProOver02()//編程結束后的工作,設置合適的引腳電平
83 {
84 1 SetVpp5V();
85 1 P0=0xff;
86 1 P1=0xff;
87 1 P2=0xff;
88 1 P3_6=1;
89 1 P3_7=1;
90 1 P3_5=0;//RST=0;
91 1 P3_2=2;//PROG=0
92 1 }
93
94 BYTE Read02()
95 {
96 1 OutBuf[0]=0x20;
97 1 OutBuf[1]=((BYTE*)&nAddress)[0];
98 1 OutBuf[2]=((BYTE*)&nAddress)[1];
99 1 SendInstrc(4);
100 1 return InBuf[3];
101 1 }
102
103 void ReadSign02()//讀特征字
104 {
105 1 InitPro02();//先設置成編程狀態
106 1 //-----------------------------------------------------------------------------
107 1 //根據器件的DataSheet,設置相應的編程控制信號
108 1 OutBuf[0]=0x28;
109 1 OutBuf[1]=0x00;
110 1 OutBuf[2]=0x00;
111 1 OutBuf[3]=0x00;
112 1 SendInstrc(4);
113 1 ComBuf[2]=InBuf[3];
114 1 OutBuf[1]=0x01;
115 1 SendInstrc(4);
116 1 ComBuf[3]=InBuf[3];
C51 COMPILER V7.07 AT89S51PRO 10/28/2003 18:27:18 PAGE 3
117 1 OutBuf[1]=0x02;
118 1 SendInstrc(4);
119 1 ComBuf[4]=InBuf[3];
120 1 //-----------------------------------------------------------------------------
121 1 ProOver02();
122 1 }
123
124 void Erase02()//擦除器件
125 {
126 1 InitPro02();
127 1 //-----------------------------------------------------------------------------
128 1 //根據器件的DataSheet,設置相應的編程控制信號
129 1 OutBuf[0]=0xac;
130 1 OutBuf[1]=0x80;
131 1 SendInstrc(4);
132 1 Delay_ms(500);
133 1 //-----------------------------------------------------------------------------
134 1 ProOver02();
135 1 }
136
137 BOOL Write02(BYTE Data)//寫器件
138 {
139 1
140 1 //-----------------------------------------------------------------------------
141 1 //根據器件的DataSheet,設置相應的編程控制信號
142 1 //寫一個單元
143 1 OutBuf[0]=0x40;
144 1 OutBuf[1]=((BYTE*)&nAddress)[0];
145 1 OutBuf[2]=((BYTE*)&nAddress)[1];
146 1 OutBuf[3]=Data;
147 1 SendInstrc(4);
148 1 nTimeOut=0;
149 1 while(Read02()!=Data)//效驗:循環讀,直到讀出與寫入的數相同
150 1 {
151 2 nTimeOut++;
152 2 if(nTimeOut>1000)//超時了
153 2 {
154 3 return 0;
155 3 }
156 2
157 2 }
158 1 //-----------------------------------------------------------------------------
159 1 return 1;
160 1 }
161
162 void Lock02()//寫鎖定位
163 {
164 1 //-----------------------------------------------------------------------------
165 1 //根據器件的DataSheet,設置相應的編程控制信號
166 1 if(ComBuf[2]>=1)//ComBuf[2]為鎖定位
167 1 {
168 2 InitPro02();
169 2 OutBuf[0]=0xac;
170 2 OutBuf[1]=0xe1;
171 2 SendInstrc(4);
172 2 Delay_ms(1);
173 2 }
174 1 if(ComBuf[2]>=2)
175 1 {
176 2 InitPro02();
177 2 OutBuf[0]=0xac;
178 2 OutBuf[1]=0xe2;
C51 COMPILER V7.07 AT89S51PRO 10/28/2003 18:27:18 PAGE 4
179 2 SendInstrc(4);
180 2 Delay_ms(1);
181 2 }
182 1 if(ComBuf[2]==3)
183 1 {
184 2 InitPro02();
185 2 OutBuf[0]=0xac;
186 2 OutBuf[1]=0xe3;
187 2 SendInstrc(4);
188 2 Delay_ms(1);
189 2 }
190 1 //-----------------------------------------------------------------------------
191 1 ProOver02();
192 1 }
193
194 void PreparePro02()//設置pw中的函數指針,讓主程序可以調用上面的函數
195 {
196 1 pw.fpInitPro=InitPro02;
197 1 pw.fpReadSign=ReadSign02;
198 1 pw.fpErase=Erase02;
199 1 pw.fpWrite=Write02;
200 1 pw.fpRead=Read02;
201 1 pw.fpLock=Lock02;
202 1 pw.fpProOver=ProOver02;
203 1 }
C51 COMPILER V7.07 AT89S51PRO 10/28/2003 18:27:18 PAGE 5
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _SendInstrc (BEGIN)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -