📄 can_232show.lst
字号:
C51 COMPILER V7.06 CAN_232SHOW 12/12/2007 14:42:30 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CAN_232SHOW
OBJECT MODULE PLACED IN E:\制作和~1\总线开发\试验程序\CAN_LAB\CAN_RS~1\NODE1\CAN_232SHOW.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\制作和~1\总线开发\试验程序\CAN_LAB\CAN_RS~1\NODE1\CAN_232SHOW.C DB SB OE
stmt level source
1
2 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3 //描述:
4 // INT0按键程序+显示程序+CAN收发程序+RS232通讯 &
5 // 数码管1-2(从右至左)显示本节点计数结果,数码管3-4显示接收到的数据 &
6 // 十进制显示 &
7 // 每按一次按键,数码管1-2显示加1,CAN发送一次,RS232发送一次 &
8 // 收到RS232数据,数码管3-4显示,CAN发送一次 &
9 // 收到CAN数据,数码管3-4显示,RS232发送一次 &
10 // CAN主要参数: PeliCAN模式,扩展帧EFF模式 &
11 // 29位标示码结构: &
12 // 发送数据结构:计数结果,0x02,0x03,0x04,0x05,0x06,0x07,0x08 &
13 // 接收数据结构: 待显示数据+其它7个字节的数据 &
14 // 本节点的地址: 0x11,0x22,0x33,0x00;可以接收全部节点的数据 &
15 // 目的节点地址:0x01,0x02,0x03,0x00;可以被能接收全部节点数据的节点接收 &
16
17 //提示:如果CAN通讯不正常,会进入一个死循环,显示也不正常
18
19 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
20 //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! &
21 //【声明】 作者: PIAE小组 &
22
23 #include <reg52.h>
24 #include <intrins.h>
25 #include <can_232showdef.h>
26
27 void INT0_Counter( void ) interrupt 0 using 1
28 {//INT0按键为计数按键
29 1 EA = 0;
30 1 Show_tx_data++; //存储计数结果,并为待发送的数据
31 1 TXD_Cflag = 1;//CAN总线要发送数据标志位
32 1 TXD_232flag = 1;//RS232要发送数据标志位
33 1 Txd_Cdata = Show_tx_data;//CAN总线要发送的数据
34 1 Txd_232data = Show_tx_data;//232要发送的数据
35 1 EA = 1;
36 1 }
37
38 void CAN_RXD( void ) interrupt 2
39 {//接收数据函数,在中断服务程序中调用
40 1
41 1 uchar data Judge;
42 1 EA = 0;//关CPU中断
43 1 IE0 = 0;
44 1
45 1 Judge = IR;
46 1 if( Judge & 0x01)
47 1 {//IR.0 = 1 接收中断
48 2 RX_buffer[0] = RBSR;
49 2 RX_buffer[1] = RBSR1;
50 2 RX_buffer[2] = RBSR2;
51 2 RX_buffer[3] = RBSR3;
52 2 RX_buffer[4] = RBSR4;
53 2 RX_buffer[5] = RBSR5;
54 2 RX_buffer[6] = RBSR6;
55 2 RX_buffer[7] = RBSR7;
C51 COMPILER V7.06 CAN_232SHOW 12/12/2007 14:42:30 PAGE 2
56 2 RX_buffer[8] = RBSR8;
57 2 RX_buffer[9] = RBSR9;
58 2 RX_buffer[10] = RBSR10;
59 2 RX_buffer[11] = RBSR11;
60 2 RX_buffer[12] = RBSR12;
61 2 RXD_Cflag = 1;//置有接收标志
62 2 CMR = 0X04;
63 2 Judge = ALC;//释放仲裁随时捕捉寄存器
64 2 Judge = ECC;//释放错误代码捕捉寄存器
65 2 }
66 1 IER = 0x01;// .0=1--接收中断使能;
67 1 EA = 1;//打开CPU中断
68 1 }
69
70 void RS232_RXD( void ) interrupt 4 using 1
71 {//接收数据函数,在中断服务程序中调用
72 1 EA = 0;//关闭所有中断
73 1 ES = 0;//关闭串口
74 1 if(RI==1)
75 1 {
76 2 RI = 0;
77 2 Rxd_232data = SBUF;
78 2 RXD_232flag = 1;//置接收到数据标志
79 2 }
80 1 _nop_();
81 1 ES = 1;//打开串口
82 1 EA = 1;//打开中断
83 1 }
84
85 void main(void)
86 {
87 1 //CPU初始化
88 1 SJA_RST = 1;//CAN总线复位管脚
89 1 SJA_CS = 0;//CAN总线片选有效
90 1
91 1 SCON = 0x50; //串口方式1
92 1 PCON = 0x80; //串口波特率加速
93 1 TMOD = 0x21;
94 1 TH1=0xFD; //19200bps
95 1 TL1=0xFD;
96 1 TR1 = 1;
97 1 TI = 0;
98 1 RI = 0;
99 1 ES = 1;//打开串口中断
100 1
101 1 EX1 = 1;
102 1 IT1 = 0;//CAN总线接收中断
103 1 IT0 = 1;//外部中断0负边沿触发
104 1 EX0 = 1;//打开外部中断0
105 1 EA = 1; //打开总中断
106 1 SJA_CS = 1;//CAN总线片选无效
107 1 //CPU初始化
108 1
109 1 CAN_init( ); //SJA1000初始化
110 1 _nop_();
111 1 _nop_();
112 1 while(1)
113 1 {
114 2 _nop_();
115 2 _nop_();
116 2 Rxd_deal();//接收处理程序
117 2 Txd_deal();//发送处理程序
C51 COMPILER V7.06 CAN_232SHOW 12/12/2007 14:42:30 PAGE 3
118 2 led_seg7(1,Show_tx_data);
119 2 led_seg7(3,Show_rx_data);
120 2
121 2 }
122 1
123 1 }
124
125
126 //*********************处理函数********************************
127
128
129 void Rxd_deal(void)
130 {//////// 接收处理程序//////////////
131 1 //uchar data Order;
132 1 if( RXD_Cflag )
133 1 {//如果CAN总线收到数据,数码管3-4显示,RS232将收到的数据发送给PC机
134 2 EA = 0;//关闭CPU中断
135 2 RXD_Cflag = 0;
136 2 Rxd_Cdata = RX_buffer[5];
137 2 Show_rx_data = Rxd_Cdata;//
138 2 TXD_232flag = 1;
139 2 Txd_232data = Rxd_Cdata;//给要232发送的数据赋值
140 2 EA = 1;//打开CPU中断
141 2 }
142 1
143 1 if( RXD_232flag )
144 1 {//如果RS232总线收到数据,数码管3-4显示,CAN总线将收到的数据发送出去
145 2 EA = 0;//关闭CPU中断
146 2 RXD_232flag = 0;
147 2 Show_rx_data = Rxd_232data;//
148 2 TXD_Cflag = 1;
149 2 Txd_Cdata = Rxd_232data;//给要can发送的数据赋值
150 2 EA = 1;//打开CPU中断
151 2 }
152 1 }//////// 接收处理程序//////////////
153
154 void Txd_deal(void)
155 {//发送处理函数,主要是准备数据,并且调用发送函数
156 1 if( TXD_Cflag == 1 )
157 1 {
158 2 EA = 0;//关闭CPU中断
159 2 _nop_();
160 2 TXD_Cflag = 0;
161 2 TX_buffer[5] = Txd_Cdata;//
162 2 CAN_TXD();
163 2 _nop_();
164 2 EA = 1;//打开CPU中断
165 2 }
166 1 if( TXD_232flag == 1 )
167 1 {
168 2 EA = 0;//关闭CPU中断
169 2 TXD_232flag = 0;
170 2 RS232_TXD();
171 2 EA = 1;//打开CPU中断
172 2 }
173 1 }
174
175 //*********************处理函数********************************
176
177
178 //*********************CAN子函数***********************
179
C51 COMPILER V7.06 CAN_232SHOW 12/12/2007 14:42:30 PAGE 4
180 void CAN_init( void )
181 {//SJA1000 的初始化
182 1 uchar bdata Judge;
183 1 uchar ACRR[4];
184 1 uchar AMRR[4];
185 1 ACRR[0] = 0x11;
186 1 ACRR[1] = 0x22;
187 1 ACRR[2] = 0x33;
188 1 ACRR[3] = 0x44;//接收代码寄存器?
189 1 AMRR[0] = 0xff;
190 1 AMRR[1] = 0Xff;
191 1 AMRR[2] = 0xff;
192 1 AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主机发送的信息
193 1 do
194 1 {// .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
195 2 //防止未进入复位模式,重复写入
196 2 MODR = 0x09;
197 2 Judge = MODR ;
198 2 }
199 1 while( !(Judge & 0x01) );
200 1 CDR = 0x88;// CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN
201 1 BTR0 = 0x31;
202 1 BTR1 = 0x1c;//总线波特率设定
203 1 IER = 0x01;// .0=1--接收中断使能; .1=0--关闭发送中断使能
204 1 OCR = 0xaa;// 配置输出控制寄存器
205 1 CMR = 0x04;//释放接收缓冲器
206 1
207 1
208 1
209 1 ACR = ACRR[0];
210 1 ACR1 = ACRR[1];
211 1 ACR2 = ACRR[2];
212 1 ACR3 = ACRR[3];//初始化标示码
213 1
214 1 AMR = AMRR[0];
215 1 AMR1 = AMRR[1];
216 1 AMR2 = AMRR[2];
217 1 AMR3 = AMRR[3];//初始化掩码
218 1 do
219 1 {//确保退出复位模式
220 2 MODR = 0x08;
221 2 Judge = MODR ;
222 2 }
223 1 while( Judge & 0x01 );
224 1
225 1
226 1 }//SJA1000 的初始化
227
228
229 void CAN_TXD( void )
230 {
231 1 uchar data Judge;
232 1 uchar data TX_buffer[ N_can ] ;
233 1
234 1 //初始化标示码头信息
235 1 TX_buffer[0] = 0x88;//.7=0扩展帧;.6=0数据帧; .3=1数据长度
236 1 TX_buffer[1] = 0x01;//本节点地址
237 1 TX_buffer[2] = 0x02;//
238 1 TX_buffer[3] = 0x03;//
239 1 TX_buffer[4] = 0x00;//
240 1 //初始化标示码头信息
241 1
C51 COMPILER V7.06 CAN_232SHOW 12/12/2007 14:42:30 PAGE 5
242 1 //初始化发送数据单元
243 1 TX_buffer[5] = Txd_Cdata;
244 1 TX_buffer[6] = 0x22;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -