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