📄 dsa.lst
字号:
C51 COMPILER V8.08 DSA 07/24/2008 14:03:29 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DSA
OBJECT MODULE PLACED IN dsa.OBJ
COMPILER INVOKED BY: E:\Program Files\kiel3\C51\BIN\C51.EXE dsa.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*C**************************************************************************
2 * NAME: dsa_com.c
3 *----------------------------------------------------------------------------
4 * PURPOSE:
5 * This is the software for A2368+DSA
6 *****************************************************************************/
7 #include<at89x52.h>
8 #include"dsa.h"
9 #include"typedefine.h"
10 #include"delay.h"
11
12 uchar Send_ok;
13 uchar Read_ok;
14 uchar dsa_com;
15 uchar dsa_data1;
16 uchar dsa_data2;
17 uchar Time_out;
18
19 /*F**************************************************************************
20 * NAME: dsa_init
21 *----------------------------------------------------------------------------
22 * PURPOSE:
23 * init
24 *****************************************************************************/
25 void dsa_init()
26 {
27 1 Stb=1;
28 1 S_data=1;
29 1 Ack=1;
30 1 }
31 /*F**************************************************************************
32 * NAME: Wr_data
33 *----------------------------------------------------------------------------
34 * PURPOSE:
35 * send word data to servo routine
36 *****************************************************************************/
37 void Wr_data(int w_data, uchar w_ldat) //写字节
38 {
39 1 uchar i;
40 1 int j;
41 1 Time_out=0;
42 1 dsa_init();
43 1 for(i=0;i<16;i++)
44 1 {
45 2 if(w_data & 0x8000) //!!!16位,不能用0x80
46 2 S_data=1;
47 2 else S_data=0;
48 2 w_data<<=1;
49 2 Stb=0;
50 2 for(j=0;j <= 300;j++) //如果应答不为零,未读数
51 2 {
52 3 if(Ack==0) break;
53 3 if(j==300)
54 3 {
55 4 Time_out=1;
C51 COMPILER V8.08 DSA 07/24/2008 14:03:29 PAGE 2
56 4 return; //超时退出
57 4 }
58 3 }
59 2 Stb=1;
60 2 for(j=0;j <= 300;j++) //如果应答不为1,读数未完成
61 2 {
62 3 if(Ack==1) break;
63 3 if(j==300)
64 3 {
65 4 Time_out=1;
66 4 return; //超时退出
67 4 }
68 3 }
69 2
70 2 }
71 1
72 1 for(i=0;i<8;i++)
73 1 {
74 2 if(w_ldat & 0x80) //
75 2 S_data=1;
76 2 else S_data=0;
77 2 w_ldat<<=1;
78 2 Stb=0;
79 2 for(j=0;j <= 300;j++) //如果应答不为零,未读数
80 2 {
81 3 if(Ack==0) break;
82 3 if(j==300)
83 3 {
84 4 Time_out=1;
85 4 return; //超时退出
86 4 }
87 3 }
88 2 Stb=1;
89 2 for(j=0;j <= 300;j++) //如果应答不为1,读数未完成
90 2 {
91 3 if(Ack==1) break;
92 3 if(j==300)
93 3 {
94 4 Time_out=1;
95 4 return; //超时退出
96 4 }
97 3 }
98 2
99 2 }
100 1
101 1 }
102 /*F**************************************************************************
103 * NAME: Wr_command
104 *----------------------------------------------------------------------------
105 * PURPOSE:
106 * write command routine
107 *****************************************************************************/
108
109 void Wr_command(uchar wdsa_c,uchar wdsa_d,uchar wdsa_l) //写命令
110 {
111 1 int j;
112 1 uchar i;
113 1 Send_ok=0;
114 1 for(i=0 ; i<2 ; i++) //发2次
115 1 {
116 2 Time_out=0;
117 2 dsa_init();
C51 COMPILER V8.08 DSA 07/24/2008 14:03:29 PAGE 3
118 2 S_data=0;
119 2 if(Send_ok==0)
120 2 {
121 3 for(j=0;j <=8000;j++) //如果应答不为0,未握手
122 3 {
123 4 if(Ack==0) break; //如果应答0,握手OK
124 4 if(j==8000)return; //超时退出
125 4 }
126 3 S_data=1;
127 3 for(j=0;j <= 300;j++) //如果应答不为1,握手未完成
128 3 {
129 4 if(Ack==1) break; //如果应答1,握手完成
130 4 if(j==300)return;
131 4 }
132 3 Wr_data(( (uint)wdsa_c <<8 ) | wdsa_d,wdsa_l); //合并为16位
133 3 if(Time_out==1) break; //超时退出
134 3 dsa_init();
135 3 Ack=0;
136 3 for(j=0;j <= 300;j++)
137 3 {
138 4 if(Stb==0) break; //如果选通0,应答成功
139 4 if(j==300)return;
140 4 }
141 3 dsa_init();
142 3 Send_ok=1; //发送成功
143 3 }
144 2 if(Send_ok==1) break;
145 2 }
146 1 }
147 /*F**************************************************************************
148 * NAME: Rd_data
149 *----------------------------------------------------------------------------
150 * PURPOSE:
151 * read word data from servo routine
152 *****************************************************************************/
153
154 unsigned char Rd_data() //读字节
155 {
156 1 uchar i;
157 1 uint j;
158 1 uchar r_data;
159 1 Time_out=0;
160 1 for(i=0;i<8;i++)
161 1 {
162 2 for(j=0;j <= 300;j++) //如果选通不为0,数据无效
163 2 {
164 3 if(Stb==0) break; //如果选通0,数据有效
165 3 if(j==300) Time_out=1;
166 3 }
167 2 if(Time_out==1) break; //超时退出stb
168 2 r_data <<=1;
169 2 if(S_data==1) r_data |= 0x01; //读数据
170 2 check_count++;
171 2 Ack=0; //应答
172 2 for(j=0;j <= 300;j++)
173 2 {
174 3 if(Stb==1) break; //如果选通1,应答成功
175 3 if(j==300) Time_out=1;
176 3 }
177 2 if(Time_out==1) break; //超时退出stb
178 2 Ack=1; //应答
179 2
C51 COMPILER V8.08 DSA 07/24/2008 14:03:29 PAGE 4
180 2 }
181 1 return(r_data);
182 1 }
183 /*F**************************************************************************
184 * NAME: Rd_command
185 *----------------------------------------------------------------------------
186 * PURPOSE:
187 * read dsa command routine
188 *****************************************************************************/
189 void Rd_command() //读命令
190 {
191 1 uint j;
192 1 uchar i;
193 1 Read_ok=0;
194 1 check_count=0;
195 1 dsa_init();
196 1
197 1 for(i=0;i<1;i++)
198 1 {
199 2 if((Ack==0) | (Stb==0 )) break;
200 2 for(j=0;j <=300;j++) //如果不为0,未握手,不能太长
201 2 {
202 3 if(S_data==0) break; //如果应答0,握手OK
203 3 if(j==300)return;
204 3 }
205 2 Ack=0; //应答0
206 2 for(j=0;j <= 300;j++) //如果应答不为1,握手未完成
207 2 {
208 3 if(S_data==1) break; //如果应答1,握手完成
209 3 if(j==300) return;
210 3 }
211 2 Ack=1;
212 2
213 2 dsa_com = Rd_data();
214 2 dsa_data1 = Rd_data();
215 2 dsa_data2 = Rd_data();
216 2
217 2 if(Time_out==1)return; //只读一次,所以超时退出
218 2 dsa_init();
219 2 for(j=0;j <= 300;j++)
220 2 {
221 3 if(Ack==0) break; //如果选通0,应答成功
222 3 if(j==300)return;
223 3 }
224 2 if(check_count==24) S_data=1;
225 2 else S_data=0;
226 2 Stb=0;
227 2 for(j=0;j <= 300;j++) //如果选通为0,数据校验
228 2 {
229 3 if(Ack==1) break; //如果选通1,应答成功
230 3 if(j==300) return; //超时退出
231 3 }
232 2 dsa_init();
233 2 Read_ok=1; //读数成功
234 2 }
235 1
236 1 }
237
238
239
C51 COMPILER V8.08 DSA 07/24/2008 14:03:29 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 623 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -