📄 rs485.lst
字号:
C51 COMPILER V6.12 RS485 12/16/2008 11:56:43 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE RS485
OBJECT MODULE PLACED IN .\rs485.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\rs485.c DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************
2 **项目:开关量数据采集(EE01学习板演示程序)
3
4 **作者:一线工人
5
6 **网站:电子工程师之家 www.eehome.cn
7
8 **备注:modbus协议,rs485通讯
9 *********************************************/
10
11 #include<reg52.h>
12
13
14 #define uchar unsigned char
15 #define uint unsigned int
16
17 sbit rx_led=P0^0;//接收指示灯
18 sbit tx_led=P0^1;//发送指示灯
19 sbit ctrl_485=P3^2;//485接发发送转换控制
20 sbit dm=P1^4;
21 sbit wm=P1^5;
22 sbit led_cs=P1^6;
23 sbit b7=P2^7;//波特率设置位
24 unsigned int crc=0;
25 uchar sendBuf[20],receive_count=0,a[10];
26 uchar send_count= 0,send_num=0,addr_dip=0;
27
28 uint crc16(unsigned char *puchMsg, unsigned int usDataLen);
29 void beginsend(void);
30 void check_modbus(void);
31
32
33 /*************延时*****************/
34 void delay(uint z)
35 {
36 1 uint x,y;
37 1 for(x=z;x>0;x--)
38 1 for(y=113;y>0;y--);
39 1 }
40
41 /************串口初始化*****************/
42 void uart_init(void)
43 {
44 1 TMOD=0x20;//定时器1,模式2
45 1 SCON=0x50;//串口通讯方式1
46 1 TH1=0xfd;//波特率9600
47 1 TL1=0xfd;
48 1 if(b7==1)PCON=0x00; else PCON=0x80;
49 1 TI=0;//发送中断标志位清零
50 1 RI=0;//接收中断标志位清零
51 1 TR1=1;//启动定时器1
52 1 EA=1;
53 1 ES=1;
54 1 }
55 /**************定时器0初始化**************/
C51 COMPILER V6.12 RS485 12/16/2008 11:56:43 PAGE 2
56 void timer0_init(void)
57 {
58 1 TMOD=TMOD&0xf0;
59 1 TMOD=TMOD|0x01;
60 1 TH0=0;
61 1 TL0=0;
62 1 ET0=1; //允许定时器中断
63 1
64 1 }
65
66 void main(void)
67 {
68 1 dm=0;
69 1 wm=0;
70 1 led_cs=1;
71 1 uart_init();
72 1 timer0_init();
73 1 ctrl_485=0;//先置为接收
74 1 while(1)
75 1 {
76 2 RI=0;
77 2 delay(1);
78 2 rx_led=1;
79 2 tx_led=1;
80 2 }
81 1
82 1 }
83
84
85
86 void beginsend(void)
87 {
88 1 ctrl_485=1;
89 1 TI=0;
90 1 send_count = 0;
91 1
92 1 SBUF = sendBuf[0];
93 1 send_num--;
94 1 }
95
96
97 void time0() interrupt 1///定时器中断
98 {
99 1 TR0=0;
100 1 RI=0;
101 1 check_modbus();
102 1 receive_count=0;
103 1 }
104
105 void ser() interrupt 4
106 {
107 1
108 1 if(TI)
109 1 {
110 2 if(send_count < send_num)
111 2 {
112 3 TI=0;
113 3 tx_led=0;
114 3
115 3 SBUF = sendBuf[++send_count];
116 3 }
117 2 else
C51 COMPILER V6.12 RS485 12/16/2008 11:56:43 PAGE 3
118 2 {
119 3 receive_count=0;
120 3 ctrl_485=0;
121 3 TI=0;
122 3 }
123 2 }
124 1 else if(RI)
125 1 {
126 2 RI=0;
127 2 rx_led=0;
128 2 TR0=1;
129 2 a[receive_count++]=SBUF;
130 2 TH0=0xf4;
131 2 TL0=0x1e;
132 2 }
133 1
134 1 }
135
136
137 void check_modbus(void)
138 {
139 1 uchar di,addr;
140 1 if(receive_count>7)////////////////////address 03 00 00 00 01 crc crc
141 1 {
142 2
143 2 receive_count=0;
144 2 crc=crc16(a,6);
145 2 addr=P2>>4;
146 2 addr=~(addr&0x0f);
147 2 addr=addr&0x0f;
148 2
149 2 di=~(P2&0X0f);
150 2 di=di&0x0f;
151 2
152 2 if(a[0]==addr&&a[1]==0x03&&(crc==((a[7]&0x00ff)|(0xff00&(a[6]<<8)))))
153 2 {
154 3
155 3 sendBuf[0]=a[0];
156 3 sendBuf[1]=a[1];
157 3 sendBuf[2]=0x02;
158 3 sendBuf[3]=0x00;
159 3 sendBuf[4]=di;
160 3 crc=crc16(sendBuf,5);
161 3 sendBuf[5]=crc>>8;
162 3 sendBuf[6]=crc&0xff;
163 3 send_num=7;
164 3 beginsend();
165 3 }
166 2 }
167 1 }
168
169
170
171
172
173
174
175
176
177
178
179 /***********************CRC校验*************************/
C51 COMPILER V6.12 RS485 12/16/2008 11:56:43 PAGE 4
180 // CRC 高位字节值表
181 unsigned char code auchCRCHi[260] = {
182 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
183 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
184 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
185 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
186 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
187 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
188 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
189 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
190 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
191 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
192 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
193 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
194 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
195 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
196 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
197 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
198 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
199 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
200 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
201 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
202 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
203 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
204 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
205 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
206 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
207 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
208 } ;
209 // CRC低位字节值表
210 unsigned char code auchCRCLo[260] = {
211 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
212 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
213 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
214 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
215 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
216 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
217 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
218 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
219 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
220 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
221 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
222 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
223 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
224 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
225 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
226 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
227 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
228 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
229 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
230 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
231 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
232 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
233 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
234 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
235 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
236 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
237 } ;
238 unsigned int crc16(unsigned char *puchMsg, unsigned int usDataLen)
239 {
240 1 unsigned char uchCRCHi = 0xFF ; //* 高CRC字节初始化
241 1 unsigned char uchCRCLo = 0xFF ; //* 低CRC 字节初始化
C51 COMPILER V6.12 RS485 12/16/2008 11:56:43 PAGE 5
242 1 unsigned long uIndex ; // CRC循环中的索引
243 1 while (usDataLen--) // 传输消息缓冲区
244 1 {
245 2 uIndex = uchCRCHi ^ *puchMsg++ ; // 计算CRC
246 2 uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
247 2 uchCRCLo = auchCRCLo[uIndex] ;
248 2 }
249 1 return (uchCRCHi << 8 | uchCRCLo);
250 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 482 ----
CONSTANT SIZE = 520 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 11
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -