📄 dtmf.c
字号:
//*****************************************************************
//
//dtmf信号检测
//输入:Dv,P0低四位
//输出:FDataUserReceived,CommandUser
//*****************************************************************
sbit Dv =P2^5;
sbit D0 =P2^0;
sbit D1 =P2^1;
sbit D2 =P2^2;
sbit D3 =P2^3;
sbit Clk =P3^4;
sbit Data =P2^5;
sbit Cs9200 =P3^3;
bit FDataUserReceived;
bit DataRxFlag1;
bit RxTempOkFlag;
bit RxSucessFlag;
bit AllowReadFlag;
uint RxOkTime;
uint RxfirstToSecondTime;
uint DvErrorCount;
uint ReceiveTimes;
uchar RxfirstData;
uchar RxSecondData;
uchar RxThirdData;
uchar RxTempData;
uchar FDataUserTran;
uchar FDataUserTraning;
uchar DataUserTrang;
uchar FDataUserTraningDelay;
uchar DataUserTraningDelay;
uchar FDataBusUserBusy=0;
uchar DataUserTraningDelay;
union Command
{
uint u16;
struct{uchar hi;uchar lo;}u8;
};
union Command CommandUser;
union Command CommandUserTran;
void ReceiveData(void) using 2
{
unsigned char TxTempData1;
unsigned char i;
P2=0xff;
i=P2&0x10;
CommandUser.u8.hi=0xff;
CommandUser.u8.lo=0xff;
TxTempData1=P2;
if(FDataUserReceived) return;
if(i)
{
i=0;
DvErrorCount=0;
TxTempData1=P2;
if(RxTempData==(TxTempData1&0x0f))
{
RxTempData=(TxTempData1&0x0f);
if(++RxOkTime>50)RxOkTime=20;
if((RxOkTime>6)&&AllowReadFlag) //时间都大于30ms
{
RxOkTime=1;
AllowReadFlag=0; //保持时间
if(RxTempOkFlag)
{
ReceiveTimes=0;
CommandUser.u8.hi=(RxfirstData<<4)&0xf0;
CommandUser.u8.hi=CommandUser.u8.hi|(RxSecondData&0x0f);
CommandUser.u8.lo=(RxThirdData<<4)&0xf0;
CommandUser.u8.lo=CommandUser.u8.lo|(RxTempData&0x0f);
RxTempOkFlag=0;
RxSucessFlag=1;
FDataUserReceived=1;
}
else
{
if(ReceiveTimes==2)
{
RxThirdData=RxTempData;
RxfirstToSecondTime=0;
RxTempOkFlag=1;
RxOkTime=0;
DataRxFlag1=1;
}
if(ReceiveTimes==1)
{
RxSecondData=RxTempData;
ReceiveTimes++;
RxfirstToSecondTime=0;
RxOkTime=0;
DataRxFlag1=1;
}
if(ReceiveTimes==0)
{
RxfirstData=RxTempData;
RxfirstToSecondTime=0;
ReceiveTimes++;
RxOkTime=0;
DataRxFlag1=1;
}
}
}
}
else
{
RxTempData=(TxTempData1&0x0f);
RxOkTime=0;
}
}
else
{
if(DvErrorCount>4)
{
AllowReadFlag=1;
}
if(DvErrorCount>80)
{
DvErrorCount=0;
DataRxFlag1=0;
RxOkTime=0;
RxTempData=0;
ReceiveTimes=0;
}
else
{
DvErrorCount++;
}
}
if(RxTempOkFlag)
{
if(RxfirstToSecondTime++>500)
{
RxTempOkFlag=0;
DvErrorCount=0;
ReceiveTimes=0;
}
}
}
//*****************************************************************
//
//向用户发送命令
//输入:FDataUserTran,CommandUserTran
//
//*****************************************************************
void DataUserTran(void)
{
uchar x;
if(FDataUserTran)
{
if((!FDataUserTraning)&(!FDataBusUserBusy))
{
EA=0;
Delay(10);
FDataUserTran=0;
FDataUserTraning=1;
Cs9200=1; //sent
Delay(100);
x=(CommandUserTran.u8.hi>>4)&0x0f;
DtmfGenerater(x);
Delay(120);
Cs9200=0;
Delay(30);
Cs9200=1; //sent
Delay(80);
x=(CommandUserTran.u8.hi&0x0f);
DtmfGenerater(x);
Delay(120);
Cs9200=0;
Delay(30);
Cs9200=1; //sent
Delay(80);
x=(CommandUserTran.u8.lo>>4)&0x0f;
DtmfGenerater(x);
Delay(120);
Cs9200=0;
Delay(30);
Cs9200=1;
Delay(80);
x=(CommandUserTran.u8.lo&0x0f);
DtmfGenerater(x);
Delay(100);
Cs9200=0;
Delay(50);
EA=1;
Delay(100);
DataUserTraningDelay=10;
FDataUserTraningDelay=1;
}
}
}
//*****************************************************************
//
//双音频信号发送
//
//*****************************************************************
void DtmfGenerater(uchar a)
{
uchar i;
for(i=5;i!=0;i--)
{
Data=(bit)(a&0x01);
Clk=1;
_nop_();
_nop_();
_nop_();
Clk=0;
a=a>>1;
Clk=1;
}
}
//*****************************************************************
//
//延时
//
//*****************************************************************
void Delay(uint number)
{
uchar temp;
for(;number!=0;number--,WatchDog=!WatchDog)
{ for(temp=112;temp!=0;temp--) {;} }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -