📄 receivedata.lst
字号:
224 * RS=1,RW=1,读状态寄存器 *
225 * *
226 *************************************************************/
227 uchar read_status()
228 {
229 1 uchar dat;
230 1 P1=0xff; //置P1为输入状态
231 1 MT_RS=1;
232 1 MT_RW =1;
233 1 _nop_();
234 1 _nop_();
235 1 MT_CK =1;
236 1 _nop_();
237 1 _nop_();
238 1 dat=P1;
239 1 _nop_();
240 1 _nop_();
241 1 MT_CK =0;
C51 COMPILER V8.02 RECEIVEDATA 12/12/2006 16:32:39 PAGE 5
242 1
243 1 return(dat);
244 1
245 1 }
246
247 /*************************************************************
248 * *
249 * MT8880 初始化函数 *
250 * *
251 *************************************************************/
252 void MT_INIT()
253 {
254 1 MT_CS=0; //MT8880使能
255 1 delayNOP();
256 1 write_status(0x10); //写 8880CRA,CRA=0000.
257 1 write_status(0x10); //写 8880CRA,CRA=0000.
258 1 write_status(0x18); //写 8880CRA,CRA=1000,允许选择CRB.
259 1 write_status(0x10); //写 8880CRB,CRB=0000
260 1 // MT_CS=1; //禁止MT8880工作
261 1 }
262
263 /*************************************************************
264 * *
265 * MT8880 中断初始化函数 *
266 * *
267 *************************************************************/
268 void MT_IRQ_INIT()
269 {
270 1 // MT_CS=0;
271 1 delayNOP();
272 1 write_status(0x14); //写8880CRA,8880模式1为DTMF,IRQ
273 1 delay(1000);
274 1 EX0=1; //允许外部EX0中断
275 1 temp=0x00;
276 1 dis_buf=0x00;
277 1 delay(1000);
278 1 }
279
280 /***********************************************************
281 *
282 * 振铃信号中断函数
283 *
284 ***********************************************************/
285 void ex_t1() interrupt 2
286 {
287 1 EX1 =0;
288 1 count++;
289 1 if(count==0x03)
290 1 {
291 2 count=0x00;
292 2 zhenling=1;
293 2 EX1 =0;
294 2 }
295 1 else
296 1 EX1=1;
297 1 }
298
299 /***********************************************************
300 *
301 * 中断接收DTMF函数
302 * RS=0,RW=1,读接收数据寄存器.
303 *
C51 COMPILER V8.02 RECEIVEDATA 12/12/2006 16:32:39 PAGE 6
304 ***********************************************************/
305 void ex_t0() interrupt 0
306 {
307 1 EX0=0;
308 1 read_status();
309 1 P1=0xff;
310 1 MT_RS=0;
311 1 MT_RW=1;
312 1 MT_CK=0;
313 1 _nop_();
314 1 _nop_();
315 1 MT_CK=1;
316 1 _nop_();
317 1 _nop_();
318 1 temp=P1; //读MT8880接收数据寄存器
319 1 temp=temp & 0x0f;
320 1 MT_CK=0;
321 1
322 1 playflag=1; //显示标志置1
323 1 }
324
325 /************************************************************
326 * *
327 * 主程序 *
328 * *
329 ************************************************************/
330 void main()
331 {
332 1 P0=0xff; //置P0口
333 1 P1=0xff; //置P1口
334 1 P2=0xff; //置P2口
335 1 P3=0xff; //置P3口
336 1 delay(100); //上电延时
337 1 MT_CS=1; //禁止MT8880工作
338 1 lcd_init(); //初始化LCD
339 1
340 1 lcd_pos(0); //设置显示位置为第一行
341 1 for(m=0;m<16;m++)
342 1 lcd_wdat(cdis1[m]);
343 1
344 1 lcd_pos(0x40); //设置显示位置为第二行
345 1 for(m=0;m<16;m++)
346 1 lcd_wdat(cdis2[m]);
347 1
348 1 temp=0x00; //有关单元清零
349 1 dis_buf=0x00;
350 1 playflag=0;
351 1 zhenling=0;
352 1 count=0;
353 1
354 1 IT0=1; //设置中断触发方式:下降沿触发
355 1 IT1=1; //设置中断触发方式:下降沿触发
356 1 EA =1; //总的中断允许
357 1 EX1=1; //允许外部中断EX1中断
358 1
359 1 while(1)
360 1 {
361 2 while(!zhenling); //等待振铃信号出现
362 2
363 2 if(zhenling)
364 2 {
365 3 TEL = 0; //摘机
C51 COMPILER V8.02 RECEIVEDATA 12/12/2006 16:32:39 PAGE 7
366 3 zhenling=0; //振铃标志
367 3 tel_on=1; //摘机标志
368 3 delay(2000); //等待电话线路稳定
369 3 }
370 2
371 2 while(tel_on)
372 2 {
373 3 MT_INIT(); //MT8880初始化
374 3 MT_IRQ_INIT();
375 3
376 3 while(temp!=0x0c)
377 3 {
378 4 if(playflag)
379 4 {
380 5 dis_buf=temp;
381 5 lcd_play();
382 5
383 5 playflag=0;
384 5 T0_Count++;
385 5
386 5 if(temp==0x0b) //"*"
387 5 {
388 6 beep(); //蜂鸣器响2声
389 6 beep();
390 6 }
391 5 EX0=1; //显示完毕开中断
392 5 }
393 4
394 4 if(T0_Count==0x0d) // 一行是否显示完?
395 4 {
396 5 lcd_pos(0x40); //设置显示位置为第二行
397 5 for(m=0;m<16;m++)
398 5 lcd_wdat(cdis2[m]);
399 5
400 5 T0_Count=0x00;
401 5 dis_buf=temp;
402 5 lcd_play();
403 5 T0_Count++;
404 5 }
405 4 } //end of while(temp!=0x0c)
406 3
407 3 if(temp==0x0c) //"#"
408 3 {
409 4 for(m=0;m<4;m++) //蜂鸣器响4声
410 4 beep();
411 4
412 4 TEL = 1; //挂机
413 4
414 4 lcd_pos(0x40); //设置显示位置为第二行
415 4 for(m=0;m<16;m++)
416 4 lcd_wdat(cdis2[m]);
417 4
418 4 T0_Count=0x00;
419 4 temp=0x00;
420 4 dis_buf=0x00;
421 4 playflag=0;
422 4 tel_on=0;
423 4 MT_CS=1; //禁止MT8880工作
424 4 EX0=0;
425 4 EX1=1;
426 4 }
427 3
C51 COMPILER V8.02 RECEIVEDATA 12/12/2006 16:32:39 PAGE 8
428 3 } //end of while(tel_on)
429 2 } //end of while(1)
430 1 } //end of main()
431
432 /*************************************************************
433 * RS=1,RW=0,写状态寄存器 *
434 * RS=1,RW=1,读状态寄存器 *
435 * RS=0,RW=0,写发送寄存器 *
436 * RS=0,RW=1,读接收数据寄存器 *
437 *************************************************************/
438
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 650 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -