📄 main.lst
字号:
C51 COMPILER V8.08 MAIN 12/25/2007 19:05:01 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include "reg52.h"
3 #include "can.h"
4
5
6 #define MainID (0xaa) //主节点
7 #define SID1 (0xbb) //从节点1
8 #define SID2 (0xcc) //从节点2
9 #define SID3 (0xdd) //从节点3
10 #define SID4 (0xee) //从节点4
11
12 //数据 发送缓存区
13 tByte SendData[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
14 tByte RecvData[11]; //数据接收
15
16
17 void T0_Iint(void);
18 void Task_Init(void);
19 void Clear_All_Task(void);
20 tByte Get_Slave_Ack(tByte const Slave_ID);
21 //主节点发送时钟节拍给从节点
22 tByte Send_Tick_To_Slave(void);
23
24 static tByte CanBusCnt;
25
26 static bit CanSendSid1Task;
27 static bit CanSendSid2Task;
28 static bit CanSendSid3Task;
29 static bit CanSendSid4Task;
30 static bit CanRecvTask;
31
32 void main(void)
33 {
34 1
35 1 SJAInit(MainID); //SJA初始化
36 1 T0_Iint(); //T0定时器初始化
37 1 Task_Init(); //任务初始化
38 1 while(1)
39 1 {
40 2 // while(!(Send_Tick_To_Slave()))
41 2 // {
42 2 // CanBusCnt = 0; //任何一个节点时钟同步不成功,网络重新同步
43 2 // }
44 2 Send_Tick_To_Slave();
45 2
46 2 if(CanRecvTask)
47 2 {
48 3 //接收报头三个数据,即数据首地址,MainID和SID1
49 3 SJARecvData(RecvData,11);
50 3 }
51 2 }
52 1 }
53
54
55 void Task_Init(void) //任务初始化
C51 COMPILER V8.08 MAIN 12/25/2007 19:05:01 PAGE 2
56 {
57 1 CanSendSid1Task = 1;
58 1 CanSendSid2Task = 0;
59 1 CanSendSid3Task = 0;
60 1 CanSendSid4Task = 0;
61 1 CanRecvTask = 0;
62 1 }
63
64 void Clear_All_Task(void) //清除所有任务
65 {
66 1 CanSendSid1Task = 0;
67 1 CanSendSid2Task = 0;
68 1 CanSendSid3Task = 0;
69 1 CanSendSid4Task = 0;
70 1 CanRecvTask = 0;
71 1 }
72 void T0_Iint(void)
73 {
74 1 TMOD |= 0x01;
75 1 TH0 = (65535-10000)/256; //12M晶振10ms
76 1 TL0 = (65535-10000)%256;
77 1
78 1 ET0 = 1;
79 1 TR0 = 1;
80 1 EA = 1;
81 1 }
82
83 void T0_ISR(void) interrupt 1 using 1
84 {
85 1
86 1 TH0 = (65535-10000)/256;
87 1 TL0 = (65535-10000)%256;
88 1
89 1 Clear_All_Task(); //清除所有任务
90 1 CanBusCnt++; //发送与接收每10ms轮流一次
91 1 if(CanBusCnt==5)
92 1 {
93 2 CanBusCnt = 0;
94 2 }
95 1 switch(CanBusCnt)
96 1 {
97 2 case 0: CanSendSid1Task = 1;break;
98 2 case 1: CanSendSid2Task = 1;break;
99 2 case 2: CanSendSid3Task = 1;break;
100 2 case 3: CanSendSid4Task = 1;break;
101 2 case 4: CanRecvTask = 1;break;
102 2 default:break;
103 2 }
104 1 }
105
106 //主节点发送时钟节拍给从节点
107 tByte Send_Tick_To_Slave(void)
108 {
109 1 if(CanSendSid1Task)
110 1 {
111 2 //发送接收帧为0x08,发送目的地址为SID1
112 2 while(SJASendData(SendData,8,SID1,0xff,0x08));
113 2 if(Get_Slave_Ack(SID1))
114 2 {
115 3 return 1; //握手不成功返回错误代号1
116 3 }
117 2 CanSendSid1Task = 0; //发送完成清除任务
C51 COMPILER V8.08 MAIN 12/25/2007 19:05:01 PAGE 3
118 2
119 2 }
120 1
121 1 if(CanSendSid2Task)
122 1 {
123 2 //发送接收帧为0x08,发送目的地址为SID2
124 2 while(SJASendData(SendData,8,SID2,0xff,0x08));
125 2 if(Get_Slave_Ack(SID2))
126 2 {
127 3 return 2; //握手不成功返回错误代号2
128 3 }
129 2 CanSendSid2Task = 0; //发送完成清除任务
130 2 }
131 1
132 1 if(CanSendSid3Task)
133 1 {
134 2 //发送接收帧为0x08,发送目的地址为SID3
135 2 while(SJASendData(SendData,8,SID3,0xff,0x08));
136 2 if(Get_Slave_Ack(SID3))
137 2 {
138 3 return 3; //握手不成功返回错误代号3
139 3 }
140 2 CanSendSid3Task = 0; //发送完成清除任务
141 2 }
142 1
143 1 if(CanSendSid4Task)
144 1 {
145 2 //发送接收帧为0x08,发送目的地址为SID4
146 2 while(SJASendData(SendData,8,SID4,0xff,0x08));
147 2 if(Get_Slave_Ack(SID4))
148 2 {
149 3 return 4; //握手不成功返回错误代号4
150 3 }
151 2 CanSendSid4Task = 0; //发送完成清除任务
152 2 }
153 1
154 1 return 0; //时钟同步成功
155 1 }
156
157
158 //获取从节点握手信号
159 tByte Get_Slave_Ack(tByte const Slave_ID)
160 {
161 1 SJARecvData(RecvData,4);
162 1 if(Slave_ID == RecvData[3]) //握手信号为从机ID
163 1 {
164 2 return 0; //握手成功
165 2 }
166 1 else
167 1 {
168 2 return 1; //握手失败
169 2 }
170 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 339 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 1
IDATA SIZE = ---- ----
C51 COMPILER V8.08 MAIN 12/25/2007 19:05:01 PAGE 4
BIT SIZE = 5 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -