📄 main.lst
字号:
C51 COMPILER V7.07 MAIN 06/01/2004 12:59:40 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: c:\Keil7\C51\BIN\C51.EXE main.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //**********************************************************************************
2 //本函数模块89S52的IAP下载监控程序,作者聂小猛(丁丁),主页地址http://www.mcu51.com
3 //本程序为89S52的IAP下载监控程序,可使用89C2051,89C51,89C52等等51单片机做监控芯片。
4 //P10-P13接89s52的IAP接口,具体见程序中的定义。
5 //监控芯片的串口经232电平转换接电脑串口,计算机使用串口调试工具控制烧写过程,如sscom32。
6 //本工具操作简单,只需按照监控程序返回到计算机的提示操作即可。
7 //本工具有检测设备连接,烧写,擦除,读出,复位目标单片机运行,等功能。
8 //本工具可以从程序运行状态直接进行烧写等动作,烧完后发指令直接运行,可用在远程升级场合。
9 //本工具烧写速度极快,通讯波特率38400bps,烧写整片89s52的8K程序仅需5.7秒!
10 //"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途!
11 //**********************************************************************************
12 #define uchar unsigned char
13 #define uint unsigned int
14 #define ulong unsigned long
15 #include <reg52.h>
16
17 //定义控制IAP烧写的IO脚
18 sbit SRST=P1^0; //控制器发出复位信号
19 sbit SCLK=P1^1; //控制器发出时钟信号
20 sbit SDOUT=P1^3; //控制器发出命令
21 sbit SDIN=P1^2; //控制器接收数据
22
23 extern char getbyte(void);//从串口取一个字节
24 extern putbyte(char c);//发送一个字节
25 extern putstring(uchar *puts);//发送一个字符串到串口
26 extern puthex(uchar c);//发送一个字节的hex码,分成两个字节发。
27 #define CR putstring("\r\n")//发送一个回车换行
28 extern void serial_init (void);
29 uchar code help[]="\r\n\r\nISP of AT89S52 bye DingDing(丁丁),WWW.MCU51.COM"
30 "\r\n-----------------------------------------------"
31 "\r\n'r'-read eprom"
32 "\r\n'w'-write data to 89S52"
33 "\r\n'e'-chip erase"
34 "\r\n'g'-Run 89s52\r\n\r\n";
35 //**************************************
36 //使能ISP,同时检测设备是否准备好
37 uchar bdata DATAOUT;
38 sbit BITOUT=DATAOUT^7;
39 sbit BITIN=DATAOUT^0;
40 void enable(void)
41 {
42 1 uchar i;
43 1 uint n;
44 1 P1=0xff;
45 1 SCLK=0;
46 1 SRST=0;
47 1 for(n=0;n<1000;n++);
48 1 SRST=1; //拉高S52的RST脚
49 1 for(n=0;n<1000;n++);
50 1
51 1 DATAOUT=0xac;//10101100
52 1 for(i=0;i<8;i++)
53 1 {
54 2 SDOUT=BITOUT;
55 2 SCLK=1;SCLK=1;
C51 COMPILER V7.07 MAIN 06/01/2004 12:59:40 PAGE 2
56 2 SCLK=0;SCLK=0;
57 2 DATAOUT=DATAOUT<<1;
58 2 }
59 1
60 1 DATAOUT=0x53;//01010011
61 1 for(i=0;i<8;i++)
62 1 {
63 2 SDOUT=BITOUT;
64 2 SCLK=1;SCLK=1;
65 2 SCLK=0;SCLK=0;
66 2 DATAOUT=DATAOUT<<1;
67 2 }
68 1
69 1 for(i=0;i<8;i++)
70 1 {
71 2 SCLK=1;SCLK=1;
72 2 SCLK=0;SCLK=0;
73 2 }
74 1
75 1 for(i=0;i<8;i++)
76 1 {
77 2 DATAOUT=DATAOUT<<1; //移位8次取到采样的值
78 2 BITIN=SDIN;
79 2 SCLK=1;SCLK=1;
80 2 SCLK=0;SCLK=0;
81 2 }
82 1 if(DATAOUT==0x69)putstring("89S52 device ready! \r\n");
83 1 else putstring("Device ERROR!!!!!!!!!!!!! \r\n");
84 1 }
85 //********************************
86 //片擦
87 void chiperase(void)
88 {
89 1 uchar i;
90 1 ulong n;
91 1
92 1 DATAOUT=0xac;//10101100
93 1 for(i=0;i<8;i++)
94 1 {
95 2
96 2 SDOUT=BITOUT;
97 2 SCLK=1;SCLK=1;
98 2 SCLK=0;SCLK=0;
99 2 DATAOUT=DATAOUT<<1;
100 2 }
101 1
102 1 DATAOUT=0x80;//100XXXXX
103 1 for(i=0;i<8;i++)
104 1 {
105 2
106 2 SDOUT=BITOUT;
107 2 SCLK=1;SCLK=1;
108 2 SCLK=0;SCLK=0;
109 2 DATAOUT=DATAOUT<<1;
110 2 }
111 1 for(i=0;i<16;i++)
112 1 {
113 2 SCLK=1;SCLK=1;
114 2 SCLK=0;SCLK=0;
115 2 }
116 1 for(n=0;n<0x2000;n++);
117 1 putstring("Erased OK!\r\n");
C51 COMPILER V7.07 MAIN 06/01/2004 12:59:40 PAGE 3
118 1 }
119 //*********************************
120 //读89s52中的内容并输出到串口
121 readeprom()
122 {
123 1 uchar i;
124 1 uint n,n_all;
125 1 for(n_all=0;n_all<0x2000;)
126 1 {
127 2 DATAOUT=0x30;//00110000
128 2 for(i=0;i<8;i++)
129 2 {
130 3 SDOUT=BITOUT;
131 3 SCLK=1;SCLK=1;
132 3 SCLK=0;SCLK=0;
133 3 DATAOUT=DATAOUT<<1;
134 3 }
135 2 DATAOUT=n_all/256;//XXX00000
136 2 for(i=0;i<8;i++)
137 2 {
138 3 SDOUT=BITOUT;
139 3 SCLK=1;SCLK=1;
140 3 SCLK=0;SCLK=0;
141 3 DATAOUT=DATAOUT<<1;
142 3 }
143 2 for(n=0;n<256;n++)
144 2 {
145 3 for(i=0;i<8;i++)
146 3 {
147 4 DATAOUT=DATAOUT<<1; //移位8次取到采样的值
148 4 BITIN=SDIN;
149 4 SCLK=1;SCLK=1;
150 4 SCLK=0;SCLK=0;
151 4 }
152 3 if(n%16==0){CR;puthex(n_all/256);puthex(n_all%256);putbyte(':');}
153 3 puthex(DATAOUT);
154 3 n_all++;
155 3 }
156 2 if(RI){getbyte();putstring(help);return;}
157 2 }
158 1 putstring(help);
159 1 }
160 //***********************************
161 //将两个HEX字节转换成一个字节 (2 hexbytes = 1 byte)
162 uchar code hex_c[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,10,11,12,13,14,15};
163 uchar hextochar(uchar c0,c1)
164 {
165 1 return((hex_c[c0-0x30]<<4)+hex_c[c1-0x30]);
166 1 }
167 //****************************************************
168 //从串口接收HEX文件并写入单片机
169 loadfile()
170 {
171 1 uchar c1,c0,i,n_of_line;
172 1 union {uint addrhl;struct {uchar h,l;}addr;} idata address; //定义现在写入的地址
173 1 union {uint addrhl;struct {uchar h,l;}addr;} idata addressall; //定义已经写入的总数
174 1 unsigned char free[8]; //定义行首处理空间
175 1
176 1 chiperase();
177 1
178 1 putstring("\r\n请发送您要烧的HEX文件!");
179 1 while (!(getbyte()==':')); //等待下一行开始
C51 COMPILER V7.07 MAIN 06/01/2004 12:59:40 PAGE 4
180 1
181 1 addressall.addrhl=0; //已经写入的总数清0
182 1 for(i=0;i!=8;i++) //读取第一行的行首,8字节
183 1 {
184 2 free[i]=getbyte();
185 2 }
186 1 n_of_line=hextochar(free[0],free[1]); //分析行首,解出行字节总数及行首址
187 1 address.addr.h=hextochar(free[2],free[3]); //高位地址
188 1 address.addr.l=hextochar(free[4],free[5]); //底位地址
189 1 do //大循环,行总数为0时停止,此时文件结束
190 1 {
191 2 do //小循环,每行一个循环
192 2 {
193 3 c1=getbyte();c0=getbyte(); //取两个HEX数据
194 3 c0=hextochar(c1,c0);
195 3 addressall.addrhl++; //已经写入的地址加1
196 3
197 3 DATAOUT=0x40;//01000000
198 3 for(i=0;i<8;i++)
199 3 {
200 4 SDOUT=BITOUT;
201 4 SCLK=1;SCLK=1;
202 4 SCLK=0;SCLK=0;
203 4 DATAOUT=DATAOUT<<1;
204 4 }
205 3 DATAOUT=address.addr.h;
206 3 for(i=0;i<8;i++)
207 3 {
208 4 SDOUT=BITOUT;
209 4 SCLK=1;SCLK=1;
210 4 SCLK=0;SCLK=0;
211 4 DATAOUT=DATAOUT<<1;
212 4 }
213 3 DATAOUT=address.addr.l;
214 3 for(i=0;i<8;i++)
215 3 {
216 4 SDOUT=BITOUT;
217 4 SCLK=1;SCLK=1;
218 4 SCLK=0;SCLK=0;
219 4 DATAOUT=DATAOUT<<1;
220 4 }
221 3 DATAOUT=c0;
222 3 for(i=0;i<8;i++)
223 3 {
224 4 SDOUT=BITOUT;
225 4 SCLK=1;SCLK=1;
226 4 SCLK=0;SCLK=0;
227 4 DATAOUT=DATAOUT<<1;
228 4 }
229 3 //for(t=0;t<120;t++);
230 3 address.addrhl++;//现在写入的地址加1
231 3 n_of_line--; //该行剩下的字节减一
232 3 }while(n_of_line!=0); //写完一行退出该循
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -