rs232_basiccan.lst
来自「可以实现在PC与CAN总线的连接。采用的89C51和SJA1000芯片的接法。里」· LST 代码 · 共 126 行
LST
126 行
C51 COMPILER V6.12 RS232_BASICCAN 12/11/2007 21:38:45 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE RS232_BASICCAN
OBJECT MODULE PLACED IN .\RS232_basiccan.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\RS232_basiccan.c DEBUG OBJECTEXTEND
stmt level source
1 #include<REG52.H>
2 #include<SJA_BCANCONF.H>
3 #include<SJA_BCANFUNC.C>
4 //************************函数声明*****************************//
5 void T1_int(void);
6 void Sja_1000_Init(void);
7 //************************变量定义*****************************//
8 unsigned char data send_data[10],rcv_data[10]; //发送和接收数组定义
9 unsigned char bdata flag_init;
10 unsigned char j,k=2;
11 sbit rcv_flag=flag_init^0; //接收中断标志
12 sbit err_flag=flag_init^2; //错误中断标志
13 bit send_flag=0;
14 sbit P2_0=P2^0;
15 sbit P3_4=P3^4;
16 sbit LED=P3^5;
17 //***********************主函数*******************************//
18 void main(void)
19 {
20 1 P2_0=0; //SJA1000退出硬件复位模式
21 1 Sja_1000_Init(); //initialize Sja100
22 1 T1_int(); //initialize T1
23 1 PX0=1; //外部中断0高优先级
24 1 EX0=1; //外部中断0开放
25 1 ES=1; //串口中断开放
26 1 EA=1; //开放全局中断
27 1 flag_init=0x00;
28 1 P3_4=0; //点亮指示灯
29 1 while(1)
30 1 {
31 2 if(rcv_flag)
32 2 {
33 3 rcv_flag=0;
34 3 BCAN_DATA_RECEIVE(rcv_data); //接收数据
35 3 BCAN_CMD_PRG(0x04); //释放接收缓冲区
36 3 ES=0; //串口中断禁止
37 3 for(j=2;j<10;j++) //发送8组数据到串口
38 3 {
39 4 SBUF=rcv_data[j];
40 4 while(TI==0)
41 4 {}
42 4 TI=0;
43 4 }
44 3 ES=1; //串口中断开放
45 3 LED=~LED; //指示灯
46 3 }
47 2 if(send_flag)
48 2 {
49 3 send_flag=0;
50 3 send_data[0]=0xA8;
51 3 send_data[1]=0x08; //报文ID:540
52 3 BCAN_DATA_WRITE(send_data); //写入数据到缓冲区函数
53 3 BCAN_CMD_PRG(0x01); //调用发送请求
54 3 LED=~LED; //指示灯
55 3 }
C51 COMPILER V6.12 RS232_BASICCAN 12/11/2007 21:38:45 PAGE 2
56 2 if(err_flag) //总线错误处理
57 2 {
58 3 err_flag=0;
59 3 Sja_1000_Init();
60 3 }
61 2 }
62 1 }
63 //******************************外部中断0*******************//
64 void ex0_int(void) interrupt 0 using 1
65 {
66 1 SJA_BCANAdr=REG_INTERRUPT;
67 1 flag_init=*SJA_BCANAdr;
68 1 }
69 //******************************T1初始化********************//
70 void T1_int(void)
71 {
72 1 TMOD=0x20; //定时器1设为方式2
73 1 TL1=0xFD; //定时器初值
74 1 TH1=0xFD;
75 1 SCON=0x50; //串口设为方式1,REN=1允许接收
76 1 TR1=1; //启动定时器1
77 1 }
78 void UART_int(void) interrupt 4 using 3/*串口中断接受数据*/
79 {
80 1 send_data[k]=SBUF; //写串口数据到发送数组
81 1 RI=0; //接收中断清零
82 1 k++; //
83 1 if(k==10) //接收到8组数据
84 1 {k=2; //
85 2 send_flag=1; //置位发送标志
86 2 }
87 1
88 1
89 1 }
90
91 //******************************SJA1000初始化********************//
92 void Sja_1000_Init(void)
93 { BCAN_ENTER_RETMODEL(); //进入复位
94 1 BCAN_SET_BANDRATE(0x0b); //设置波特率800K/S
95 1 BCAN_SET_OBJECT(0xaa,0x00); //设置地址ID:550
96 1 BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出
97 1 BCAN_QUIT_RETMODEL(); //退出复位模式
98 1 SJA_BCANAdr=REG_CONTROL; //地址指针指向控制寄存器
99 1 *SJA_BCANAdr|=0x1e; //开放错误\接收\发送中断
100 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 659 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 5
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?