📄 我的定时程序.lst
字号:
159 1 uchar uchCRCLo=0xFF;
160 1 uchar uIndex;
161 1 while(usDataLen--){
162 2 uIndex=uchCRCHi^*puchMsg++;
163 2 uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
164 2 uchCRCLo=auchCRCLo[uIndex];
165 2 }
166 1 return (uchCRCHi<<8|uchCRCLo);
167 1 }
168
169 /**********处理通信命令,并准备发送数据*********/
170 void prepare_data(void)
171 {
C51 COMPILER V6.12 ________砡序 10/17/2005 22:38:16 PAGE 4
172 1 switch(sbufRam[1]){
173 2 case 0x01:fun_01();
174 2 break;
175 2 case 0x02:fun_02();
176 2 break;
177 2 case 0x03:fun_03();
178 2 break;
179 2 case 0x04:fun_04();
180 2 break;
181 2 case 0x05:fun_05();
182 2 break;
183 2 case 0x06:fun_06();
184 2 break;
185 2 case 0x70:fun_70();
186 2 break;
187 2 case 0x75:fun_75();
188 2 break;
189 2 default:
190 2 return;
191 2 break;
192 2 }
193 1 }
194
195
196 /**********串口数据发送程序*******/
197
198 void tran_serisl_data(sbutRam)
199 {uchar *sbufRam;
200 1 uchar i;
201 1 uint tran_crc16;
202 1 uchar tran_leng;
203 1 tran_leng=sbufRam[2]+5;
204 1 tran_crc16=CRC16(sbufRam,tran_leng-2);
205 1 sbufRam[tran_leng-1]=tran_crc16&0x00ff;/*CRC16 低字节*/
206 1 sbufRam[tran_leng-2]=tran_crc16>>8; /*CRC16 高字节*/
207 1 for(i=0;i<sbufRam[2]+5;i++){
208 2 SBUF=sbufRam[i];
209 2 while(TI==0);TI=0;
210 2 }
211 1 }
212
213 /**********串口初始化命令*********/
214 void initComm(void){
215 1 TMOD=0X22;
216 1 TL1=0XFD;
217 1 TH1=0XFD;
218 1 SCON=0X50;
219 1 PCON=0X80;
220 1 TR1=1;
221 1 IE=0X90;
222 1 EA=1;
223 1 }
224
225
226
227 /*查询接受数据是否有效*/
228 byte readRi(uint x){
229 1 while(RI==0){
230 2 if(x==0)return(0);
231 2 x--;
232 2 }
233 1 RI=0;
C51 COMPILER V6.12 ________砡序 10/17/2005 22:38:16 PAGE 5
234 1 return(1);
235 1 }
236
237
238 /**********串口数据接收程序*******/
239 uchar rec_serial_data(sbufRam)
240 uchar *sbufRam; { /*接受数据存放地址*/
241 1 uchar i;
242 1 uchar rec_leng;
243 1 uint rec_crc16;
244 1 uchar crc16L,crc16H;
245 1 sbufRam[0]=SBUF;RI=0;
246 1 for(i=1;i<3;i++){
247 2 if(readRi(888)==1) sbufRam[i]=SBUF;
248 2 else return(1); /*数据接收超时,退出*/
249 2 }
250 1 rec_leng=5+sbufRam[2];
251 1 for(i=3;i<rec_leng;i++){
252 2 if(readRi(888)==1) sbufRam[i]=SBUF;
253 2 else return(1); /*数据接收超时,退出*/
254 2 }
255 1 rec_crc16=CRC16(sbufRam,rec_leng-2);
256 1 if(rec_crc16!=0){
257 2 crc16L=rec_crc16&0x00ff;
258 2 crc16H=rec_crc16>>8;
259 2 }
260 1 else{
261 2 crc16L=0;
262 2 crc16H=0;
263 2 }
264 1 if(crc16L!=sbufRam[rec_leng-2])return(0x80||sbufRam[1]);/*校验错,请求重发*/
265 1 if(crc16H!=sbufRam[rec_leng-1])return(0x80||sbufRam[1]);/*校验错,请求重发*/
266 1 return(0);
267 1 }
268
269 /*********串行中断0服务子程序*******/
270 void Com_Int(void) interrupt 4
271 {
272 1 uchar return_sign;
273 1 EA=0; /*关中断*/
274 1 return_sign=rec_serial_data(sbufRam);/*数据校验结果,0为数据完整接受,1反之*/
275 1 if (return_sign==0){ /*如果从主机接受数据有效*/
276 2 prepare_data(); /*处理通信口命令并准备发送的数据*/
277 2 tran_serial_data(sbufRam); /*发送数据到主机*/
278 2 }
279 1 else if (return_sign>=0x80)tran_serial_data(sbufRam);/*接受数据包校验错误,请求重发*/
280 1 initComm(); /*初始化串口*/
281 1 }
282
283
284 /****读输入端口并写入输入映像寄存器*****/
285 void read_inport(uchar r_times){
286 1 uchar rRead;
287 1 rRead=c52in;
288 1 do{
289 2 if(rRead!=c52in)return;
290 2 r_times--;
291 2 _dl50us();_dl50us();
292 2 }while(r_times>0);
293 1 IB0=rRead;
294 1 }
295
C51 COMPILER V6.12 ________砡序 10/17/2005 22:38:16 PAGE 6
296 /*****将输出映像寄存器数据写入输出端口*****/
297 void write_outport(void){
298 1 c52out=QB0;
299 1 }
300
301 /**********主程序**************/
302 void main(void){
303 1 #define RTIMES 5 /*定义读次数*/
304 1 void (*c52_user)();
305 1 c52_user=0x2000; /*用户程序入口地址*/
*** WARNING C196 IN LINE 305 OF .\我的定时程序.C: mspace probably invalid
306 1 initComm(); /*串口初始化*/
307 1 do{ /*循环执行c52的扫描*/
308 2 read_inport(RTIMES); /*读输入端口并写入映像寄存器*/
309 2 if (c52_run){ /*c52_run=1则执行用户程序*/
310 3 c52_user(); /*跳到用户程序入口地址执行用户程序*/
311 3 }
312 2 write_outport();
313 2 }while(1);
314 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 805 ----
CONSTANT SIZE = 512 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 25
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -