?? can_self.lst
字號:
C51 COMPILER V8.02 CAN_SELF 12/04/2008 19:20:05 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE CAN_SELF
OBJECT MODULE PLACED IN can_self.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE can_self.c BROWSE DEBUG OBJECTEXTEND
line 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
15 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
16 //【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! &
17 //【聲明】 作者: PIAE小組 &
18
19 #include <reg52.h>
20 #include <intrins.h>
21 #include <can_selfdef.h>
22 #define uchar unsigned char
23
24
25 bit receive; //接收標志
26
27
28 uchar i,buffer[8];//串口緩沖區
29 uchar sbuffer;
30
31 uchar cmd_numb ;//發送緩沖區填充完成標志
32 uchar data TX_buffer[ N_can ] ;
33
34 void led_seg7(uchar ,uchar ) ;
35
36
37 /********************************系統初始化函數************************/
38
39 void initial(void)
40 { uchar j;
41 1 SCON=0x50; //串口工作方式1,允許接收
42 1 PCON=0x80; //波特率翻倍
43 1 TCON=0;
44 1 TMOD=0x26; //T1用于串口波特率控制
45 1 TL1=0xfa; //初始化T1,波特率為9600(晶振11.0592M)
46 1 TH1=0xfa;
47 1 TR1=1; //開定時器
48 1
49 1 ES=1; //開串口中斷
50 1
51 1 receive = 0; //接收標志清零
52 1
53 1 cmd_numb = 0; //接受計數器清零
54 1 // P1 = 0xb0; //RS485允許接收
55 1 for(j=0; j<8; j++) //串口緩沖區清空
C51 COMPILER V8.02 CAN_SELF 12/04/2008 19:20:05 PAGE 2
56 1 buffer[j] = 0xff; //table[18]為空顯示
57 1
58 1 // cash[0] = 15;
59 1 //CPU初始化
60 1 SJA_RST = 1;//CAN總線復位管腳,復位無效
61 1 SJA_CS = 0;//CAN總線片選有效
62 1
63 1 IT1 = 0;//CAN總線低電平接收中斷
64 1 // IT0 = 1;//外部中斷0負邊沿觸發
65 1 // EX0 = 1;//打開外部中斷0
66 1 EX1 = 1; // 打開外部中斷1
67 1 EA = 1; //打開總中斷
68 1
69 1
70 1 SJA_CS = 1;//CAN總線片選無效,使對數據總線的操作不會影響SJA1000。
71 1 //CPU初始化
72 1 //初始化標示碼頭信息
73 1
74 1 TX_buffer[0] = 0x88;//.7=0擴展幀;.6=0數據幀; .3=1數據長度
75 1 TX_buffer[1] = 0x01;//本節點地址
76 1 TX_buffer[2] = 0x02;//
77 1 TX_buffer[3] = 0x03;//
78 1 TX_buffer[4] = 0x00;//
79 1 //初始化標示碼頭信息
80 1
81 1 //初始化發送數據單元
82 1 TX_buffer[5] = 0xff;
83 1 TX_buffer[6] = 0x22;
84 1 TX_buffer[7] = 0x33;
85 1 TX_buffer[8] = 0x44;//
86 1 TX_buffer[9] = 0x55;//
87 1 TX_buffer[10] = 0x66;//
88 1 TX_buffer[11] = 0x77;//
89 1 TX_buffer[12] = 0x88;//
90 1 //初始化數據信息
91 1 }
92
93
94
95
96 /*****************************串口中斷響應處理函數***********************/
97
98 void serial(void) interrupt 4
99 { uchar k;
100 1 if(RI)//為接收中斷
101 1 {
102 2 RI=0; //清接收中斷標志
103 2 LED_RED= ~LED_RED; //閃串口指示LED
104 2 sbuffer = SBUF; //讀取串口緩沖區數據
105 2
106 2 if((sbuffer == 's') && (receive == 0)) //判斷是否為數據頭 ,是數據頭則準備接收
107 2 {
108 3 receive = 1; //開始接收標志
109 3 cmd_numb = 0; //清接收計數器
110 3 TXD_flag = 0; //清接收完成標志
111 3 }
112 2 else if(sbuffer == 'e') //判斷數據尾
113 2 {
114 3 if(cmd_numb<8)//接收到的字符少于8個
115 3 for(k=cmd_numb;k<8;k++)//則空位填空顯示
116 3 buffer[k] = 0;
117 3 TXD_flag = 1; //置接收完成標志
C51 COMPILER V8.02 CAN_SELF 12/04/2008 19:20:05 PAGE 3
118 3 receive =0; //清接收標志
119 3 }
120 2 else if(receive){ //判斷當前是否處于接收狀態
121 3
122 3 buffer[cmd_numb++] = sbuffer; //當前字符送緩沖區
123 3 Txd_data=cmd_numb ;
124 3
125 3 }
126 2 else //無效命令則返回
127 2 return;
128 2 }
129 1 }
130
131
132 void CAN_RXD( void ) interrupt 2 //接收數據函數,在中斷服務程序中調用
133 {
134 1
135 1 uchar data Judge;
136 1 EA = 0; //關CPU中斷
137 1 // IE0 = 0; //禁止INT0
138 1
139 1 Judge = IR;
140 1 if( Judge & 0x01) //IR.0 = 1 接收中斷
141 1 {
142 2 RX_buffer[0] = RBSR;
143 2 RX_buffer[1] = RBSR1;
144 2 RX_buffer[2] = RBSR2;
145 2 RX_buffer[3] = RBSR3;
146 2 RX_buffer[4] = RBSR4;
147 2 RX_buffer[5] = RBSR5;
148 2 RX_buffer[6] = RBSR6;
149 2 RX_buffer[7] = RBSR7;
150 2 RX_buffer[8] = RBSR8;
151 2 RX_buffer[9] = RBSR9;
152 2 RX_buffer[10] = RBSR10;
153 2 RX_buffer[11] = RBSR11;
154 2 RX_buffer[12] = RBSR12;
155 2 RXD_flag = 1;//置有接收標志
156 2 CMR = 0X04; //釋放接收緩沖區
157 2 Judge = ALC;//釋放仲裁隨時捕捉寄存器
158 2 Judge = ECC;//釋放錯誤代碼捕捉寄存器
159 2 }
160 1 IER = 0x01;// .0=1--接收中斷使能;
161 1 EA = 1;//打開CPU中斷
162 1 }
163
164 void main(void)
165 {
166 1
167 1 initial( );//串口初始化
168 1 CAN_init( ); //SJA1000初始化,對 SJA1000寄存器的讀寫是采用外部寄存器尋址方式,所以不需要程序單獨控制
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -