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

📄 backring.c

📁 内容摘要: LHD6000主板主芯片程序 ISD1730时序说明: 参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
💻 C
字号:
/*******************************************************************************
* 版权所有 (C)2005,深圳豪恩科技有限公司
*
* 文件名称:  main.C
* 文件标识:
* 内容摘要:   测试与键盘通讯,2005.12.05开始
* 其它说明:
* 当前版本: 0.000
* 作    者: 白征志(豪恩科技研发中心安全主机组)
* 完成日期:
*
* 修改纪录1:
*    修改日期:
*    版 本 号:
*    修 改 人: 涂常亮
*    修改内容: 注释,去除测试语句
* 修改纪录2:
*******************************************************************************/
#include <reg54.H>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;
#define nop _nop_()
#define send_9200_outtime 5

//电话回铃音宏定义
#define BACK_RING_BUSY      5  //忙音  ///???什么情况下送忙音

#define BACK_RING_RINGING   6  //振铃音///接通成功,被叫正在振铃

#define BACK_RING_NOISE     7  //回铃噪音或接收错误///???

#define BACK_RING_ANSWD     8  //对方摘机有噪音  ///检测到对方已经摘机

#define BACK_RING_BUSY1     9  //检测忙音改为两次///此为第一次检测到忙音的返回值

extern uint const time0_counter; ///10ms时基
extern uchar const idata g_ucLastBackRing;
extern uchar const idata g_ucAlarmTypePlayed;///已经向用户播报过的报警防区类型,在拨通一个号码时清零
extern uchar const idata g_ucAlarmTypes;///报警类型
uint data_counter; ///计数中间变量

//10ms 为单位,40ms
#define  data_counter_outtime 1 ///超时中间变量
uint data_counter_begin; ///计数开始
uint data_counter_end;	 ///计数结束
bit  data_receiving;	 ///正在接收回铃音数据

extern const bit g_FlagVoiceOn; ///正在播放语音
extern const bit g_FlagPhoneSPkg; ///正在监听

