📄 can
字号:
C51 COMPILER V8.02 CAN_SHOW 04/21/2009 13:52:57 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE CAN_SHOW
OBJECT MODULE PLACED IN can_show.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE can_show.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include <reg52.h>
3 #include <intrins.h>
4 #include <can_showdef.h>
5
6 void CAN_RXD( void ) interrupt 2
7 {//接收数据函数,在中断服务程序中调用
8 1
9 1 uchar data Judge;
10 1 EA = 0;//关CPU中断
11 1 IE0 = 0;
12 1
13 1 Judge = IR;
14 1 if( Judge & 0x01)
15 1 {//IR.0 = 1 接收中断
16 2 RX_buffer[0] = RBSR;
17 2 RX_buffer[1] = RBSR1;
18 2 RX_buffer[2] = RBSR2;
19 2 RX_buffer[3] = RBSR3;
20 2 RX_buffer[4] = RBSR4;
21 2 RX_buffer[5] = RBSR5;
22 2 RX_buffer[6] = RBSR6;
23 2 RX_buffer[7] = RBSR7;
24 2 RX_buffer[8] = RBSR8;
25 2 RX_buffer[9] = RBSR9;
26 2 RX_buffer[10] = RBSR10;
27 2 RX_buffer[11] = RBSR11;
28 2 RX_buffer[12] = RBSR12;
29 2 RXD_flag = 1;//置有接收标志
30 2 CMR = 0X04;
31 2 Judge = ALC;//释放仲裁随时捕捉寄存器
32 2 Judge = ECC;//释放错误代码捕捉寄存器
33 2 }
34 1 IER = 0x01;// .0=1--接收中断使能;
35 1 EA = 1;//打开CPU中断
36 1 }
37
38 //////// 接收处理程序//////////////
39 void Rxd_deal(void)
40 {
41 1 if( RXD_flag )
42 1 {
43 2 EA = 0;//关闭CPU中断
44 2 RXD_flag = 0;
45 2 if(RX_buffer[0]==0xc8)
46 2 Txd = 4;
47 2 CAN_TXD();
48 2 EA = 1;
49 2 }
50 1 }
51
52
53 //发送处理函数,主要是准备数据,并且调用发送函数
54 void Txd_deal(void)
55 {
C51 COMPILER V8.02 CAN_SHOW 04/21/2009 13:52:57 PAGE 2
56 1 CAN_TXD();
57 1 _nop_();
58 1 _nop_();
59 1 }
60
61
62
63 void CAN_TXD( void )
64 {
65 1 uchar data Judge;
66 1 uchar data TX_buffer[ N_can ] ;
67 1
68 1 //初始化标示码头信息
69 1 TX_buffer[0] = 0x88;//.7=0扩展帧;.6=0数据帧; .3=1数据长度
70 1 TX_buffer[1] = 0x01;//本节点地址
71 1 TX_buffer[2] = 0x02;//
72 1 TX_buffer[3] = 0x03;//
73 1 TX_buffer[4] = 0x00;//
74 1 //初始化标示码头信息
75 1
76 1 //初始化发送数据单元
77 1 TX_buffer[5] = Txd;
78 1 TX_buffer[6] = 0x22;
79 1 TX_buffer[7] = 0x33;
80 1 TX_buffer[8] = 0x44;//
81 1 TX_buffer[9] = 0x55;//
82 1 TX_buffer[10] = 0x66;//
83 1 TX_buffer[11] = 0x77;//
84 1 TX_buffer[12] = 0x88;//
85 1
86 1
87 1 //初始化数据信息
88 1 EA = 0; //关中断
89 1 do
90 1 {
91 2 Judge = SR;
92 2 LED_RED = 0;//
93 2 }
94 1 while( Judge & 0x10 ); //SR.4=1 正在接收,等待
95 1
96 1 do
97 1 {
98 2 Judge = SR;
99 2 LED_RED = 0;//
100 2 }
101 1 while(!(Judge & 0x08)); //SR.3=0,发送请求未处理完,等待
102 1
103 1 do
104 1 {
105 2 Judge = SR;
106 2 LED_RED = 0;//
107 2 }
108 1 while(!(Judge & 0x04)); //SR.2=0,发送缓冲器被锁。等待
109 1
110 1 LED_RED = !LED_RED;
111 1 LED_GRE = !LED_GRE;//灯闪烁
112 1
113 1 TBSR = TX_buffer[0];
114 1 TBSR1 = TX_buffer[1];
115 1 TBSR2 = TX_buffer[2];
116 1 TBSR3 = TX_buffer[3];
117 1 TBSR4 = TX_buffer[4];
C51 COMPILER V8.02 CAN_SHOW 04/21/2009 13:52:57 PAGE 3
118 1 TBSR5 = TX_buffer[5];
119 1 TBSR6 = TX_buffer[6];
120 1 TBSR7 = TX_buffer[7];
121 1 TBSR8 = TX_buffer[8];
122 1 TBSR9 = TX_buffer[9];
123 1 TBSR10 = TX_buffer[10];
124 1 TBSR11 = TX_buffer[11];
125 1 TBSR12 = TX_buffer[12];
126 1
127 1 CMR = 0x01;//置位发送请求
128 1 EA = 1;
129 1
130 1 }
131
132 void main(void)
133 {
134 1 //CPU初始化
135 1 SJA_RST = 1;//CAN总线复位管脚
136 1 SJA_CS = 0;//CAN总线片选有效
137 1 EX1 = 1;
138 1 IT1 = 0;//CAN总线接收中断
139 1 IT0 = 1;//外部中断0负边沿触发
140 1 EX0 = 1;//打开外部中断0
141 1 EA = 1; //打开总中断
142 1 SJA_CS = 1;//CAN总线片选无效,保证数据线上的变化不会影响SJA1000
143 1 //CPU初始化
144 1
145 1 CAN_init( ); //SJA1000初始化,对 SJA1000寄存器的读写是采用外部寄存器寻址方式,所以不需要程序单独控制
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -