?? main.lst
字號:
1: /**********************************************************************************************************************************/
2: /*
3: Name : check.c
4: Editor : wangguiquan
5: Latest edit time : 2006.07.13
6: Notice : No.1
7: Function: :CAN通信自檢程序
8: CAN_Ini() :CAN初始化程序
9: CAN_Receive() :CAN接收子程序
10: CAN_Send() :CAN發送子程序
11: */
12: /**********************************************************************************************************************************/
13: //#include "pic18.h"
14: #include "pic18fxx8x.h"
15: #define right 0x01
16: #define back 0x02
17: /**********************************************************************************************************************************/
18: //static volatile near unsigned char CMCON @ 0xFB4;
19: char CAN_TX_Address_H,CAN_TX_Address_L; //CAN發送郵箱標識符高低字節
20: char CAN_RX_Address_H,CAN_RX_Address_L; //CAN接收郵箱標識符高低字節
21: char CAN_FLAG;
22: //char Direction_FLAG //=1收到CAN數據;=0未收到數據
23: //char TXArray[8]={0,0,0,0,0,0,0,0};
24: //char RXArray[8]={0,0,0,0,0,0,0,0};
25: /**********************************************************************************************************************************/
26: //函數名:sysinit()
27: //功能描述:系統初始化
28: /**********************************************************************************************************************************/
29: void sysinit(void)
30: {
31: CMCON=0X07;
32: TRISC=0X0F;
33: PORTC=0XF0;
34: INTCON=0X00; //設置INTCON七位均為零:關總中斷
35: ADCON1=0X07; //設置數字量輸入、輸出口
36: PIE1=0; //PIE1的中斷禁止
37: PIE2=0; //PIE2的中斷禁止
38: PIE3=0; //PIE3的中斷禁止
39: }
40: /*****************************************************************************************************************/
41: //Function:To delay some time
42: //Parameters:None
43: /*****************************************************************************************************************/
44: void Delay(void)
45: {
46: unsigned int i;
47: for(i=6553;i>0;i--)
48: i=i;
49: }
50: /**********************************************************************************************************************************/
51: //函數名:initcan()
52: //功能描述:CAN 初始化子程序,采用標準標識符,正常工作模式
53:
54: /**********************************************************************************************************************************/
55: void initcan(void)
56: {
57: //設置發送郵箱0標識符:10011001010=0x04CA
58: CAN_TX_Address_L=0x55; //CAN低地址標識符
59: CAN_TX_Address_L=CAN_TX_Address_L&0xe0;
60: CAN_TX_Address_H=0x99; //CAN高地址標識符,應與接收方標識符相同
61:
62: //設置接收郵箱0標識符:00110011111=0x019F
63: CAN_RX_Address_L=0xE0;
64: CAN_RX_Address_L=CAN_RX_Address_L&0xE0;
65: CAN_RX_Address_H=0x33;
66:
67: //設置對CAN進行配置
68: TRISB=(TRISB|0x08)&0xFB;
69: CANCON=0x80;
70: while((CANSTAT&0x80)==0)
71: {
72: ; //等待進入CAN配置模式OPMODE=100
73: }
74:
75: //波特率設置
76: BRGCON1=0x01;
77: BRGCON2=0x90;
78: BRGCON3=0x42;
79:
80: //設置發送郵箱0和初始發送的數據
81: TXB0CON=0x03;
82: TXB0SIDL=CAN_TX_Address_L&0xe0;
83: TXB0SIDH=CAN_TX_Address_H;
84: TXB0DLC=0x08;
85: TXB0D0=0x00;
86: TXB0D1=0x01;
87: TXB0D2=0x02;
88: TXB0D3=0x03;
89: TXB0D4=0x04;
90: TXB0D5=0x05;
91: TXB0D6=0x06;
92: TXB0D7=0x07;
93:
94: //RXB0SIDL=CAN_RX_Address_L&0xe0;
95: //RXB0SIDH=CAN_RX_Address_H;
96: RXB0CON=0x20;
97: RXB0DLC=0x08;
98: RXB0D0=0x02;
99: RXB0D1=0x03;
100: RXB0D2=0x04;
101: RXB0D3=0x05;
102: RXB0D4=0x00;
103: RXB0D5=0x00;
104: RXB0D6=0x00;
105: RXB0D7=0x00;
106:
107: //初始化接收濾波器0和接收屏弊
108: RXF0SIDH=CAN_RX_Address_H;
109: RXF0SIDL=CAN_RX_Address_L&0xe0;
110: RXM0SIDH=0xFF;
111: RXM0SIDL=0xE0;
112:
113: //設置CAN工作模式
114: CANCON=0x00;
115: while((CANSTAT&0xE0)!=0)
116: {
117: ;
118: }
119:
120: //初始化CAN的中斷源,PIR3為CAN的外圍中斷標志寄存器
121: PIR3=0x00;
122: PIE3=PIE3|0x01;
123: IPR3=IPR3|0x01;
124: }
125:
126:
127:
128:
129: /******************************************************************************************************************/
130: //Function:To let motor1 back run
131: //Parameters:None
132: /******************************************************************************************************************/
133: void Motor1Run(void)
134: {
135: RC7=0;
136: RC6=1;
137: }
138: /******************************************************************************************************************/
139: //Function:To let motor1 back run
140: //Parameters:None
141: /******************************************************************************************************************/
142: void Motor1BackRun(void)
143: {
144: RC7=1;
145: RC6=0;
146: }
147: /*****************************************************************************************************************/
148: //Function:To let motor2 right run
149: //Parameters:None
150: /******************************************************************************************************************/
151: void Motor2Run(void)
152: {
153: RC5=0;
154: RC4=1;
155: }/*******************************************************************************************************************/
156: //Function:To let motor2 back run
157: //Parameters:None
158: /********************************************************************************************************************/
159: void Motor2BackRun(void)
160: {
161: RC5=1;
162: RC4=0;
163: }
164:
165:
166:
167: /******************************************************************************************************************/
168: //Function:To send right run data
169: //Parameters:None
170: /******************************************************************************************************************/
171: void Transfer1(void)
172: {
173:
174:
175: TXB0CON=TXB0CON&0xF7;
176: TXB0D0=0x01;
177: TXB0D1=0x01;
178: TXB0D2=0x01;
179: TXB0D3=0x01;
180: TXB0D4=0x01;
181: TXB0D5=0x01;
182: TXB0D6=0x01;
183: TXB0D7=0x01;
184: // if((RXB0D0=1)&&(RXB0D4=RXB0D0))
185: // MotorRun();
186: // if((RXB0D1=1)&&(RXB0D5=RXB0D1))
187: // MotorBackRun();
188: TXB0CON=TXB0CON|0x08;
189:
190: }
191: /******************************************************************************************************************/
192: //Function:To send back run data
193: //Parameters:None
194: /******************************************************************************************************************/
195: void Transfer2(void)
196: {
197:
198:
199: TXB0CON=TXB0CON&0xF7;
200: TXB0D0=0x02;
201: TXB0D1=0x02;
202: TXB0D2=0x02;
203: TXB0D3=0x02;
204: TXB0D4=0x02;
205: TXB0D5=0x02;
206: TXB0D6=0x02;
207: TXB0D7=0x02;
208: // if((RXB0D0=1)&&(RXB0D4=RXB0D0))
209: // MotorRun();
210: // if((RXB0D1=1)&&(RXB0D5=RXB0D1))
211: // MotorBackRun();
212: TXB0CON=TXB0CON|0x08;
213:
214: }
215:
216:
217:
218:
219: /********************************************************************************************************************/
220: //Function:To scan the key
221: //Parameters:None
222: /********************************************************************************************************************/
223: void KeyServe(void)
224: {
225: if((PORTC&0X0F)!=0X0F)
226: {
227: Delay();
228: if((PORTC&0X0F)!=0X0F)
229: {
230: if((PORTC&0X0F)==0X0E) //if the first key is pressed
231: Transfer1();
232: if((PORTC&0X0F)==0X0D) //if the second key is pressed
233: Transfer2();
234: if((PORTC&0X0F)==0X0B) //if the third key is pressed
235: Motor2Run();
236: if((PORTC&0X0F)==0X07) //if the fourth key is pressed
237: Motor2BackRun();
238: }
239: while((PORTC&0X0F)!=0X0F)
240: {
241: ;
242: }
243: Delay();
244:
245: }
246: }
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257: /**********************************************************************************************************************************/
258: //函數名:interrupt HI_iISR()
259: //功能描述:高優先級中斷子程序:BXB0接收郵箱0接收中斷子程序
260: /**********************************************************************************************************************************/
261: void interrupt HI_ISR(void)
262: {
263: if(RXB0IF=1);
264: {
265: CAN_FLAG=1;
266: if(RXB0D0==1)
267: Motor1Run();
268: if(RXB0D0==2)
269: Motor1BackRun();
270: RXB0IF=0;
271: RXB0FUL=0;
272: }
273: }
274:
275:
276:
277:
278:
279:
280: //主程序
281: main()
282: {
283: sysinit();
284: initcan();
285: IPEN=1;
286: INTCON=INTCON|0xc0;
287: TXB0REQ=0;
288: Motor2Run();
289: while(1)
290: {
291: KeyServe();
292: }
293: }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -