找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2906|回复: 1
打印 上一主题 下一主题
收起左侧

MT8880振铃检测摘机DTMF接收单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:144332 发表于 2016-10-25 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
振铃检测摘机DTMF接收程序
完整代码下载:
振铃检测摘机DTMF接收例程.rar (17.48 KB, 下载次数: 51)

部分源码预览:
  1. //-----------------------------------------------------------------------------
  2. // MT8880_DTMF_receiving.c
  3. //-----------------------------------------------------------------------------
  4. // Copyright 2017 尖峰学子.
  5. //
  6. // Program Description:
  7. //
  8. // 这是用于测试MT8880模块接收DTMF信号功能
  9. // 首先,在手机拨打了号码后,通过振铃检测,自动摘机,
  10. // 接收DTMF信号通过串口发送到PC机,并且通过P1上连接的LED来显示。通过按#号键可以远程关闭电话机
  11. // 端口说明:
  12. // P2^0--D0
  13. // P2^1--D1
  14. // P2^2--D2
  15. // P2^3--D3
  16. // P2^4--R/W
  17. // P2^5--RSO
  18. // P2^7--zj_control  控制摘挂机
  19. // P3^2--zljc        检测振铃信号               
  20. // P3^3--IRQ         接收DTMF时产生中断信号接外部中断1        
  21. // P1                接八个led
  22. //
  23. // How To Test:
  24. //
  25. // 1) 将模块各个端口与单片机链接好;
  26. // 3) 通过手机拨打该电话号码可以通过示波器观察振铃检测端ZLJC的信号;
  27. // 2) 用手机拨打该电话后,运行程序后可按手机上号码;通过观察窗口可以发现接收到的数字正是你按下的键值
  28. //
  29. //
  30. // 硬件要求:       51单片机 电话线            晶振:12M        
  31. // Target:         MT8880 AND  AT89C51
  32. // Tool chain:     Keil C51 7.50 / Keil EVAL C51
  33. // Command Line:   None

  34. //-----------------------------------------------------------------------------
  35. // Include Files
  36. //-----------------------------------------------------------------------------
  37. #include <reg51.h>
  38. //-----------------------------------------------------------------------------
  39. // Global Constants
  40. //-----------------------------------------------------------------------------
  41. #define uchar unsigned char
  42. #define uint unsigned int

  43. sbit zj_control=P2^7;//控制摘挂机;
  44. uchar rx_num; //接收数据寄存器;
  45. uchar ring_num; //振铃次数;
  46. //-----------------------------------------------------------------------------
  47. // Function Prototypes
  48. //-----------------------------------------------------------------------------
  49. void initialize(void); //MT8880芯片初始化函数
  50. void rece_init(void); //MT8880接收初始化函数
  51. void StartUART( void );//串口初始化函数
  52. void R_S_Byte(uchar R_Byte);//串口发送子函数

  53. //-----------------------------------------------------------------------------
  54. // /* 主函数(主程序) */
  55. //-----------------------------------------------------------------------------
  56. void main(void)
  57. {
  58.   P2=0xff;        //端口初始化
  59.   StartUART();    //串口初始化
  60.   initialize();          //MT8880芯片初始化子函数;
  61.   rece_init();          //接收初始化子函数;

  62.   zj_control=1;
  63.   for(;;) ;             //等待接收         

  64. }
  65. //-----------------------------------------------------------------------------
  66. // /* MT8880芯片初始化子函数 */
  67. //-----------------------------------------------------------------------------
  68. void initialize(void)
  69. { P2=0x3f;  /* 读SR */
  70.   P2=0x20;  /* CRA=0000 */
  71.   P2=0x20;  /* CRA=0000 */
  72.   P2=0x28;  /* CRA=1000 */
  73.   P2=0x20;
  74.   }  /* CRB=0000 */
  75. //-----------------------------------------------------------------------------
  76. // /*接收初始化子函数 */
  77. //-----------------------------------------------------------------------------
  78. void rece_init(void)
  79. {
  80. P2=0x24;  /* CRA=0100 */ //设置为 DTMF收发模式
  81. EA=1;  //开总中断
  82. ES=1;  //开串口接收中断
  83. EX0=1; //开外中断0:用于检测振铃信号
  84. IT0=1; // 边沿触发

  85. EX1=0; //关外中断1:用于接收DTMF信号
  86. IT1=1; //边沿触发
  87. }
  88. //-----------------------------------------------------------------------------
  89. // /*振铃检查中断服务程序 */
  90. //请先用示波器测试振铃信号端,在有电话拨入的时候,是否产生了振铃信号再接入单片机
  91. //入接入号不能产生中断信号,考虑是否下拉信号比较入,可考虑接个下拉电阻。
  92. //-----------------------------------------------------------------------------


  93. void int0(void) interrupt 0
  94. {
  95.   ring_num++;//每次振铃将会参数25个左右的中断脉冲,
  96.   R_S_Byte(11);//发送一个0x0B到串口;

  97.   if(ring_num>=50) //在振铃响三下的时候自动摘机。

  98.   {
  99.     ring_num=0;//清除振铃计数寄存器
  100.     zj_control=0;         //有来电自动摘机
  101.     EX0=0;//关闭外部中断0
  102.     EX1=1;//开外部中断1 准备接收DTMF信号
  103.   }
  104. }
  105. //-----------------------------------------------------------------------------
  106. // /*dtmf接收中断服务程序 */
  107. //-----------------------------------------------------------------------------
  108. void int1(void) interrupt 2
  109. { P2=0x3f;  /* 读SR */
  110.   P2=0x1f;  /* 读RDR */
  111.   rx_num=P2&0x0f;   //读取数据,存入接收寄存器中;
  112.   R_S_Byte(rx_num);        //将接收到的DTMF信号转为数字后通过串口发送到PC机;
  113.   P1=rx_num;        //通过P1端口上的LED显示接收到的数据;
  114.                     //也可如此通过控制IO口的方式进而控制继电器的开关,达到控制电器的目的

  115.   if(rx_num==12)    //#号键远程关闭电话机。
  116.   {
  117.    zj_control=1;            //按#号键远程关闭电话机
  118.    EX0=1;//打开外部中断0         ,再次进入振铃检查
  119.    EX1=0;//关闭外部中断1
  120.   }
  121.   //此处程序可以发挥,加入密码识别,家电控制,语音提示信号切入,等等
  122. }


  123. //-----------------------------------------------------------------------------
  124. // /* 串口初始化子函数 */
  125. //-----------------------------------------------------------------------------
  126. void StartUART( void )
  127. {                                                          //波特率9600
  128.      SCON = 0x50;  //串口工作方式选择,选择在工作方式1
  129.      TMOD = 0x20;  
  130.      TH1 = 0xfd;
  131.      TL1 =
  132. ………………
  133. ………………
复制代码

MT8880模块资料:http://www.51hei.com/bbs/dpj-57219-1.html

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-10-25 14:25 | 只看该作者
51黑有你更精彩!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表