📄 at89c2051pro.lst
字号:
C51 COMPILER V7.50 AT89C2051PRO 01/02/2008 14:26:02 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE AT89C2051PRO
OBJECT MODULE PLACED IN AT89C2051PRO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AT89C2051PRO.C WARNINGLEVEL(1) OPTIMIZE(5,SIZE) REGFILE(.\E51Pro.ORC) BROWS
-E INCDIR(G:\MCU工程\E51Pro\) DEBUG OBJECTEXTEND CODE
line level source
1 ///////////////////////////////////////////////////////////////////////////////////////////////////
2 //FID=01:AT89C2051系列编程器
3 //实现编程的读,写,擦等细节
4 //AT89C2051的特殊处:给XTAL一个脉冲,地址计数加1;P1的引脚排列与AT89C51相反,需要用函数转换
5 ///////////////////////////////////////////////////////////////////////////////////////////////////
6 #include <e51pro.h>
7
8 #define C2051_P3_7 P1_0
9 #define C2051_P1 P0//注意引脚排列相反
10 #define C2051_P3_0 P1_1
11 #define C2051_P3_1 P1_2
12 #define C2051_XTAL P1_4
13 #define C2051_P3_2 P1_5
14 #define C2051_P3_3 P1_6
15 #define C2051_P3_4 P1_7
16 #define C2051_P3_5 P3_5
17
18 void InitPro01()//编程前的准备工作
19 {
20 1 SetVpp0V();
21 1 P0=0xff;
22 1 P1=0xff;
23 1 C2051_P3_5=1;
24 1 C2051_XTAL=0;
25 1 Delay_ms(20);
26 1 nAddress=0x0000;
27 1 SetVpp5V();
28 1 }
29
30 void ProOver01()//编程结束后的工作,设置合适的引脚电平
31 {
32 1 SetVpp5V();
33 1 P0=0xff;
34 1 P1=0xff;
35 1 C2051_P3_5=1;
36 1 C2051_XTAL=1;
37 1 }
38
39 BYTE GetData()//从P0口获得数据
40 {
41 1 B_0=P0_7;
42 1 B_1=P0_6;
43 1 B_2=P0_5;
44 1 B_3=P0_4;
45 1 B_4=P0_3;
46 1 B_5=P0_2;
47 1 B_6=P0_1;
48 1 B_7=P0_0;
49 1 return B;
50 1 }
51
52 void SetData(BYTE DataByte)//转换并设置P0口的数据
53 {
54 1 B=DataByte;
C51 COMPILER V7.50 AT89C2051PRO 01/02/2008 14:26:02 PAGE 2
55 1 P0_0=B_7;
56 1 P0_1=B_6;
57 1 P0_2=B_5;
58 1 P0_3=B_4;
59 1 P0_4=B_3;
60 1 P0_5=B_2;
61 1 P0_6=B_1;
62 1 P0_7=B_0;
63 1 }
64
65
66 void ReadSign01()//读特征字
67 {
68 1 InitPro01();
69 1 Delay_ms(1);
70 1 //-----------------------------------------------------------------------------
71 1 //根据器件的DataSheet,设置相应的编程控制信号
72 1 C2051_P3_3=0;
73 1 C2051_P3_4=0;
74 1 C2051_P3_5=0;
75 1 C2051_P3_7=0;
76 1 Delay_ms(20);
77 1 ComBuf[2]=GetData();
78 1 C2051_XTAL=1;
79 1 C2051_XTAL=0;
80 1 Delay_us(20);
81 1 ComBuf[3]=GetData();
82 1 ComBuf[4]=0xff;
83 1 //-----------------------------------------------------------------------------
84 1 ProOver01();
85 1 }
86
87 void Erase01()//擦除器件
88 {
89 1 InitPro01();
90 1 //-----------------------------------------------------------------------------
91 1 //根据器件的DataSheet,设置相应的编程控制信号
92 1 C2051_P3_3=1;
93 1 C2051_P3_4=0;
94 1 C2051_P3_5=0;
95 1 C2051_P3_7=0;
96 1 Delay_ms(1);
97 1 SetVpp12V();
98 1 Delay_ms(1);
99 1 C2051_P3_2=0;
100 1 Delay_ms(10);
101 1 C2051_P3_2=1;
102 1 Delay_ms(1);
103 1 //-----------------------------------------------------------------------------
104 1 ProOver01();
105 1 }
106
107 BOOL Write01(BYTE Data)//写器件
108 {
109 1 //-----------------------------------------------------------------------------
110 1 //根据器件的DataSheet,设置相应的编程控制信号
111 1 //写一个单元
112 1 C2051_P3_3=0;
113 1 C2051_P3_4=1;
114 1 C2051_P3_5=1;
115 1 C2051_P3_7=1;
116 1 SetData(Data);
C51 COMPILER V7.50 AT89C2051PRO 01/02/2008 14:26:02 PAGE 3
117 1 SetVpp12V();
118 1 Delay_us(20);
119 1 C2051_P3_2=0;
120 1 Delay_us(20);
121 1 C2051_P3_2=1;
122 1 Delay_us(20);
123 1 SetVpp5V();
124 1 Delay_us(20);
125 1 C2051_P3_4=0;
126 1 Delay_ms(2);
127 1 nTimeOut=0;
128 1 P0=0xff;
129 1 nTimeOut=0;
130 1 while(!GetData()==Data)//效验:循环读,直到读出与写入的数相同
131 1 {
132 2 nTimeOut++;
133 2 if(nTimeOut>1000)//超时了
134 2 {
135 3 return 0;
136 3 }
137 2 }
138 1 C2051_XTAL=1;
139 1 C2051_XTAL=0;//一个脉冲指向下一个单元
140 1 //-----------------------------------------------------------------------------
141 1 return 1;
142 1 }
143
144 BYTE Read01()//读器件
145 {
146 1 BYTE Data;
147 1 //-----------------------------------------------------------------------------
148 1 //根据器件的DataSheet,设置相应的编程控制信号
149 1 //读一个单元
150 1 C2051_P3_3=0;
151 1 C2051_P3_4=0;
152 1 C2051_P3_5=1;
153 1 C2051_P3_7=1;
154 1 Data=GetData();
155 1 C2051_XTAL=1;
156 1 C2051_XTAL=0;//一个脉冲指向下一个单元
157 1 //-----------------------------------------------------------------------------
158 1 return Data;
159 1 }
160
161 void Lock01()//写锁定位
162 {
163 1 InitPro01();//先设置成编程状态
164 1 //-----------------------------------------------------------------------------
165 1 //根据器件的DataSheet,设置相应的编程控制信号
166 1 if(ComBuf[2]>=1)//ComBuf[2]为锁定位
167 1 {
168 2 C2051_P3_3=1;
169 2 C2051_P3_4=1;
170 2 C2051_P3_5=1;
171 2 C2051_P3_7=1;
172 2 Delay_us(20);
173 2 SetVpp12V();
174 2 Delay_us(20);
175 2 C2051_P3_2=0;
176 2 Delay_us(20);
177 2 C2051_P3_2=1;
178 2 Delay_us(20);
C51 COMPILER V7.50 AT89C2051PRO 01/02/2008 14:26:02 PAGE 4
179 2 SetVpp5V();
180 2 }
181 1 if(ComBuf[2]>=2)
182 1 {
183 2 C2051_P3_3=1;
184 2 C2051_P3_4=1;
185 2 C2051_P3_5=0;
186 2 C2051_P3_7=0;
187 2 Delay_us(20);
188 2 SetVpp12V();
189 2 Delay_us(20);
190 2 C2051_P3_2=0;
191 2 Delay_us(20);
192 2 C2051_P3_2=1;
193 2 Delay_us(20);
194 2 SetVpp5V();
195 2 }
196 1 //-----------------------------------------------------------------------------
197 1 ProOver01();
198 1 }
199
200 void PreparePro01()//设置pw中的函数指针,让主程序可以调用上面的函数
201 {
202 1 pw.fpInitPro=InitPro01;
203 1 pw.fpReadSign=ReadSign01;
204 1 pw.fpErase=Erase01;
205 1 pw.fpWrite=Write01;
206 1 pw.fpRead=Read01;
207 1 pw.fpLock=Lock01;
208 1 pw.fpProOver=ProOver01;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -