⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtmf.c

📁 16为单片机实现调制解调器功能
💻 C
📖 第 1 页 / 共 2 页
字号:
//********************** 使用 DTMF 与中心通信 ****************
#include "msp430x14x.h"
#include "main.h"
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from Dtmf.C
extern unsigned char Get_DTMF(void);
extern void write_CR(unsigned char WriteData);
extern void Write_DTMF(unsigned char WriteData);
extern unsigned char read_SR(void);
extern unsigned char  read_DTMF(void);
//form main.c
//用作为 16 个位!BOOLEAN 变量来使用
extern unsigned int g_intMark;
extern unsigned int g_intMarkA;
//from commpc.c
extern unsigned char g_chReceivePCBuf[ReceivePcBufMAX]; //发往PC,最大一信息长度)---------------- 
extern unsigned char g_chReceivePCHead, g_chReceivePCTail;
extern unsigned char g_chSendPCHead, g_chSendPCTail;
extern unsigned char g_chReceivePCBuf_Stat;
extern unsigned char g_chSendPCBuf_Stat;
extern unsigned char g_chMainPushReport_Stat;
//from debug.c
extern void ExternInsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//2002-11-10 14:32 全面检查一遍 
//mt8889
//#define PHONE_ON          {P6OUT |= OFFHOOK; P6OUT &= ~HOOKLED ; }
//#define PHONE_OFF         {P6OUT &= ~OFFHOOK ; P6OUT |= HOOKLED; intMFlag &= ~CommWork_Mark;}

void BuildDTMF(void);
    unsigned char g_chBuildDTMF_Stat;
    unsigned char g_chBuildDTMFTime_1s;
    #define BuildDTMFTime_1sMAX 7
    #define BuildDTMFTime_1sPowerMAX 31
    #define BuildDTMFTime_1sShakeHandMAX 15
    #define BuildDTMFTime_1sRecerivMAX 5
    unsigned char g_chBuildDTMFReBuildCount = 0;
    #define BuildDTMFReBuildCount_MAX 5
void DtmfPhysicsReceive(void);
    unsigned char g_chDtmfPhysicsReceive_50ms;
void DtmfPhysicsSend(void);
    unsigned char g_chDtmfPhysicsSendMark;
unsigned char g_chSendDtmf = 0xFF;

unsigned char g_chHandShakeBuf[3];
unsigned char g_chHandShakeTail;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
/**************************************
*功能: 建立DTMF通信   
*参数:  
*返回: 
*备注: 实时调用,
**************************************/
void BuildDTMF(void)
{
    switch(g_chBuildDTMF_Stat)
    {
        case 0:// 
            g_chBuildDTMF_Stat = 1;
            g_chBuildDTMFTime_1s = 0;
        break;
        case 1://判断震铃 保证时间 7秒 或 16秒
            //保持挂机
            P6OUT &= ~OFFHOOK;
            //不亮
            //P2OUT |= CommBuild_LED;-----在这里可能是在使用 RS232 通信呢
            //保持一些初始状态
            g_intMark &= ~DTMFPhysicsReceiveWorkToPCBuf_Mark;
            g_intMark &= ~DtmfPhysicsReceive_Mark;//不可以接受码了
            if(g_intMarkA & DTMFCallCenter_MarkA)
            {//有中心号码
                //
            }
            else
            {
                g_intMark &= ~RS232DTMFSendPC_Mark;//使用 RS232资源
            }
            //在这里不可以  改变  commPc.c 中的处理收发缓冲区里的信息
            if(P1IN & RING)
            {//高 没有RING
//                P2OUT &= ~LCD10;//送低亮
                if(g_intMark & PowerOn_Mark)
                {//上电还未发送,等待15秒
                    if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sPowerMAX)
                    {
                        g_chBuildDTMF_Stat = 11;//看是否要主动发送了!
                    }
                }
                else
                {//等待7秒
                    if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sMAX)
                    {
                        g_chBuildDTMF_Stat = 11;//看是否要主动发送了!
                    }
                }
            }
            else
            {//低,有震铃信号
//                P2OUT &= ~LCD10;//送低亮
                g_chBuildDTMF_Stat = 2;
                g_chBuildDTMFTime_1s = 0;
            }
        break;
        case 2://马上取机,接收握手
            P6OUT |= OFFHOOK;//取机灯要亮
            //亮
            P2OUT &= ~CommBuild_LED;
            read_SR();//读状态寄存器(清除状态寄存器),以清除接收端可能在状态寄存器中产生的置位
            //可以接收码,但必须放在握手缓冲区里
            g_chHandShakeBuf[0] = 0xFF;
            g_chHandShakeTail = 0;
            g_chBuildDTMF_Stat = 3;
            //DEBUG --被叫
            {
                unsigned char chM[] = "被叫\n\r";   
                ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
            }
        break;
        case 3://等待握手信息 # 
            g_intMark |= DtmfPhysicsReceive_Mark;//可以接受码了
            //在 1 中: g_intMark &= ~DTMFPhysicsReceiveWorkToPCBuf_Mark;
            if(g_chHandShakeBuf[0] == '#')
            {//表明被动握手成功,正在接收信息
                if(g_chReceivePCTail == 0)
                {
                    g_intMark &= ~ICanPush_Mark;//被动发信息
                    g_intMark |= RS232DTMFSendPC_Mark;//使用DTMF通信----可能会无条件抢用 RS232资源
                    g_intMark |= CommBuilded_Mark;//通信建立
                    
                    //清 发送缓冲区------------------------------可能会无条件抢用 RS232资源
                    g_chSendPCHead = 0;
                    g_chSendPCTail = 0;
                    g_chSendPCBuf_Stat = 1;
                    //接收缓冲区
                    g_chReceivePCHead = 1;
                    g_chReceivePCTail = 1;
                    g_chReceivePCBuf_Stat = 1;//从 1 开始处理
                    g_chReceivePCBuf[1] = '#';//添上头
                    g_intMark |= DTMFPhysicsReceiveWorkToPCBuf_Mark;//必须要在这里加上去!
                    g_chBuildDTMF_Stat = 4;//继续接收
                    g_chBuildDTMFTime_1s = 0;
                }
                else
                {
                    {
                        unsigned char chM[] = "与RS232冲突挂\n\r";  
                        ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
                    }
                    //挂机!    -----本次被动握手失败!
                    g_chBuildDTMF_Stat = 9; 
                }
            }
            //15 秒 挂机,
            if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sShakeHandMAX)
            {
                g_chBuildDTMF_Stat = 9;
                //DEBUG --无握手
                {
                    unsigned char chM[] = "无握手挂3\n\r";  
                    ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
                }
            }
        break;
        case 4://正在接收信息
            //是否接收完成,有尾巴既完成
            //g_intMark |= DTMFPhysicsReceiveWorkToPCBuf_Mark;//可以收 DTMF 码
            g_intMark |= DtmfPhysicsReceive_Mark;//可以接受码了
            //应该由接收处理去,处理收到完整一信息后,马上转到发送信息
            //但要根据情况,有时,在被叫的情况下收到 #2#,除了丢掉发送区的信息后,还要继续接收,而不是发送!
            //5 秒 挂机,---有 5 秒还未收到一个码
            if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sRecerivMAX)
            {
                g_chBuildDTMF_Stat = 9;
                {
                    unsigned char chM[] = "收超时挂4\n\r";  
                    ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
                }
            }
        break;
        case 5://发送信息
            //等待信息发送完成!
            g_intMark &= ~DtmfPhysicsReceive_Mark;//不可以接受码了
            g_intMark &= ~ICanPush_Mark;//被动发信息
            //发送完成后,肯定是接收!接收#2#,或接收新的命令
            //5 秒 挂机,按流程肯定有发送,这里还没有发码肯定有问题,
            //if(g_chSendPCBuf_Stat == 1)//在等待发送缓冲区里是否有东西
            //无条件判断,防止死机
            {//在等待发送
                //5 秒 挂机,
                if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sRecerivMAX)
                {
                    g_chBuildDTMF_Stat = 9;
                    {
                        unsigned char chM[] = "发超时挂5\n\r";  
                        ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
                    }
                }
            }
        break;
        case 9://挂机!
            g_intMark &= ~CommBuilded_Mark;//通信断开
            g_chBuildDTMF_Stat = 1;
            g_chBuildDTMFTime_1s = 0;
            //DEBUG --挂
            {
                unsigned char chM[] = "挂9\n\r";    
                ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
            }
        break;
        case 11://需要主动拨号吗
            if((g_intMark & RS232DTMFSendPC_Mark) && (g_intMarkA & DTMFCallCenter_MarkA))
            {//使用DTMF通信,才去主动拨号          有中心号码吗
                g_chBuildDTMF_Stat = 12;
            }
            else
            {
                g_chBuildDTMF_Stat = 1;
                g_chBuildDTMFTime_1s = 0;
            }
        break;
        case 12://
            if(g_intMark & ReportPC_Mark)
            {//有状态改变要报告
                g_chBuildDTMF_Stat = 13;
                g_chBuildDTMFTime_1s = 0;
            }
            else
            {//无要主动报告的东西
                g_chBuildDTMF_Stat = 1;
                g_chBuildDTMFTime_1s = 0;
            }
        break;
        case 13://主动取机
            P6OUT |= OFFHOOK;//取机灯要亮
            //亮
            P2OUT &= ~CommBuild_LED;
            //1-2秒后 才开始拨号
            if(g_chBuildDTMFTime_1s > 1)
            {
                g_chBuildDTMF_Stat = 14;
                //DEBUG --主叫
                {
                    unsigned char chM[] = "主叫\n\r";   
                    ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
                }
            }
        break;
        case 14://拨号
            {
                unsigned char chI;
                for(chI = 0; chI < 18; chI++)
                {
                    if(*(unsigned char *)(DesTeleID_Info + chI) != '9')
                    {
                        break;//记录了中心号码开始位置
                    }
                }
                
                if(chI >= 17)
                {//号码长度 = 1,或无
                    g_intMarkA &= ~DTMFCallCenter_MarkA;//中心无号码,且不需要在其他地方初始化
                    g_chBuildDTMF_Stat = 1;
                    g_chBuildDTMFTime_1s = 0;
                }
                else
                {//发电话号码
                    g_chBuildDTMF_Stat = 15;
                    g_chHandShakeTail = chI;//借用该变量
                }
            }
        break;
        case 15://发电话号码
            if(g_chHandShakeTail < 18)
            {
                if(g_chSendDtmf == 0xFF)
                {
                    g_chSendDtmf = *(unsigned char *)(DesTeleID_Info + g_chHandShakeTail);
                    g_chHandShakeTail++;
                }
            }
            else
            {
                if(g_chSendDtmf == 0xFF)
                {//保证发完了码!
                    g_chBuildDTMF_Stat = 16;//接收 
                    g_chHandShakeTail = 0;
                    //清理缓冲区
                    g_chHandShakeBuf[0] = 0;
                    g_chHandShakeBuf[1] = 0;
                    g_chHandShakeBuf[2] = 0;
                }
            }
        break;
        case 16://不用在这里清收码,收握手
            g_intMark |= DtmfPhysicsReceive_Mark;//可以接受码了

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -