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