/*******************************************************************************
* 函 数 名:uchar checkBackRingResult(void)	 ///检查回铃音结果
* 功    能:///停止脉冲群计数和计时,判断脉冲群的类型,看是那种回铃音。为电话报警和接警机报警服务。
           
* 输入参数: 无
* 输出参数: 返回回铃音的类型。
* 返 回 值:
* 其它说明:
* 修改日期            版本号       修改人           修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
uchar checkBackRingResult(void)	 ///检查回铃音结果
{
     uint i;
     bit FlagEX1;
     ///收到忙音,应该是被叫挂机了							  ///周期大于3.9秒是忙音
     if (data_receiving && g_FlagPhoneSPkg && ((data_counter_end - data_counter_begin) > 390)) //只收忙音
     {  ///g_FlagPhoneSPkg =1 用户已经接听电话,用户已经接听电话后就必须10ms不时的检测回铃音,不然怎么知道它挂机了
        data_receiving = 0;///重新开始接收
        if (g_ucAlarmTypePlayed != g_ucAlarmTypes) //正在播放或者刚开始接听
        {				///发生报警的防区类型没有报完
            EX1 = 0;	///停止检测回铃音
            return (0);
        }
     }
     
     FlagEX1 = EX1;
     EX1 = 0; ///回铃音判断时,停止回铃音脉宽检测
     //摘机后没有拨号前是一直持续的450Hz的波形,一直不拨会变成忙音//没有检测,不需要
     //对方挂机或一直不接出现的忙音结束后是一直持续的950Hz的波形
	 ///主叫摘机后没有拨号前是一直持续的450Hz的波形(拨号音,提示主叫可以拨号)。一直不拨会变成忙音(或拨号音消失),此时拨号无效。
     ///被叫挂机后出现的忙音结束后是一直持续的950Hz的波形(尖锐的催挂音),有时又没有(没有波形?没有测)。
	 ///被叫一直不接出现的忙音结束后是一直持续的950Hz的波形(尖锐的催挂音),有时又没有(没有波形?没有测)。
	 if ((data_receiving == 1) && ((time0_counter - data_counter_end) > data_counter_outtime))///#define  data_counter_outtime 1
     {		   ///认为一个脉冲群结束
	           ///450Hz的信号,一个脉冲周期大概是2.2ms,差值大于10ms了,完全可以断定一个脉冲群已经结束
         	   ///在脉冲群的停顿间隔进行脉冲群类型的判断,判断是那种回铃音。
		 data_receiving=0;  //间隔超出40ms(由data_counter_outtime控制),认为一个波结束.
         i=data_counter_end-data_counter_begin;
         EX1 = FlagEX1;
         if ((i>88) &&(i<112) &&(data_counter>400) &&(data_counter<500))
         {	///100 x 2.2 / 2  x 10 = 1秒 && 2.2ms X 450 = 1s,那么肯定是450Hz的振铃音(1秒送,4秒停)
              //data_counter=0;
              return (BACK_RING_RINGING);           //持续1s,450hz,未接电话音
			                                        ///持续1s,450Hz,振铃音(被叫正在振铃)。
         }
         if ((i>8) &&(i<12) &&(data_counter>120) &&(data_counter<160))
         { 	///接警机的回铃音信号,有待核实。
              //data_counter=0;
              return (1);           //持续100ms,1400hz,685 握手信号,开始通讯
         }
         if ((i>8) &&(i<12) &&(data_counter>205) &&(data_counter<255))
         {	 ///接警机的回铃音信号,有待核实。
              //data_counter=0;
              return (2);           //持续100ms,2300hz,685 握手信号
         }
         //握手信号改为检测频率
         //if ((i>72) &&(i<88) &&(data_counter>1000) &&(data_counter<1250))
         if (((i>45) && (i<132)) && (((data_counter/i) >=9) && ((data_counter/i)<=17)))
         {
              //data_counter=0;
              return (3);           //持续800ms,1400hz,685 握手信号,正确接收
         }
         if ((i>170) &&(i<230) &&(data_counter>4000) &&(data_counter<5200))
         {
              //data_counter=0;
              return (4);           //持续2s,2300hz,685 握手信号
         }///这么多种685握手信号,每种是什么意思呢
         
            //70ms,1400Hz 685主机信箱满
         
         if (((i>32) &&(i<38) &&(data_counter>140) &&(data_counter<180)) //持续350ms,450hz,挂电话音、忙音
             || ((i>44) &&(i<56) &&(data_counter>200) &&(data_counter<250))) //持续500ms,450hz,始终未接电话音,系统自动挂机//不太会出现?	///好像是60秒始终不接才会出现这种忙音,本系统不容忍如此长的等待,所以不会出现。
         {	///检测到了忙音
		    ///此处检测忙音用了两次,即连续两次检测到忙音,才断定为忙音。														   
              //data_counter=0;
                if ((BACK_RING_BUSY1 == g_ucLastBackRing)
                    || (BACK_RING_BUSY == g_ucLastBackRing))///第一次已经检测到忙音了
                {
                    return (BACK_RING_BUSY);///返回第二次检测到忙音的标识值
                }
                else
                {
                    return BACK_RING_BUSY1;	///返回第一次检测到忙音的标识值
                }
         }
         //持续500ms,450hz,始终未接电话音,系统自动挂机//不太会出现?
         /*if ((i>44) &&(i<56) &&(data_counter>200) &&(data_counter<250))
         {
                if ((BACK_RING_BUSY1 == g_ucLastBackRing)
                    || (BACK_RING_BUSY == g_ucLastBackRing))
                {
                    return (BACK_RING_BUSY);
                }
                else
                {
                    return BACK_RING_BUSY1;
                }
         }*/
         /* //频率是450Hz,只是时间不正常,只在一直不接时最后一个音处发现短时间的波
         if (45 == ((data_counter-2) * 10) / i)     //经常多两个脉冲
         {
            return 0x;
         }*/                            //没有用处
         if ((i>6) &&(i<300) &&(data_counter>50))
         {
              //data_counter=0;
              if (BACK_RING_NOISE == g_ucLastBackRing)///之前已经检测到了无规则信号
              {
                return BACK_RING_ANSWD;	///返回被叫已经摘机的标识值///两次检测到无规则信号就认为被叫已经摘机,可取否??????
              }
              return (BACK_RING_NOISE);  ///返回无规则信号的标识值         //无规则信号
         }
         //data_counter=0;
         return (0); //return (0x0F);///返回0啥意思,表示检测没有得出结果,检测无功而返。
     }
     EX1 = FlagEX1;	///重新开外部中断1,检测回铃音脉冲群。
     return (0);///无功而返,检测完后,还无法下结论。
}




/*******************************************************************************
* 函 数 名:void Ext1Int(void) interrupt 2
* 功    能:外部中断1口用来检测回铃音。
            在下跳沿时刻开始计时或停止计时,相当于比赛秒表计时。
* 输入参数: 无
* 输出参数: 无
* 返 回 值:
* 其它说明:在脉冲的下跳沿记录data_counter_end即结束时间,data_counter_end
     与data_counter_begin之差为一个方波周期;当data_receiving ==0时,
	 也在下跳沿记录data_counter_begin即开始时间。 
	 data_counter用来记录下跳沿的个数
* 修改日期            版本号       修改人           修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void Ext1Int(void) interrupt 2	 ///外部中断1口用来检测回铃音
{
    if (g_FlagVoiceOn)///如果正在播放语音,就停止检测回铃音信号。
    {
       return; 
    }
    if (data_receiving ==0 )   //开始
    {						   ///开始方波计数
        data_counter_begin=time0_counter;
        data_counter=0;
        data_receiving=1;
    }
    data_counter++;///理解模糊,为什么要搞个整形变量,进入下跳沿中断有那么多次数吗
	               ///data_counter_begin和data_counter_end搞成整形变量还好理解
    data_counter_end=time0_counter;//与定时器同级中断,不需禁止中断
	        ///低跳沿记录data_counter_end,data_counter_end与data_counter_begin
			///之差为一个方波周期
}							    

⌨️ 快捷键说明

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