📄 can_self.lst
字号:
180 //说明:接收处理程序;检测接收标志状态位,
181 // 如果置位则进行接收处理
182 //入口:无
183 //返回:无
184 ///////////////////////////////////////////////
185 /****************************************************/
186 void rxd_deal(void)
187 {
188 1 if( RXD_flag ) //RXD_flag=0说明无数据可以接收,RXD_flag=1说明有数据可以接收
189 1 {
190 2 EA = 0; //关闭CPU中断
191 2 RXD_flag = 0; //RXD_flag清零,以便下次查询
192 2 if( RX_buffer[0] && 0x40 ) //接收到远程帧
193 2 {
194 3 TXD_flag = 1; //置位发送数据帧
195 3 }
196 2 else //接收到数据帧
197 2 { //CAN总线要接收的数据,也是要在数码管3-4位置显示的数据
198 3 Rxd_data = RX_buffer[5];
199 3 }
200 2
201 2 EA = 1; //重新开启CPU中断
202 2 }
203 1 }
204
205
206 ///////////////////////////////////////////////
207 //函数:txd_deal
208 //说明:发送处理程序;检测发送标志状态位,
209 // 如果置位则进行发送数据处理
210 //入口:无
211 //返回:无
212 ///////////////////////////////////////////////
213 void txd_deal(void)
214 {
215 1 if( TXD_flag ) //若TXD_flag=1,要求进行数据的发送处理
216 1 {
217 2 _nop_();
218 2 TXD_flag = 0; //RXD_flag清零,以便下次查询
219 2 can_txd(); //发送数据帧
220 2 _nop_();
221 2 _nop_();
222 2 } //发送数据帧后,SJA1000将产生接收中断
223 1 }
224
225
226
227 ///////////////////////////////////////////////
228 //函数:can_txd
229 //说明:发送扩展数据帧
230 //入口:无
231 //返回:无
232 ///////////////////////////////////////////////
233 void can_txd(void)
234 {
235 1 uchar state;
236 1 uchar TX_buffer[ N_can ] ; //N_can=13,TX_buffer数组为待传送的数据帧
237 1
238 1 //初始化标示码头信息
239 1 TX_buffer[0] = 0x88; //.7=0--扩展帧;.6=0--数据帧; .0-.3=100--数据长度为8字节
240 1 TX_buffer[1] = 0x55; //本帧信息的ID
241 1 TX_buffer[2] = 0x22;
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:29:09 PAGE 5
242 1 TX_buffer[3] = 0x33;
243 1 TX_buffer[4] = 0x44;
244 1
245 1 //初始化发送数据单元
246 1 TX_buffer[5] = Txd_data; //发送的第1个字节数据,也是数码管要显示的数据(计数结果)
247 1 TX_buffer[6] = 0x22; //2
248 1 TX_buffer[7] = 0x33; //3
249 1 TX_buffer[8] = 0x44; //4
250 1 TX_buffer[9] = 0x55; //5
251 1 TX_buffer[10] = 0x66; //6
252 1 TX_buffer[11] = 0x77; //7
253 1 TX_buffer[12] = 0x88; //8
254 1
255 1 //初始化数据信息
256 1 EA = 0; //关中断
257 1
258 1 //查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行
259 1 do
260 1 {
261 2 state = SR; //SR为SJA1000的状态寄存器
262 2 LED_RED = 0; //点亮LED1
263 2 }
264 1 while( state & 0x10 ); //SR.4=1 正在接收,等待
265 1
266 1 //查询SJA1000是否处于发送完毕状态
267 1 do
268 1 {
269 2 state = SR;
270 2 LED_RED = 0; //点亮LED1
271 2 }
272 1 while(!(state & 0x08)); //SR.3=0,发送请求未处理完,等待直到SR.3=1
273 1
274 1 //查询发送缓冲器状态
275 1 do
276 1 {
277 2 state = SR;
278 2 LED_RED = 0; //点亮LED1
279 2 }
280 1 while(!(state & 0x04)); //SR.2=0,发送缓冲器被锁。等待直到SR.2=1
281 1
282 1 LED_RED = !LED_RED; //熄灭LED1
283 1 LED_GRE = !LED_GRE; //点亮LED2
284 1
285 1 //将待发送的一帧数据信息存入SJA1000的相应寄存器中
286 1 TBSR0 = TX_buffer[0];
287 1 TBSR1 = TX_buffer[1];
288 1 TBSR2 = TX_buffer[2];
289 1 TBSR3 = TX_buffer[3];
290 1 TBSR4 = TX_buffer[4];
291 1 TBSR5 = TX_buffer[5];
292 1 TBSR6 = TX_buffer[6];
293 1 TBSR7 = TX_buffer[7];
294 1 TBSR8 = TX_buffer[8];
295 1 TBSR9 = TX_buffer[9];
296 1 TBSR10 = TX_buffer[10];
297 1 TBSR11 = TX_buffer[11];
298 1 TBSR12 = TX_buffer[12];
299 1
300 1 CMR = 0x01; //置位发送请求
301 1 EA = 1; //重新开启中断
302 1 }
303
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:29:09 PAGE 6
304 ///////////////////////////////////////////////
305 //函数:delay
306 //说明:延时子函数
307 //入口:uchar time:延时时间time us
308 //返回:无
309 ///////////////////////////////////////////////
310 void delay(uchar time)
311 {
312 1 while(time--);
313 1 }
314
315 ///////////////////////////////////////////////
316 //函数:led_show
317 //说明:数码管显示函数
318 // 注意控制P2口的高4位时,不要影响P2口的低4位值
319 //入口:uchar wela: wela=1--高两位显示发送数据
320 // wela=0--低两位显示接收数据
321 // uchar number: 要显示的数据
322 //返回:无
323 ///////////////////////////////////////////////
324 void led_show(uchar wela,uchar number)
325 {
326 1 uchar digit;
327 1 uchar temp;
328 1
329 1 if(wela) //高位显示,即数码管1-2
330 1 {
331 2 temp = 0x7b; //temp=01111011B
332 2 }
333 1 else //低位显示,即数码管3-4
334 1 {
335 2 temp = 0xde; //temp=11011110B
336 2 }
337 1
338 1 //数码管个位显示
339 1 digit = number%10;
340 1 P0 = led[digit];
341 1 P2 = (temp | 0x0f) & P2; //开个位
342 1 delay(5);
343 1 P2 = 0xff;
344 1 P0 = 0xff; //关闭个位
345 1 //数码管十位显示
346 1 number /= 10;
347 1 digit = number%10;
348 1 P2 = ((temp << 4) | 0x0f) & P2; //开十位
349 1 P0 = led[digit];
350 1 delay(5);
351 1 P2 = 0xff; //关闭十位
352 1 P0 = 0xff;
353 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 534 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 28 21
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -