📄 at89s51pro.lst
字号:
C51 COMPILER V7.08 AT89S51PRO 03/13/2008 14:53:30 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE AT89S51PRO
OBJECT MODULE PLACED IN AT89S51PRO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AT89S51PRO.C ROM(SMALL) WARNINGLEVEL(1) OPTIMIZE(5,SIZE) REGFILE(.\E51Pro.O
-RC) BROWSE INCDIR(G:\MCU工程\E51Pro\) DEBUG OBJECTEXTEND CODE
line 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 #define RST P1_4
15
16 BYTE OutBuf[4];//发送命令缓冲
17 BYTE InBuf[4];//接收缓冲
18
19 void SendInstrc(BYTE nByte)//用MOSI串行发送命令的同时用MISO接收相关数据
20 {
21 1 BYTE n;
22 1 for(n=0;n<nByte;n++)//发送nByte个字节
23 1 {
24 2 ACC=OutBuf[n];
25 2 SCK=0;
26 2 MOSI=A_7;//低电平时输出一位
27 2 SCK=1;
28 2 B_7=MISO;//高电平时接收一位
29 2 SCK=0;
30 2 MOSI=A_6;
31 2 SCK=1;
32 2 B_6=MISO;
33 2 SCK=0;
34 2 MOSI=A_5;
35 2 SCK=1;
36 2 B_5=MISO;
37 2 SCK=0;
38 2 MOSI=A_4;
39 2 SCK=1;
40 2 B_4=MISO;
41 2 SCK=0;
42 2 MOSI=A_3;
43 2 SCK=1;
44 2 B_3=MISO;
45 2 SCK=0;
46 2 MOSI=A_2;
47 2 SCK=1;
48 2 B_2=MISO;
49 2 SCK=0;
50 2 MOSI=A_1;
51 2 SCK=1;
52 2 B_1=MISO;
53 2 SCK=0;
54 2 MOSI=A_0;
C51 COMPILER V7.08 AT89S51PRO 03/13/2008 14:53:30 PAGE 2
55 2 SCK=1;
56 2 B_0=MISO;
57 2 SCK=0;
58 2 InBuf[n]=B;
59 2 }
60 1 }
61
62 void InitPro02()//编程前的准备工作
63 {
64 1 // SetVpp5V();
65 1 // P0=0xff;
66 1 // P1=0xff;
67 1 // P3=0xff;
68 1 //P1_3=0;//p1.4接RST
69 1 //P3_2=1;//p3.2接PROG //原作如此,此处在K5i是悬空未接,故注销
70 1 RST=0;
71 1 Delay_ms(20);
72 1 RST=1;
73 1 MOSI=0;
74 1 MISO=1;
75 1 SCK=1;
76 1 Delay_ms(10);
77 1 nAddress=0x0000;
78 1 OutBuf[0]=0xac;//正好在这里可以安排DataSheet上所规定的
79 1 OutBuf[1]=0x53;//Eanable Programming命令
80 1 OutBuf[2]=0;
81 1 OutBuf[3]=0;
82 1 SendInstrc(4);
83 1 }
84
85 void ProOver02()//编程结束后的工作,设置合适的引脚电平
86 {
87 1 // SetVpp5V();
88 1 // P0=0xff;
89 1 // P1=0xff;
90 1 // P2=0xff;
91 1 // P3_6=1;
92 1 // P3_7=1;
93 1 // P1_3=0;//RST=0;
94 1 // P3_2=2;//PROG=0 //原作如此,此处在K5i是悬空未接,故注销
95 1 RST=1;
96 1 MOSI=1;
97 1 MISO=1;
98 1 SCK=1;
99 1
100 1 }
101
102 BYTE Read02()
103 {
104 1 OutBuf[0]=0x20;
105 1 OutBuf[1]=((BYTE*)&nAddress)[0];
106 1 OutBuf[2]=((BYTE*)&nAddress)[1];
107 1 SendInstrc(4);
108 1 return InBuf[3];
109 1 }
110
111 void ReadSign02()//读特征字
112 {
113 1 InitPro02();//先设置成编程状态
114 1 //-----------------------------------------------------------------------------
115 1 //根据器件的DataSheet,设置相应的编程控制信号
116 1 OutBuf[0]=0x28;
C51 COMPILER V7.08 AT89S51PRO 03/13/2008 14:53:30 PAGE 3
117 1 OutBuf[1]=0x00;
118 1 OutBuf[2]=0x00;
119 1 OutBuf[3]=0x00;
120 1 SendInstrc(4);
121 1 ComBuf[2]=InBuf[3];
122 1 OutBuf[1]=0x01;
123 1 SendInstrc(4);
124 1 ComBuf[3]=InBuf[3];
125 1 OutBuf[1]=0x02;
126 1 SendInstrc(4);
127 1 ComBuf[4]=InBuf[3];
128 1 //-----------------------------------------------------------------------------
129 1 ProOver02();
130 1 }
131
132 void Erase02()//擦除器件
133 {
134 1 InitPro02();
135 1 //-----------------------------------------------------------------------------
136 1 //根据器件的DataSheet,设置相应的编程控制信号
137 1 OutBuf[0]=0xac;
138 1 OutBuf[1]=0x80;
139 1 SendInstrc(4);
140 1 Delay_ms(500);
141 1 //-----------------------------------------------------------------------------
142 1 ProOver02();
143 1 }
144
145 BOOL Write02(BYTE Data)//写器件
146 {
147 1
148 1 //-----------------------------------------------------------------------------
149 1 //根据器件的DataSheet,设置相应的编程控制信号
150 1 //写一个单元
151 1 OutBuf[0]=0x40;
152 1 OutBuf[1]=((BYTE*)&nAddress)[0];
153 1 OutBuf[2]=((BYTE*)&nAddress)[1];
154 1 OutBuf[3]=Data;
155 1 SendInstrc(4);
156 1 nTimeOut=0;
157 1 while(Read02()!=Data)//效验:循环读,直到读出与写入的数相同
158 1 {
159 2 nTimeOut++;
160 2 if(nTimeOut>1000)//超时了
161 2 {
162 3 return 0;
163 3 }
164 2
165 2 }
166 1 //-----------------------------------------------------------------------------
167 1 return 1;
168 1 }
169
170 void Lock02()//写锁定位
171 {
172 1 //-----------------------------------------------------------------------------
173 1 //根据器件的DataSheet,设置相应的编程控制信号
174 1 if(ComBuf[2]>=1)//ComBuf[2]为锁定位
175 1 {
176 2 InitPro02();
177 2 OutBuf[0]=0xac;
178 2 OutBuf[1]=0xe1;
C51 COMPILER V7.08 AT89S51PRO 03/13/2008 14:53:30 PAGE 4
179 2 SendInstrc(4);
180 2 Delay_ms(1);
181 2 }
182 1 if(ComBuf[2]>=2)
183 1 {
184 2 InitPro02();
185 2 OutBuf[0]=0xac;
186 2 OutBuf[1]=0xe2;
187 2 SendInstrc(4);
188 2 Delay_ms(1);
189 2 }
190 1 if(ComBuf[2]==3)
191 1 {
192 2 InitPro02();
193 2 OutBuf[0]=0xac;
194 2 OutBuf[1]=0xe3;
195 2 SendInstrc(4);
196 2 Delay_ms(1);
197 2 }
198 1 //-----------------------------------------------------------------------------
199 1 ProOver02();
200 1 }
201
202 void PreparePro02()//设置pw中的函数指针,让主程序可以调用上面的函数
203 {
204 1 pw.fpInitPro=InitPro02;
205 1 pw.fpReadSign=ReadSign02;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -