📄 soundintel.c
字号:
#include "main.h"
//*************音乐**************/
unsigned int mBitTm;
unsigned char mNoteCn;
unsigned int Musicfrequency;
const unsigned int MusicalScale[56] PROGMEM=
{440,494,523,440,523,494,440,494,330,494,523,578,
494,578,523,494,440,659,880,784,880,784,698,659,
578,659,440,698,578,659,523,494,330,523,494,440,
659,880,784,880,784,698,659,578,659,440,698,578,
659,523,494,330,523,494,440,0
};
const unsigned int MusicalTime[56] PROGMEM=
{
600,200,600,200,400,200,200,400,400,600,200,600,
200,400,200,200,800,400,400,400,200,200,400,200,
200,400,400,400,200,600,200,200,200,200,200,800,
400,400,400,200,200,400,200,200,400,400,400,200,
600,200,200,200,200,200,800,0
};
void fnMusic(void)//产生音乐
{
if(++Musictime_1ms>=mBitTm)
{
Musictime_1ms=0;
Musicfrequency = pgm_read_word_near(MusicalScale + mNoteCn);
OCR1A=4000000/Musicfrequency;
mBitTm = pgm_read_word_near(MusicalTime+mNoteCn);
if (++mNoteCn >= 57)
{
mNoteCn=0;
}
}
}
/*************来电显示*************/
unsigned char FSKFlag;
#define LogicOne 4000000/1200
#define LogicZero 4000000/2200
unsigned char tFSKPhoneNumber[11]=
{
0x04,0x09,0x30,0x38,0x30,0x31,0x31,
0x30,0x30,0x30,0x30
};
void fnSFSKBit(void)
{
SetBit(PORTD,5);
while (bit_is_clear(TIFR,OCF1A)); // O/P H to L
SetBit(TIFR,OCF1A);
ClrBit(PORTD,5);
while (bit_is_clear(TIFR,OCF1A)); // O/P H to L
SetBit(TIFR,OCF1A);
}
void fnTxFSKCallID(void)
{
unsigned char mFSKDATA;
unsigned char mTxBit;
unsigned char mCS;
unsigned char j,i;
TCNT1 =0;
SetBit(TIFR,OCF1A);
for (i=0;i<150;i++)
{
OCR1A = LogicZero;
fnSFSKBit();
OCR1A = LogicZero;
fnSFSKBit();
OCR1A = LogicOne;
fnSFSKBit();
}
for (i=0;i<180;i++)
{
OCR1A = LogicOne;
fnSFSKBit();
}
mCS=0;
for (i=0; i<11; i++)
{
OCR1A = LogicZero;
fnSFSKBit();
OCR1A = LogicZero;
fnSFSKBit();
mFSKDATA= tFSKPhoneNumber[i];
mCS-=mFSKDATA;
mTxBit = 1;
for (j =0; j<8; j++)
{
if ( mFSKDATA & mTxBit)
{
OCR1A = LogicOne;
fnSFSKBit();
}
else
{
OCR1A = LogicZero;
fnSFSKBit();
OCR1A = LogicZero;
fnSFSKBit();
}
mTxBit <<=1;
}
OCR1A = LogicOne;
fnSFSKBit();
}
OCR1A = LogicZero;
fnSFSKBit();
OCR1A = LogicZero;
fnSFSKBit();
mFSKDATA= mCS;
mTxBit = 1;
for (j =0; j<8; j++)
{
if ( mFSKDATA & mTxBit)
{
OCR1A = LogicOne;
fnSFSKBit();
}
else
{
OCR1A = LogicZero;
fnSFSKBit();
OCR1A = LogicZero;
fnSFSKBit();
}
mTxBit <<=1;
}
OCR1A = LogicOne;
fnSFSKBit();
}
/**********************************/
/***********振铃*************/
void fnOSCRingFK(void)//振铃声,5秒断续,即1秒送、4秒断
{
unsigned char i,mRot;
mRot=1;
if(ExtTelRingState)
{
if (ExtTelRingState^mExtTelRSTSav) // if Ring is just start
{
FSKFlag=1; //内部来电显示标志
for(i=0;i<cExtTelNum;i++)
{
if( !(ExtTelRingState & mRot) )
{
Writesoundway(SigCallID,i,OFF); //连接响铃
}
else
{
Writesoundway(SigCallID,i,ON); //连接响铃
}
mRot<<=1;
}
}
timeover_RingFK++;
if(timeover_RingFK==1000)
{
ClrBit(PORTD,OSCRingFK);
if(!OutsideRingCheck && FSKFlag) //内部来电显示,避开外部来电显示
{
FSKFlag=0;
Writesoundway(SigCallID,cX_Music,ON);
fnTxFSKCallID();
Writesoundway(SigCallID,cX_Music,OFF);
}
}
else if(timeover_RingFK>=5000)
{
SetBit(PORTD,OSCRingFK);
timeover_RingFK=0;
}
}
else // No Ring Request
{
ClrBit(PORTD,OSCRingFK);
timeover_RingFK=5000;
if(mExtTelRSTSav ||(mExtTelSCheckSav^ExtTelStateCheck))
{
for(i=0;i<cExtTelNum;i++)
{
if(!(ExtTelStateCheck & mRot) && !(ExtTelFlashState & mRot))//挂机
{
Writesoundway(SigCallID,i,ON); //连接响铃
}
mRot<<= 1;
}
}
}
mExtTelSCheckSav =ExtTelStateCheck;
mExtTelRSTSav = ExtTelRingState;
}
/**********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -