📄 main.lst
字号:
C51 COMPILER V6.12 MAIN 10/12/2008 16:28:16 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include"reg52.h"
2 #include "display.h"
3 #include"lin_send.h"
4 #include "lin_send.c"
5
6 /* Private typedef -----------------------------------------------------------*/
7 typedef enum //LIN主节点状态
8 {
9 Idle, //初始态
10 SendBreak, //发送同步间隔态
11 VerifBreak, //等待同步间隔发送完没有
12 SendSynch, //发送同步场态
13 VerifSynch, //等待同步场发送完没有
14 SendPID, //发送ID场态
15 SendData, //发送数据态
16 } LIN_MASTER_state;
*** ERROR C141 IN LINE 16 OF .\MAIN.C: syntax error near '}', expected '<id>'
17
18 typedef enum //LIN主节点接收状态
19 {
20 Init, //初始态
21 WaitDate,// 等待数据态
22 Date_display //接收数据显示
23 } LIN_SLAVE_state;
24
25 #define uchar unsigned char
26 #define uint unsigned int
27
28 char idata lindata[3][8]={{0x5A,0x3B,0x29,0x23,0x1E,0x3A,0x4B,0x2F},
29 {0x12,0x23,0x34,0x45,0x56,0x1A,0x4E,0x3F},
30 {0x38,0x40,0x19,0x53,0x32,0x5C,0x28,0x1E}};//要发送的三组数据
31 l_u8 Data[] = {0x00,0x00,0x00,0xff,0x7f,0xff,0xff,0xff};
32 l_u8 i = 0; /* Data Number that MASTER send */
33 l_u8 j = 0; /* Data Number that SLAVE receive */
34 l_u8 n = 0;
35 //u8 PID = 0x1E; /* PID of this frame */
36 l_u8 SPID = 0xF0; //发送数据ID场
37 l_u8 RPID=0x32; //接收数据ID场
38 l_u8 data_PID;
39 l_u8 bus_state=0;
40 // l_u8 temp;
41 l_u8 receive_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
42
43
44
45 LIN_MASTER_state LIN_MASTER = Idle; //LIN总线发送报文状态初始化
46 LIN_SLAVE_state LIN_SLAVE = Init; //LIN总线接收初始化
47
48 l_u8 count=0;
49 l_u8 bus_cnt=0;
50
51 /***********************************************************
52 * ***
53 *本程序主要实现的功能是循环发送3组数据并交替发送2个报文 ***
54 * ***
C51 COMPILER V6.12 MAIN 10/12/2008 16:28:16 PAGE 2
55 ***********************************************************
56 */
57
58 main()
59 {
60 1
61 1 l_sys_init(); //51单片机初系统始化 ,包括波特率设置 串口输入输出设置 TJA1020模式设置
62 1 while (1)
63 1 { //LIN总线的一个报文由同步间隔场 同步场 ID场 数据场 奇偶校验位 组成
64 2 switch (LIN_MASTER)
65 2 {
66 3 case Idle:
67 3 delay(0xFFFF); //延时一段时间开始发报文
68 3 LIN_MASTER = SendBreak;
69 3 break;
70 3
71 3 case SendBreak:
72 3 l_send_break(); //发送同步间隔场
73 3 LIN_MASTER = VerifBreak;
74 3 break;
75 3
76 3 case VerifBreak:
77 3 if (BreakReceived) //发送同步间隔场完后进入 发送同步场状态
78 3 {
79 4 BreakReceived = 0;
80 4 LIN_MASTER = SendSynch;
81 4 }
82 3 break;
83 3
84 3 case SendSynch:
85 3 l_send_bytes(0x55); //发送同步场
86 3 LIN_MASTER = VerifSynch;
87 3 break;
88 3
89 3 case VerifSynch:
90 3 if (USART_DataReceived) //同步场发送完后进入 发送ID场状态
91 3 {
92 4 USART_DataReceived = 0;
93 4 LIN_MASTER = SendPID;//发送ID场,信息包括要发送的数据字节数和标识符,可以加ID_Table[]
94 4 }
95 3 break;
96 3 //本次实验有2个ID场,包括发送数据ID场和接收数据ID场
97 3 case SendPID:
98 3 if(bus_state==1) //bus_state==1 则发送SPID(发送数据ID场)
99 3 {
100 4 l_send_bytes(SPID);
101 4 //bus_state=0;
102 4 }
103 3 else if(bus_state==0) //bus_state==0 则发送RPID(接收数据ID场)
104 3 {
105 4 l_send_bytes(RPID);
106 4 // bus_state=1;
107 4 }
108 3 LIN_MASTER = SendData;
109 3 break;
110 3
111 3
112 3 case SendData:
113 3 if (USART_DataReceived) //ID场发送完进入 发送数据状态
114 3 {
115 4 USART_DataReceived = 0;
116 4 if(bus_state==0) //只发送报文头,
C51 COMPILER V6.12 MAIN 10/12/2008 16:28:16 PAGE 3
117 4 { bus_state=1; //如果从机接收到这个报文头 就可以发送数据给主机 从而接收数据
118 5 LIN_MASTER = Idle; //发送完报文头后又重新跳到等待发送报文头状态
119 5 }
120 4
121 4 else
122 4 {
123 5 clear_LCD(); //清屏
124 5 l_send_data(lindata[j],8);//发送8个字节的数据
*** WARNING C182 IN LINE 124 OF .\MAIN.C: pointer to different objects
125 5 j++; //循环发送3组数据 即lindata[3][8]的数据
126 5 if(j==3) j=0;
127 5 bus_state=0;
128 5 LIN_MASTER =Idle;//发送完8个字节数据后又重新跳到等待发送报文的状态
129 5 }
130 4 }
131 3 break;
132 3 }
133 2 //clear_LCD(); //清屏
134 2 /******************接收数据***********************/
135 2 switch (LIN_SLAVE) //采用串口中断来接收从机发来的数据
136 2 {
137 3 case Init:
138 3 ES=1;//开串口中断
139 3 LIN_SLAVE = WaitDate;
140 3 break;
141 3
142 3 case WaitDate: //等待接收数据
143 3 if (WaitReceived)
144 3 {
145 4 WaitReceived = 0;
146 4
147 4 receive_data[n]=DataTemp; //将从机上接收到的数据存到receive_data[n]数组里
*** ERROR C213 IN LINE 147 OF .\MAIN.C: left side of asn-op not an lvalue
148 4 n++; //连续接收8个字节数据
149 4 if(n==8)
150 4 {n=0; //接收完8个字节数据后 进入接收数据显示状态
151 5 LIN_SLAVE=Date_display;
152 5 }
153 4 else LIN_SLAVE = WaitDate; //重新等待下个数据
154 4 }
155 3 else LIN_SLAVE= Init;
156 3
157 3 break;
158 3
159 3 case Date_display:
160 3 clear_LCD();
161 3 for(n=0;n<8;n++)
162 3 { clear_LCD();
163 4 display_LCD_number(receive_data[n]);//显示接收到锝个字节的数据
164 4 display_LCD_string(" ");
165 4 }
166 3 display_LCD_string("<R>");
167 3 delay(0x6FFF); //延时显示
168 3
169 3 LIN_SLAVE= Init;//显示完后重新跳到等待接收数据状态
170 3 break;
171 3 }
172 2 }
173 1 }
C51 COMPILATION COMPLETE. 1 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -