📄 93c46.lst
字号:
C51 COMPILER V7.06 93C46 05/09/2007 14:00:12 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 93C46
OBJECT MODULE PLACED IN 93c46.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE 93c46.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 /*****************************************************************/
3 /* */
-
4 /*名称: 93C46读写程序 */
-
-
5 /*功能: 接收串口发来的数据,写到93C46里面 */
6 /* 再从93C46里读出刚写进的数据,由串口发出 */
7 /*难度等级: 高 */
-
8 /* 作者: zengrenliang */
9 /* 版权: http://www.51kaifa.com */
10 /*编写日期: 2006.05.21 */
-
-
11 /*****************************************************************/
12
13 #include <reg52.h>
14 #define uchar unsigned char
15 #define uint unsigned int
16 sbit SK=P1^0;//SPI时钟线
17 sbit DI=P1^3;
18 sbit DO=P1^4;//SPI数据线*/
19 sbit LCK = P3^5;
20 bit receive;//接收标志
21 bit re_finish;//接收一串字符完成标志
22 sbit LED = P1^2;//LED指示灯
23
24 uchar i,buffer[8],cbuffer[8];//串口缓冲区
25 uchar sbuffer,number;//发送字符个数
26 uchar sendFINS ;//发送完成标志
27 uchar copyOK , cmd_numb ;//发送缓冲区填充完成
28
29 void send(void);
30 void vGet_Send(void);
31 void delay(unsigned int loop);
32 void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
33 void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
34
35 /*******************************系统初始化***********************/
36 void initial()
37 { unsigned char j;
38 1
39 1 SCON=0x50; //串口工作方式1,允许接收
40 1 PCON=0x80; //波特率翻倍
41 1 TCON=0;
42 1 TMOD=0x26; //T1用于串口波特率控制
43 1 TL1=0xfa; //初始化T1,波特率为9600(晶振11.0592M)
44 1 TH1=0xfa;
45 1 TR1=1; //开定时器
46 1 EA=1; //开总中断
47 1 ES=1; //开串口中断
48 1 copyOK = 0; //缓冲区准备好标志清零
49 1 receive = 0; //接收标志清零
C51 COMPILER V7.06 93C46 05/09/2007 14:00:12 PAGE 2
50 1 re_finish = 0; //接受完成标志清零
51 1 cmd_numb = 0; //接受计数器清零
52 1 LCK = 0;
53 1 P0 = 0xf7;//关闭所有指示灯
54 1 LCK = 1;
55 1
56 1 for(j=0; j<8; j++) //串口缓冲区清空
57 1 buffer[i] = 0xff; //table[18]为空显示
58 1 }
59
60 /******************************主函数**************************/
61
62 main()
63 {
64 1 initial();
65 1 while(1){
66 2 if(re_finish){//接收一串字符完成
67 3 re_finish = 0;
68 3 vGet_Send();
69 3 }
70 2 }
71 1 }
72
73 /*****************************保存和串口发送**************************/
74 void vGet_Send(void)
75 { uchar i;
76 1
77 1 WriteString(buffer,0x10,6);//数据存放初始地址为0x10
78 1
79 1 delay(1000);
80 1
81 1 for(i=0;i<8;i++)
82 1 buffer[i] = 0x5f; //用0xff填充发送缓冲区
83 1
84 1 ReadString(buffer,0x10,6);//读数据
85 1 copyOK = 1; //置准备好标志
86 1 send(); //向串口发送
87 1 }
88
89 /*****************************串口发送***************************/
90
91 void send(void)//向串口发送字符串
92 {
93 1
94 1 if(copyOK) //串口准备好且缓冲区准备好
95 1 {
96 2 i = 0;
97 2 REN = 0; //发送过程中禁止接收数据
98 2 copyOK = 0; //清缓冲区准备好标志
99 2 SBUF = cbuffer[i++]; //发送字符串首字符
100 2 number = 7; //置发送计数器
101 2 }
102 1 else
103 1 return; //没准备好则返回
104 1 }
105
106
107 /***************************串口中断响应*************************/
108
109 void serial(void) interrupt 4//串口中断响应
110 {
111 1 if(RI)//为接收中断
C51 COMPILER V7.06 93C46 05/09/2007 14:00:12 PAGE 3
112 1 {
113 2 RI=0; //清接收中断标志
114 2 LED = ~LED; //闪串口指示LED
115 2 sbuffer = SBUF; //读取串口缓冲区数据
116 2
117 2 if((sbuffer == 's') && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
118 2 {
119 3 receive = 1; //开始接收标志
120 3 cmd_numb = 0; //清接收计数器
121 3 re_finish = 0; //清接收完成标志
122 3 }
123 2 else if(sbuffer == 'e') //判断数据尾
124 2 {
125 3 re_finish = 1; //置接收完成标志
126 3 receive =0; //清接收标志
127 3 }
128 2 else if(receive){ //判断当前是否处于接收状态
129 3
130 3 cbuffer[cmd_numb++] = sbuffer; //当前字符送缓冲区
131 3 }
132 2 else //无效命令则返回
133 2 return;
134 2 }
135 1 else{
136 2 TI=0; //为单个字符发送完中断
137 2 if(!number) //字符串发送完
138 2 { REN = 1; //允许接收
139 3 }
140 2 else{ //字符串未发送完
141 3 SBUF = cbuffer[i++]; //发送下一字符
142 3 number--; //发送字符数减一
143 3 }
144 2 }
145 1 }
146
147 /*****************************延时函数**************************/
148 void delay(unsigned int loop)
149 { unsigned int i ; //loop 为执行空指令的次数,改变它可一改变延时时长
150 1 for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
151 1 }
152
153
154
155 // **************************允许写入****************************
156 void Ewen(void) {
157 1 unsigned char temp,InData;
158 1 LCK = 0;
159 1 P1 = 0xfd;
160 1 LCK = 1;//CS=0;
161 1
162 1 SK=0;
163 1
164 1 LCK = 0;
165 1 P1 = 0xff;
166 1 LCK = 1;//CS=1;
167 1
168 1 InData=0x98; // 10011XXXX
169 1 for(temp=9;temp!=0;temp--) { // 9
170 2 DI=InData&0x80;
171 2 SK=1; SK=0;//产生时钟
172 2 InData<<=1;
173 2 }
C51 COMPILER V7.06 93C46 05/09/2007 14:00:12 PAGE 4
174 1 LCK = 0;
175 1 P1 = 0xfd;
176 1 LCK = 1;//CS=0;
177 1 }
178
179
180 //****************************** 禁止写入************************
181 void Ewds(void) {
182 1 unsigned char temp,InData;
183 1 LCK = 0;
184 1 P1 = 0xfd;
185 1 LCK = 1;//CS=0;
186 1
187 1 SK=0;
188 1
189 1 LCK = 0;
190 1 P1 = 0xff;
191 1 LCK = 1;//CS=1;
192 1
193 1 InData=0x80; // 10000XXXX
194 1 for(temp=9;temp!=0;temp--) { // 9
195 2 DI=InData&0x80;
196 2 SK=1; SK=0;
197 2 InData<<=1;
198 2 }
199 1 LCK = 0;
200 1 P1 = 0xfd;
201 1 LCK = 1;//CS=0;
202 1 }
203
204 //**************************读address中的一字节****************************
205 unsigned int Read(unsigned char address) {
206 1 unsigned char temp;
207 1 unsigned int result;
208 1 Ewen();
209 1 SK=0; DI=1; // 110 A5-A0
210 1 LCK = 0;
211 1 P1 = 0xfd;
212 1 LCK = 1;//CS=0;
213 1 delay(3);
214 1 LCK = 0;
215 1 P1 = 0xff;
216 1 LCK = 1;//CS=1;
217 1
218 1 SK=1; SK=0; // 1
219 1 address=address&0x3f|0x80;
220 1 for(temp=8;temp!=0;temp--) { // 8
221 2 DI=address&0x80;
222 2 SK=1; SK=0;
223 2 address<<=1;
224 2 }
225 1 DO=1;
226 1 for(temp=16;temp!=0;temp--) { // 16
227 2 SK=1;
228 2 result=(result<<1)|DO;
229 2 SK=0;
230 2 }
231 1 LCK = 0;
232 1 P1 = 0xfd;
233 1 LCK = 1;//CS=0;
234 1 Ewds();
235 1 return(result);
C51 COMPILER V7.06 93C46 05/09/2007 14:00:12 PAGE 5
236 1 }
237
238 //***************************往address中写一字节InData************************
239 void Write(unsigned char address,unsigned int InData) {
240 1 unsigned char temp;
241 1 Ewen();
242 1 SK=0; DI=1; // 101 A5-A0
243 1 LCK = 0;
244 1 P1 = 0xfd;
245 1 LCK = 1;//CS=0;
246 1 delay(3);
247 1 LCK = 0;
248 1 P1 = 0xff;
249 1 LCK = 1;//CS=1;
250 1
251 1 SK=1; SK=0; // 1
252 1
253 1 address=address&0x3f|0x40;
254 1 for(temp=8;temp!=0;temp--) { // 8
255 2 DI=address&0x80;
256 2 SK=1; SK=0;
257 2 address<<=1;
258 2 }
259 1 for(temp=16;temp!=0;temp--) { // 16
260 2 DI=InData&0x8000;
261 2 SK=1; SK=0;
262 2 InData<<=1;
263 2 }
264 1 LCK = 0;
265 1 P1 = 0xfd;
266 1 LCK = 1;//CS=0;
267 1
268 1 DO=1;
269 1
270 1 LCK = 0;
271 1 P1 = 0xff;
272 1 LCK = 1;//CS=1;
273 1
274 1 SK=1;
275 1 while(DO==0) { // busy test
276 2 SK=0; SK=1;
277 2 }
278 1 SK=0;
279 1 LCK = 0;
280 1 P1 = 0xfd;
281 1 LCK = 1;//CS=0;
282 1 Ewds();
283 1 }
284
285
286 //*************************读address开始的一个字节,分高字节和地字节*******************
287 unsigned char ReadChar(unsigned char address) {
288 1 unsigned char temp=address>>1;
289 1 if(address&0x01) return((unsigned char)(Read(temp)>>8));
290 1 else return((unsigned char)(Read(temp)));
291 1 }
292
293 //**************************写address开始的一个字节,分高字节和地字节*****************
294 void WriteChar(unsigned char address,unsigned char InData) {
295 1 unsigned char temp=address>>1;
296 1 if(address&0x01) Write(temp,(unsigned int)(Read(temp)&0x00ff|(InData<<8)));
297 1 else Write(temp,(unsigned int)(Read(temp)&0xff00|InData));
C51 COMPILER V7.06 93C46 05/09/2007 14:00:12 PAGE 6
298 1 }
299
300 //********************************读一个字符串**********************************
301 void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {
302 1 while(Number!=0) {
303 2 *RamAddress=ReadChar(RomAddress);
304 2 RamAddress++;
305 2 RomAddress++;
306 2 Number--;
307 2 }
308 1 }
309
310
311 //**********************************写一个字符串**************************************///置左又半区标志//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -