📄 232tocan.lst
字号:
C51 COMPILER V8.17 232TOCAN 03/22/2009 15:12:45 PAGE 1
C51 COMPILER V8.17, COMPILATION OF MODULE 232TOCAN
OBJECT MODULE PLACED IN .\output\232toCAN.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 232toCAN.c OPTIMIZE(5,SPEED) FLOATFUZZY(0) DEBUG OBJECTEXTEND PRINT(.\outpu
-t\232toCAN.lst) OBJECT(.\output\232toCAN.obj)
line level source
1 /*-----------------预编译--------------------*/
2 #include<math.h>
3 #include<ctype.h>
4 #include<absacc.h>
5 #include<intrins.h>
6 #include<string.h>
7 #include<reg52.h>
8 #include"232toCAN.h"
9 /*-----------------函数声明-----------------*/
10 void Dog(void);
11 void Dl1s(void);
12 void Delay(uchar t_a);
13 void Write_reg(uchar tcode);
14 void Write_byte(uint address, uchar Data);
15 void Can_send_data(void);
16 /******************程序模块******************/
17 void Sum_data(uchar *p, uchar num)
18 {
19 1 uchar t_a;
20 1
21 1 Add.crc = 0;
22 1
23 1 for (t_a = 0; t_a < num; t_a++)
24 1 {
25 2 Add.crc += (*p);
26 2 p++;
27 2 }
28 1 }
29 //CAN接收中断处理
30 void CanRec_prg(void)
31 {
32 1 uchar form;
33 1 uchar count;
34 1 union
35 1 {
36 1 uchar t[2];
37 1 uint crc;
38 1 }var;
39 1
40 1 //数据接收是否有效
41 1 while ((PBYTE[2] & 0x01) != 0)
42 1 {
43 2 //BasicCAN
44 2 if (Can_mode == 0)
45 2 {
46 3 form = BASIC_RX_ID2;
47 3
48 3 //远程帧
49 3 if ((form & 0x10) != 0)
50 3 {
51 4 var.t[0] = BASIC_RX_ID1;
52 4 var.t[1] = BASIC_RX_ID2;
53 4
54 4 var.crc >>= 5;
C51 COMPILER V8.17 232TOCAN 03/22/2009 15:12:45 PAGE 2
55 4
56 4 Can_rxbuf[0] = var.t[0];
57 4 Can_rxbuf[1] = var.t[1];
58 4 Can_rxcount = 2;
59 4 }
60 3 //数据帧
61 3 else
62 3 {
63 4 count = form & 0x0f;
64 4
65 4 var.t[0] = BASIC_RX_ID1;
66 4 var.t[1] = BASIC_RX_ID2;
67 4
68 4 var.crc >>= 5;
69 4
70 4 Can_rxbuf[0] = var.t[0];
71 4 Can_rxbuf[1] = var.t[1];
72 4
73 4 while (count > 0)
74 4 {
75 5 Can_rxbuf[2 + Can_rxcount] = PBYTE[22 + Can_rxcount];
76 5 Can_rxcount++;
77 5 count--;
78 5 }
79 4 Can_rxcount += 2;
80 4 }
81 3 }
82 2 //PeliCAN
83 2 else
84 2 {
85 3 form = RX_FRAME_INFO;
86 3
87 3 //远程帧
88 3 if ((form & 0x40) != 0)
89 3 {
90 4 //扩展帧
91 4 if ((form & 0x80) != 0)
92 4 {
93 5 Can_rxbuf[0] = RX_FRAME_INFO;
94 5 Can_rxbuf[1] = PELI_RX_ID1;
95 5 Can_rxbuf[2] = PELI_RX_ID2;
96 5 Can_rxbuf[3] = PELI_RX_ID3;
97 5 Can_rxbuf[4] = PELI_RX_ID4;
98 5 Can_rxcount = 5;
99 5 }
100 4 //标准帧
101 4 else
102 4 {
103 5 Can_rxbuf[0] = RX_FRAME_INFO;
104 5 var.t[0] = PELI_RX_ID1;
105 5 var.t[1] = PELI_RX_ID2;
106 5
107 5 var.crc >>= 5;
108 5 Can_rxbuf[1] = var.t[0];
109 5 Can_rxbuf[2] = var.t[1];
110 5
111 5 Can_rxcount = 3;
112 5 }
113 4 }
114 3 //数据帧
115 3 else
116 3 {
C51 COMPILER V8.17 232TOCAN 03/22/2009 15:12:45 PAGE 3
117 4 count = form & 0x0f;
118 4
119 4 //扩展帧
120 4 if ((form & 0x80) != 0)
121 4 {
122 5 Can_rxbuf[0] = RX_FRAME_INFO;
123 5 Can_rxbuf[1] = PELI_RX_ID1;
124 5 Can_rxbuf[2] = PELI_RX_ID2;
125 5 Can_rxbuf[3] = PELI_RX_ID3;
126 5 Can_rxbuf[4] = PELI_RX_ID4;
127 5
128 5 while (count > 0)
129 5 {
130 6 Can_rxbuf[5 + Can_rxcount] = PBYTE[21 + Can_rxcount];
131 6 Can_rxcount++;
132 6 count--;
133 6 }
134 5
135 5 Can_rxcount += 5;
136 5 }
137 4 //标准帧
138 4 else
139 4 {
140 5 Can_rxbuf[0] = RX_FRAME_INFO;
141 5
142 5 var.t[0] = PELI_RX_ID1;
143 5 var.t[1] = PELI_RX_ID2;
144 5
145 5 var.crc >>= 5;
146 5 Can_rxbuf[1] = var.t[0];
147 5 Can_rxbuf[2] = var.t[1];
148 5
149 5 while (count > 0)
150 5 {
151 6 Can_rxbuf[3 + Can_rxcount] = PBYTE[19 + Can_rxcount];
152 6 Can_rxcount++;
153 6 count--;
154 6 }
155 5 Can_rxcount += 3;
156 5 }
157 4 }
158 3 }
159 2 //准备启动串口发送
160 2 Com_send_ready = 1;
161 2 //释放接收缓冲区
162 2 PBYTE[1] = RRB_CMD;
163 2 }
164 1 }
165 //SJA1000初始化配置
166 void Can_config(void)
167 {
168 1 union
169 1 {
170 1 uchar t[2];
171 1 uint crc;
172 1 }var;
173 1
174 1 EX1 = 0;
175 1 CAN_CS = 0;
176 1
177 1 //BasicCAN
178 1 if (Can_mode == 0)
C51 COMPILER V8.17 232TOCAN 03/22/2009 15:12:45 PAGE 4
179 1 {
180 2 //硬件产生复位信号
181 2 RST = 0;
182 2
183 2 while ((BASIC_MODE_REG & 0x01) != 0x01)
184 2 {
185 3 BASIC_MODE_REG |= 0x01;//软件复位
186 3 }
187 2 //关闭复位信号
188 2 RST = 1;
189 2
190 2 BASIC_OUTPUT_CONTROL_REG = 0x0a; //输出模式
191 2
192 2 while (BASIC_CLK_DIV_REG != 0x48) //
193 2 {
194 3 BASIC_CLK_DIV_REG = 0x48; //时钟分频设置
195 3 }
196 2
197 2 BASIC_BTR0_REG = Bitrate[CanBaud][0];//通讯速率设置
198 2 BASIC_BTR1_REG = Bitrate[CanBaud][1];
199 2
200 2 var.crc = Acr_data;
201 2 BASIC_ACCEPT_CODE_REG = var.t[0]; //验收码
202 2
203 2 var.crc = Amr_data;
204 2 BASIC_ACCEPT_MASK_REG = var.t[0]; //屏蔽码
205 2
206 2 while ((BASIC_MODE_REG & 0x01) != 0)//退出复位,进入正常工作模式
207 2 {
208 3 BASIC_MODE_REG &= 0xfe;
209 3 }
210 2
211 2 BASIC_MODE_REG |= 0x1a; //中断使能
212 2 }
213 1 //PeliCAN
214 1 else
215 1 {
216 2 //硬件产生复位信号
217 2 RST = 0;
218 2
219 2 while ((PELI_MODE_REG & 0x01) != 0x01)
220 2 {
221 3 PELI_MODE_REG |= 0x01;//软件复位
222 3 }
223 2 //关闭复位信号
224 2 RST = 1;
225 2
226 2 PELI_OUTPUT_CONTROL_REG = 0x0a; //输出模式
227 2
228 2 while (PELI_CLK_DIV_REG != 0xc8) //0xc8
229 2 {
230 3 PELI_CLK_DIV_REG = 0xc8; //时钟分频设置
231 3 }
232 2
233 2 PELI_BTR0_REG = Bitrate[CanBaud][0];//通讯速率设置
234 2 PELI_BTR1_REG = Bitrate[CanBaud][1];
235 2
236 2 var.crc = Acr_data;
237 2
238 2 PELI_ACCEPT_CODE0_REG = var.t[0]; //验收码
239 2 PELI_ACCEPT_CODE1_REG = var.t[1];
240 2 PELI_ACCEPT_CODE2_REG = var.t[0];
C51 COMPILER V8.17 232TOCAN 03/22/2009 15:12:45 PAGE 5
241 2 PELI_ACCEPT_CODE3_REG = var.t[1];
242 2
243 2 var.crc = Amr_data;
244 2
245 2 PELI_ACCEPT_MASK0_REG = var.t[0]; //屏蔽码
246 2 PELI_ACCEPT_MASK1_REG = var.t[1];
247 2 PELI_ACCEPT_MASK2_REG = var.t[0];
248 2 PELI_ACCEPT_MASK3_REG = var.t[1];
249 2
250 2 ERR_WARN_REG = 255; //错误警告次数限制
251 2 RX_ERR_REG = 0; //接收出错次数计数
252 2 TX_ERR_REG = 0; //发送出错次数计数
253 2 RX_BUFFER_START = 0; //接收缓冲区起始地址
254 2
255 2 //PELI_MODE_REG = 0x04;
256 2
257 2 while ((PELI_MODE_REG & 0x01) != 0)//退出复位,进入正常工作模式
258 2 {
259 3 PELI_MODE_REG &= 0xfe;
260 3 }
261 2
262 2 //PELI_MODE_REG = 0x10;
263 2
264 2 INTERRUPT_EN_REG = 0x0d; //中断使能
265 2 }
266 1
267 1 Com_send_ready = 0;
268 1 Can_rxcount = 0;
269 1 Can_send_ready = 0;
270 1 EX1 = 1;
271 1 }
272 //--------------初始化波特率-------------
273 void Baudrate(uchar Baud)
274 {
275 1 SCON = 0x70;
276 1 T2CON = 0x34;
277 1
278 1 switch (Baud)
279 1 {
280 2 case 0://1200 bps
281 2 RCAP2H = BAUD1200H;
282 2 RCAP2L = BAUD1200L;
283 2 break;
284 2
285 2 case 1://2400 bps
286 2 RCAP2H = BAUD2400H;
287 2 RCAP2L = BAUD2400L;
288 2 break;
289 2
290 2 case 2://4800 bps
291 2 RCAP2H = BAUD4800H;
292 2 RCAP2L = BAUD4800L;
293 2 break;
294 2
295 2 case 3://9600 bps
296 2 RCAP2H = BAUD9600H;
297 2 RCAP2L = BAUD9600L;
298 2 break;
299 2
300 2 case 4://19200 bps
301 2 RCAP2H = BAUD19200H;
302 2 RCAP2L = BAUD19200L;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -