📄 backring.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 + -