📄 modbus.lst
字号:
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MODBUS
OBJECT MODULE PLACED IN modbus.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe modbus.c DB OE
line level source
1
2 //修正了一上电就发大批数据的错误,把void UART0_Init (void)里的TI0=1改为TI0=。
3 //-----------------------------------------------------------------------------
4 // UART1_Int1.c
5 //-----------------------------------------------------------------------------
6 // Target: C8051F02x
7 // Tool chain: KEIL C51 6.03 / KEIL EVAL C51
8 //
9
10 //-----------------------------------------------------------------------------
11 // Includes
12 //-----------------------------------------------------------------------------
13
14 #include <c8051f020.h> // SFR declarations
15 #include <stdio.h>
16 #include <string.h>
17 #include <intrins.h>
18 #include <absacc.h>
19 //-----------------------------------------------------------------------------
20 // 16-bit SFR Definitions for 'F02x
21 //-----------------------------------------------------------------------------
22
23 sfr16 DP = 0x82; // data pointer
24 sfr16 TMR3RL = 0x92; // Timer3 reload value
25 sfr16 TMR3 = 0x94; // Timer3 counter
26 sfr16 ADC0 = 0xbe; // ADC0 data
27 sfr16 ADC0GT = 0xc4; // ADC0 greater than window
28 sfr16 ADC0LT = 0xc6; // ADC0 less than window
29 sfr16 RCAP2 = 0xca; // Timer2 capture/reload
30 sfr16 T2 = 0xcc; // Timer2
31 sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
32 sfr16 T4 = 0xf4; // Timer4
33 sfr16 DAC0 = 0xd2; // DAC0 data
34 sfr16 DAC1 = 0xd5; // DAC1 data
35
36 //-----------------------------------------------------------------------------
37 // Global CONSTANTS
38 //-----------------------------------------------------------------------------
39
40 #define RX1_LENGTH 64 // 485 length of UART RX buffer
41 #define RX1_START 0X7E // 485 帖起始符
42 #define RX1_END 0X0D // 485 帖结束符
43
44 #define RX0_LENGTH 5 // command length of UART RX buffer
45 #define RX0_START 0X7E // command 帖起始符
46 #define RX0_END 0X0D // command 帖结束符
47
48 //-----------------------------------------------------------------------------
49 // Global VARIABLES
50 //-----------------------------------------------------------------------------
51
52 bit TX1_Ready; // '1' means okay to TX
53 char *TX1_ptr; // pointer to string to transmit
54
55 bit RX1_Ready; // '1' means RX string received
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 2
56
57
58 bit TX0_Ready; // '1' means okay to TX
59 char *TX0_ptr; // pointer to string to transmit
60
61 bit RX0_Ready; // '1' means RX string received
62
63 unsigned char xdata RX1_Buf[RX1_LENGTH]; // receive string storage buffer
64 unsigned char xdata modbusRX1_Buf[RX1_LENGTH]; // receive string storage buffer
65
66 unsigned char xdata RX0_Buf[RX0_LENGTH]; // receive string storage buffer
67
68
69
70 static unsigned char RX1_index = 0; // uart1 receive buffer index
71
72 static unsigned char RX0_index = 0; // uart1 receive buffer index
73
74
75 bit cdma=1; //间隔采集定时时间开标志,初始化时应为1
76 bit sendinterval; //发送时间到标志。初始化时应为1
77 bit sendinterva2; //T2定时到
78 bit addend; //发送最后一个地址标志,1为发送了最后一个地址,0为没有发送到最后一
-个地址
79 bit addrnd; //收到最后一个地址标志位,0为没有收到,1为收到
80
81
82 bit qkhg1_16;
83 bit hkqg1_16;
84
85 bit qkhg17_20;
86 bit hkqg17_20;
87
88 unsigned char xdata SENDNUM1; //uart1要发送数据的数目
89 unsigned char xdata RECEIVENUM1; //uart1收到数据的数目
90
91 unsigned int xdata SENDNUM0; //uart0要发送数据的数目
92 unsigned char xdata RECEIVENUM0; //uart0收到数据的数目
93
94 sbit RE485=P2^0;
95 sbit WP=P2^1;
96
97
98 unsigned int xdata time; //间隔采集时间累计
99 unsigned int xdata tend; //设置间隔时间长短
100 unsigned int xdata temp;
101
102 unsigned int xdata time2; //间隔采集时间累计
103 unsigned int xdata tend2; //设置间隔时间长短
104 unsigned int xdata temp2;
105
106
107 unsigned char xdata addr; //传感器地址
108 unsigned char xdata addh; //传感器高地址
109 unsigned char xdata addl; //传感器低地址
110
111 unsigned char xdata p7pas; //定义P7口开始数据
112 unsigned char xdata p7pan; //定义P7口指令数据
113
114 unsigned char xdata p6pas; //定义P6口开始数据
115 unsigned char xdata p6pan; //定义P6口指令数据
116
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 3
117 unsigned char xdata p5pas; //定义P5口开始数据
118 unsigned char xdata p5pan; //定义P5口指令数据
119
120 unsigned char xdata waddr[2]; //写传感器地址
121
122 unsigned char xdata raddr[2]; //读传感器地址
123
124 unsigned int xdata packge; //数据打包数
125 unsigned char xdata ardata[2048]; //定义数组用于打包向总控中心发送的数据
126
127 int *PRX0;
128
129 unsigned char xdata onoff; //两输入开关量
130
131
132 unsigned char xdata firstoff1_8;
133 unsigned char xdata firstoff9_16;
134 unsigned char xdata firstoff17_20;
135
136
137 unsigned char code even[256]=
138 {0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
139 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
140 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
141 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
142 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
143 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
144 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
145 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
146 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
147 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
148 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
149 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
150 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
151 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
152 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
153 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
154 };
155
156 unsigned char address;
157 //unsigned char xdata status[12];
158 //-----------------------------------------------------------------------------
159 // Function PROTOTYPES
160 //-----------------------------------------------------------------------------
161
162 void SYSCLK_Init (void);
163 void PORT_Init (void);
164
165 void Timer0_Init (void);
166 void Timer0_ISR (void);
167
168 void Timer2_Init(void);
169 void Timer2_ISR(void);
170
171 void UART0_Init (void);
172 void UART0_ISR (void);
173
174
175 void modbusUART1_Init (void);
176 void UART1_ISR (void);
177
178 void RX0_BufClear(void);
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 4
179 void RX1_BufClear(void);
180
181 void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom);
182 void FlashRead(unsigned char code *pread,unsigned char *BufTo);
183
184 void SendCgqAddr(void);
185
186 void modbuscgqsend(unsigned char addr);
187
188
189 //void ReadStatus(void);
190 //-----------------------------------------------------------------------------
191 // MAIN Routine
192 //-----------------------------------------------------------------------------
193 void main (void)
194 {
195 1
196 1
197 1 WDTCN = 0xde; // disable watchdog timer
198 1 WDTCN = 0xad;
199 1
200 1
201 1 sendinterval=1;
202 1 time=0x0000;
203 1 temp=0x0064;
204 1 //////////////////
205 1 time2=0x0000;
206 1 temp2=0x0064;
207 1 qkhg1_16=0;
208 1 hkqg1_16=0;
209 1
210 1 qkhg17_20=0;
211 1 hkqg17_20=0;
212 1 ////////////////////
213 1
214 1 packge=0x0000;
215 1
216 1 addend=0;
217 1 addrnd=0;
218 1
219 1 RX1_Ready=0;
220 1
221 1 FlashRead(0x0000,raddr);
222 1 //addl=0x00; //调试时用
223 1 //addh=0x01; //调试时用
224 1 addl=raddr[1];
225 1 addh=raddr[0]; //高在前;低在后
226 1 addr=addl;
227 1
228 1 cdma=1;
229 1
230 1 SYSCLK_Init (); // initialize oscillator
231 1 PORT_Init (); // initialize crossbar and GPIO
232 1 modbusUART1_Init ();
233 1
234 1 Timer0_Init ();
235 1 UART0_Init ();
236 1
237 1 Timer2_Init();
238 1 EA = 1; // enable global interrupts
239 1
240 1 p7pas=0x00;
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 5
241 1 P7=p7pas;
242 1
243 1 p6pas=0x00;
244 1 P6=p6pas;
245 1
246 1 p5pas=0x00;
247 1 P5=p5pas;
248 1
249 1 while (1)
250 1 {
251 2 //--------------------------------------------------------------------------------------
252 2 if(RX0_Ready == 1)
253 2 { PRX0=RX0_Buf;
*** WARNING C182 IN LINE 253 OF MODBUS.C: pointer to different objects
254 3 switch(RX0_Buf[1])
255 3 {
256 4 case 0XF0: //设置间隔时间
257 4 TR0=0;
258 4 temp=*(PRX0+1);
259 4 RX0_Ready=0;
260 4 TR0=1;
261 4 break;
262 4 case 0XF1: //关闭定时上传数据
263 4 TR0=0;
264 4 tend=0x64; //定时设为系统默认值
265 4 cdma=0; //定时采集标志位
266 4 RX0_Ready=0;
267 4 break;
268 4 case 0XF2: //打开定时采集数据
269 4 TR0=1;
270 4 cdma=1;
271 4 RX0_Ready=0;
272 4 break;
273 4 case 0XF3: //打开编号为1--16的12伏控制开关
274 4 p7pan=RX0_Buf[3];
275 4 p6pan=RX0_Buf[2];
276 4
277 4 p7pas=p7pas|p7pan;
278 4 p6pas=p6pas|p6pan;
279 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -