?? can_self.lst
字號(hào):
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:29:09 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE CAN_SELF
OBJECT MODULE PLACED IN .\can_self.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\can_self.c DEBUG OBJECTEXTEND
stmt level source
1 /**************************************************************************************
2 項(xiàng) 目:基于CAN總線的收發(fā)通信(節(jié)點(diǎn)2)
3 說 明:主程序部分
4 功 能:CAN總線上掛接兩個(gè)節(jié)點(diǎn),當(dāng)其中一個(gè)節(jié)點(diǎn)(節(jié)點(diǎn)1)的按鍵按下時(shí),除了自身的數(shù)碼管1、2
5 顯示加一,還向節(jié)點(diǎn)2發(fā)送一個(gè)遠(yuǎn)程幀;節(jié)點(diǎn)2接收到遠(yuǎn)程幀后想總線發(fā)送一個(gè)數(shù)據(jù)幀,如果
6 節(jié)點(diǎn)2的按鍵被按下時(shí),除了自身的數(shù)碼管1、2顯示加一,還會(huì)向總線發(fā)送數(shù)據(jù)幀,使得節(jié)點(diǎn)
7 2的數(shù)碼管3、4顯示與其保持一致。
8 // CAN主要參數(shù): PeliCAN模式,擴(kuò)展幀EFF模式
9 // 29位標(biāo)示碼結(jié)構(gòu):
10 // 發(fā)送數(shù)據(jù)結(jié)構(gòu):計(jì)數(shù)結(jié)果,0x02,0x03,0x04,0x05,0x06,0x07,0x08
11 // 接收數(shù)據(jù)結(jié)構(gòu): 待顯示數(shù)據(jù)+其它7個(gè)字節(jié)的數(shù)據(jù)
12 // 本節(jié)點(diǎn)的接收代碼寄存器值: 0x11,0x22,0x33,0x44
13 // 本節(jié)點(diǎn)的屏蔽代碼寄存器值:0x00,0xff,0x00,0xff;可以接收節(jié)點(diǎn)1的數(shù)據(jù)
14 // 目的節(jié)點(diǎn)地址:0x55,0x22,0x33,0x44;可以被節(jié)點(diǎn)2接收
15 模 塊:can_self.c
16 作 者:特 權(quán)
17 時(shí) 間:08.6.17.
18 **************************************************************************************/
19 /***感謝PIAE工作組提供的源碼,這里特權(quán)根據(jù)自己的編程習(xí)慣做了一些修改并添加詳細(xì)注釋***/
20
21 #include <reg52.h>
22 #include <intrins.h>
23 #include "define.h"
24
25 ///////////////////////////////////////////////
26 //函數(shù):inter0_key (外部中斷INT0)
27 //說明:INT0按鍵為計(jì)數(shù)按鍵
28 // 每按下一次鍵,計(jì)數(shù)值加一
29 //入口:按鍵中斷
30 //返回:按鍵加一
31 ///////////////////////////////////////////////
32 void inter0_key(void) interrupt 0
33 {
34 1 EA = 0; //關(guān)閉中斷
35 1 Txd_data++; //計(jì)數(shù)結(jié)果增1,即待發(fā)送的數(shù)據(jù)增1
36 1 TXD_flag = 1; //發(fā)送數(shù)據(jù)標(biāo)志位置位,即重新發(fā)送數(shù)據(jù)以更新數(shù)碼管的顯示數(shù)值
37 1 EA = 1; //重新開啟中斷
38 1 }
39
40 ///////////////////////////////////////////////
41 //函數(shù):inter1_can_rxd (外部中斷INT1)
42 //說明:接收數(shù)據(jù)函數(shù),在中斷服務(wù)程序中調(diào)用
43 //入口:無
44 //返回:無
45 ///////////////////////////////////////////////
46 void inter1_can_rxd( void ) interrupt 2
47 {
48 1 uchar state;
49 1
50 1 EA = 0; //關(guān)CPU中斷
51 1 IE1 = 0; //由于是中斷INT1是電平觸發(fā)方式,所以需要軟件將INT1的中斷請(qǐng)求標(biāo)志IE0清零
52 1
53 1 state = IR; //IR為SJA1000的中斷寄存器
54 1 if( state & 0x01) //若IR.0=1--接收中斷
55 1 { //接收數(shù)據(jù)幀
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:29:09 PAGE 2
56 2 RX_buffer[0] = RBSR0;
57 2 RX_buffer[1] = RBSR1;
58 2 RX_buffer[2] = RBSR2;
59 2 RX_buffer[3] = RBSR3;
60 2 RX_buffer[4] = RBSR4;
61 2 RX_buffer[5] = RBSR5;
62 2 RX_buffer[6] = RBSR6;
63 2 RX_buffer[7] = RBSR7;
64 2 RX_buffer[8] = RBSR8;
65 2 RX_buffer[9] = RBSR9;
66 2 RX_buffer[10] = RBSR10;
67 2 RX_buffer[11] = RBSR11;
68 2 RX_buffer[12] = RBSR12;
69 2 RXD_flag = 1; //接收標(biāo)志置位,以便進(jìn)入接收處理程序
70 2 CMR = 0x04; //CMR.2=1--接收完畢,釋放接收緩沖器
71 2 state = ALC; //釋放仲裁隨時(shí)捕捉寄存器(讀該寄存器即可)
72 2 state = ECC; //釋放錯(cuò)誤代碼捕捉寄存器(讀該寄存器即可)
73 2 }
74 1
75 1 IER = 0x01; // IER.0=1--接收中斷使能
76 1 EA = 1; //重新開啟CPU中斷
77 1 }
78
79 ///////////////////////////////////////////////
80 //函數(shù):main
81 //說明:主函數(shù)
82 //入口:無
83 //返回:無
84 ///////////////////////////////////////////////
85 void main(void)
86 {
87 1 init_mcu();
88 1 init_sja1000();
89 1 while(1)
90 1 {
91 2 rxd_deal(); //接收處理程序
92 2 txd_deal(); //發(fā)送處理程序
93 2 led_show(0,Txd_data); //數(shù)碼管1-2顯示發(fā)送數(shù)據(jù)子程序
94 2 led_show(1,Rxd_data); //數(shù)碼管3-4顯示接收數(shù)據(jù)子程序
95 2 }
96 1 }
97
98 ///////////////////////////////////////////////
99 //函數(shù):init_mcu
100 //說明:單片機(jī)I/O口初始化
101 // 主要是各中斷寄存器的初始化
102 //入口:無
103 //返回:無
104 ///////////////////////////////////////////////
105 void init_mcu(void)
106 {
107 1 SJA_RST = 1; //CAN總線復(fù)位管腳復(fù)位無效
108 1 SJA_CS = 0; //CAN總線片選有效
109 1 EX1 = 1; //開MCU外部中斷INT1
110 1 IT1 = 0; //MCU外部中斷INT1設(shè)置為電平觸發(fā),該中斷口連接CAN總線接收中斷口
111 1 IT0 = 1; //MCU外部中斷INT0設(shè)置為下降沿觸發(fā)
112 1 EX0 = 1; //開MCU外部中斷INT0
113 1 EA = 1; //開MCU總中斷
114 1 SJA_CS = 1; //CAN總線片選無效,使得對(duì)數(shù)據(jù)總線的操作不會(huì)影響SJA1000。
115 1 }
116
117 ///////////////////////////////////////////////
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:29:09 PAGE 3
118 //函數(shù):init_sja1000
119 //說明:獨(dú)立CAN控制器SJA1000的初始化
120 //入口:無
121 //返回:無
122 ///////////////////////////////////////////////
123 void init_sja1000(void)
124 {
125 1 uchar state;
126 1 uchar ACRR[4];
127 1 uchar AMRR[4];
128 1
129 1 // 接收代碼寄存器
130 1 ACRR[0] = 0x11;
131 1 ACRR[1] = 0x22;
132 1 ACRR[2] = 0x33;
133 1 ACRR[3] = 0x44;
134 1
135 1 // 接收屏蔽寄存器
136 1 AMRR[0] = 0x00;
137 1 AMRR[1] = 0Xff;
138 1 AMRR[2] = 0x00;
139 1 AMRR[3] = 0xff;
140 1
141 1 // 使用do--while語句確保進(jìn)入復(fù)位模式
142 1 do
143 1 {
144 2 MODR = 0x09; // 設(shè)置MOD.0=1--進(jìn)入復(fù)位模式,以便設(shè)置相應(yīng)的寄存器
145 2 state = MODR;
146 2 }
147 1 while( !(state & 0x01) );
148 1
149 1 // 對(duì)SJA1000部分寄存器進(jìn)行初始化設(shè)置
150 1 CDR = 0x88; // CDR為時(shí)鐘分頻器,CDR.3=1--時(shí)鐘關(guān)閉, CDR.7=0---basic CAN, CDR.7=1---Peli CAN
151 1 BTR0 = 0x31; // 總線定時(shí)寄存器0 ;總線波特率設(shè)定
152 1 BTR1 = 0x1c; // 總線定時(shí)寄存器1 ;總線波特率設(shè)定
153 1 IER = 0x01; // IER.0=1--接收中斷使能; IER.1=0--關(guān)閉發(fā)送中斷使能
154 1 OCR = 0xaa; // 配置輸出控制寄存器
155 1 CMR = 0x04; // 釋放接收緩沖器
156 1
157 1 // 初始化接收代碼寄存器
158 1 ACR0 = ACRR[0];
159 1 ACR1 = ACRR[1];
160 1 ACR2 = ACRR[2];
161 1 ACR3 = ACRR[3];
162 1
163 1 // 初始化接收屏蔽寄存器
164 1 AMR0 = AMRR[0];
165 1 AMR1 = AMRR[1];
166 1 AMR2 = AMRR[2];
167 1 AMR3 = AMRR[3];
168 1
169 1 // 使用do--while語句確保退出復(fù)位模式
170 1 do
171 1 {
172 2 MODR = 0x08; //MOD.3=0--雙濾波器模式
173 2 state = MODR;
174 2 }
175 1 while( state & 0x01 );
176 1 }
177
178 ///////////////////////////////////////////////
179 //函數(shù):rxd_deal
C51 COMPILER V6.12 CAN_SELF 06/19/2008 15:29:09 PAGE 4
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -