📄 op_8980.c
字号:
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define RAM_ADDR 0x0000
#define CONTROL_1 0x8000
#define CONTROL_2 0xa000
#define COMM_CPU 0xc000
#define CMH 0x18
#define CML 0x10
#define DAT 0x08
#define MSGMODE 0x40
#define SPLIT 0x80
#define OFF_HOOK_07 8
#define OFF_HOOK_8F 9
#define RING_07 8
#define RING_8F 9
#define TEST_07 0xa
#define TEST_8F 0xb
#define REVERSAL_07 0xc
#define REVERSAL_8F 0xd
#define DTMF_TS 21
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE delay;
BYTE data user_status[16] _at_ 0x40;
BYTE data pre_status[2] _at_ 0x30;
BYTE data cur_status[2] _at_ 0x38;
BYTE data TimeCount100ms = 25;
BYTE data TimeCount1s = 250;
WORD data TimeCount4s = 1000;
BYTE data InitiaCallOffhook _at_ 0x48;
BYTE data PassiviteCallOffhook _at_ 0x4f;
BYTE xdata PassiviteCallConnect[16] _at_ 0x0050;
BYTE xdata PassiviteCallOnhook[16] _at_ 0x0060;
sbit p11 = P1^1;
void connect(WORD control, BYTE input_stream, BYTE input_channel, BYTE output_stream, BYTE output_channel);
void disable(WORD control, BYTE stream, BYTE channel);
BYTE ReadData(WORD control,BYTE stream, BYTE channel);
void ControlSignal(WORD control, BYTE stream, BYTE channel, BYTE message);
void enable(WORD control, BYTE stream, BYTE channel);
void InitialCpu(void);
void ScanUserStatus(void);
void StatusAnalysis(void);
void RingControl(void);
void DisableRing(void);
void Timer0Int(void);
void delayxs(BYTE);
void main(void)
{
BYTE i, temp;
InitialCpu();
while(1)
{
//ControlSignal(CONTROL_2, 0, 15, 0x10);
//ControlSignal(CONTROL_2, 0, 14, 0x40);
connect(CONTROL_1, 5, 0, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
connect(CONTROL_1, 0, 15, 5, 0);
enable(CONTROL_1,5,0);
connect(CONTROL_1, 0, 5, 5, 15);
enable(CONTROL_1,5,15);
// disable(CONTROL_1,5,0);
// disable(CONTROL_1,5,15);
}
}
/*
while(1){ // ControlSignal(CONTROL_2, 0, 15, 0x00);
// ControlSignal(CONTROL_2, 0, 14, 0x0);
connect(CONTROL_1, 0, 1, 5, 0); //送拨号音
enable(CONTROL_1,5,0);
{
TimeCount1s = 250;
if(PassiviteCallOffhook)
ControlSignal(CONTROL_2, 5, RING_8F, 0x80);
}
while(!TimeCount100ms)
{
TimeCount100ms = 25;
ScanUserStatus();
if(cur_status[0]&0x01)
{
connect(CONTROL_1, 0, 1, 5, 0); //送拨号音
enable(CONTROL_1,5,0);
connect(CONTROL_1, 5, 0, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 0;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[0]&0x02)
{ connect(CONTROL_1, 0, 1, 5, 1); //送拨号音
enable(CONTROL_1,5,1);
connect(CONTROL_1, 5, 1, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 1;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58)
PassiviteCallOffhook = 1; //读取DTMF号码
}
else if(cur_status[0]&0x04)
{
connect(CONTROL_1, 0, 1, 5, 2); //送拨号音
enable(CONTROL_1,5,2);
connect(CONTROL_1, 5, 2, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 2;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[0]&0x08)
{
connect(CONTROL_1, 0, 1, 5, 3); //送拨号音
enable(CONTROL_1,5,3);
connect(CONTROL_1, 5, 3, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 3;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[0]&0x10)
{
connect(CONTROL_1, 0, 1, 5, 4); //送拨号音
enable(CONTROL_1,5,4);
connect(CONTROL_1, 5, 4, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 4;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[0]&0x20)
{
connect(CONTROL_1, 0, 1, 5, 5); //送拨号音
enable(CONTROL_1,5,5);
connect(CONTROL_1, 5, 5, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 5;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[0]&0x40)
{
connect(CONTROL_1, 0, 1, 5, 6); //送拨号音
enable(CONTROL_1,5,6);
connect(CONTROL_1, 5, 6, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 6;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[0]&0x80)
{
connect(CONTROL_1, 0, 1, 5, 7); //送拨号音
enable(CONTROL_1,5,7);
connect(CONTROL_1, 5, 7, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 7;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else
{ connect(CONTROL_1, 0, 1, 5, InitiaCallOffhook);
enable(CONTROL_1,5,InitiaCallOffhook);
connect(CONTROL_1, 0, 1, 5, 15);
enable(CONTROL_1,5,15);
InitiaCallOffhook = 0; }
if(cur_status[1]&0x01)
{
connect(CONTROL_1, 0, 1, 5, 8); //送拨号音
enable(CONTROL_1,5,8);
connect(CONTROL_1, 5, 8, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 8;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[1]&0x02)
{
connect(CONTROL_1, 0, 1, 5, 9); //送拨号音
enable(CONTROL_1,5,9);
connect(CONTROL_1, 5, 9, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 9;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[1]&0x04)
{
connect(CONTROL_1, 0, 1, 5, 10); //送拨号音
enable(CONTROL_1,5,10);
connect(CONTROL_1, 5, 10, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 10;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[1]&0x08)
{
connect(CONTROL_1, 0, 1, 5, 11); //送拨号音
enable(CONTROL_1,5,11);
connect(CONTROL_1, 5, 11, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 11;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[1]&0x10)
{
connect(CONTROL_1, 0, 1, 5, 12); //送拨号音
enable(CONTROL_1,5,12);
connect(CONTROL_1, 5, 12, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 12;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[1]&0x20)
{
connect(CONTROL_1, 0, 1, 5, 13); //送拨号音
enable(CONTROL_1,5,13);
connect(CONTROL_1, 5, 13, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 13;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[1]&0x40)
{
connect(CONTROL_1, 0, 1, 5, 14); //送拨号音
enable(CONTROL_1,5,14);
connect(CONTROL_1, 5, 14, 0, DTMF_TS); //接通1#收号器
enable(CONTROL_1,0,DTMF_TS);
InitiaCallOffhook = 14;
if(ReadData(CONTROL_2,0,DTMF_TS) == 0x58) //读取DTMF号码
PassiviteCallOffhook = 1;
}
else if(cur_status[1]&0x80)
{
ControlSignal(CONTROL_2, 5, RING_8F, 0x00);
InitiaCallOffhook = 0;
connect(CONTROL_1, 5, 0, 5, 15);
enable(CONTROL_1,5,15);
connect(CONTROL_1, 5, 15, 5, 0);
enable(CONTROL_1,5,0);
}
else
{
connect(CONTROL_1, 0, 1, 5, InitiaCallOffhook);
enable(CONTROL_1,5,InitiaCallOffhook);
connect(CONTROL_1, 0, 1, 5, 15);
enable(CONTROL_1,5,15);
}
}
}
}
*/
void InitialCpu(void)
{
BYTE i;
IE = 0;
//PSW =0;
IP = 0x02;
TMOD = 0x01;
TR0 = 0;
TL0 = (65536-4000) & 0xff; //定时4ms
TH0 = (65536-4000) >> 8;
ET0 = 1;
EA = 1;
TR0 = 1;
ControlSignal(CONTROL_2, 5, RING_07, 0x00);
ControlSignal(CONTROL_2, 5, RING_8F, 0x00);
ControlSignal(CONTROL_2, 5, TEST_07, 0x00);
ControlSignal(CONTROL_2, 5, TEST_8F, 0x00);
}
/**********************************************************************************************
*
* This routine sets up a connection between an input channel and an output
* channel.
*
***********************************************************************************************/
void connect(WORD control, BYTE input_stream, BYTE input_channel, BYTE output_stream, BYTE output_channel)
{
BYTE temp;
BYTE connection_pointer;
XBYTE[control] = 0x18 + output_stream; // Select CMH of the output stream
delay = 0; // Software delay
temp = XBYTE[control + 0x20 + output_channel]; // Store the contents of CMH
temp = XBYTE[control + 0x20 + output_channel];
temp = temp & 0xFB; //Enable connection mode by setting bit 2 of CMH low
XBYTE[control + 0x20 + output_channel] = temp;
delay = 0;
XBYTE[control] = 0x10 + output_stream; // Select CML of output stream
connection_pointer = input_stream; // Assemble connection pointer
connection_pointer = connection_pointer << 5;
connection_pointer = connection_pointer + input_channel;
XBYTE[control + 0x20 + output_channel] = connection_pointer; // Set up connection
delay = 0;
}
/****************************************
*
* This routine enables a channel.
*
****************************************/
void enable(WORD control, BYTE stream, BYTE channel)
{
BYTE temp;
XBYTE[control] = 0x18 + stream; // Go to CMH of stream
temp = XBYTE[control + 0x20 + channel]; // Store contents of CMH
temp = XBYTE[control + 0x20 + channel];
temp = temp | 1; // Enable channel by setting bit 0 of CMH high
XBYTE[control + 0x20 + channel] = temp;
delay = 0;
}
/****************************************
*
* This routine disables a channel.
*
****************************************/
void disable(WORD control, BYTE stream, BYTE channel)
{
BYTE temp;
XBYTE[control] = 0x18 + stream; // Go to CMH of stream
temp = XBYTE[control + 0x20 + channel]; // Store contents of CMH
temp = XBYTE[control + 0x20 + channel];
temp = temp & 0xFE; // Disable channel by setting bit 0 of CMH low
XBYTE[control + 0x20 + channel] = temp;
delay = 0;
}
/*************************************************************************************************************
*
* This routine places a channel in message mode and places a bit pattern in the channel.
*
*************************************************************************************************************/
void ControlSignal(WORD control,BYTE stream, BYTE channel, BYTE message)
{
BYTE temp;
XBYTE[control] = MSGMODE | CMH | stream;
delay = 0;
XBYTE[control + 0x20 + channel] = 0x05;
delay = 0;
XBYTE[control] = MSGMODE | CML | stream;
delay = 0;
XBYTE[control + 0x20 + channel] = message; // Write message to channel
delay = 0;
}
BYTE ReadData(WORD control,BYTE stream, BYTE channel)
{
BYTE temp;
XBYTE[control] = SPLIT | stream; // 0x85;
delay = 0;
temp = XBYTE[control + 0x20 + channel];
temp = XBYTE[control + 0x20 + channel];
delay = 0;
return(temp);
}
void delayxs(BYTE time)
{
BYTE i,j, k;
for(i=0;i<time;i++)
for(j=0;j<0xff;j++)
for(k=0;k<0xff;k++)
_nop_();
_nop_();
}
void Timer0Int(void) interrupt 1 using 2
{
TR0 = 0;
TimeCount1s--;
TimeCount4s--;
TimeCount100ms--;
TL0 = (65536-4000) & 0xff;
TH0 = (65536-4000) >> 8;
TR0 = 1;
}
void ScanUserStatus(void)
{
cur_status[0] = ReadData(CONTROL_2, 5, OFF_HOOK_07);
cur_status[1] = ReadData(CONTROL_2, 5, OFF_HOOK_8F);
}
void RingControl(void)
{
ControlSignal(CONTROL_2, 5, RING_8F, 0x04);
if(!TimeCount1s)
{
ControlSignal(CONTROL_2, 5, RING_8F, 0x00);
TimeCount1s = 250;
TimeCount4s = 1000;
}
if(!TimeCount4s)
{
ControlSignal(CONTROL_2, 5, RING_8F, 0x04);
TimeCount4s = 1000;
}
}
void DisableRing(void)
{
ControlSignal(CONTROL_2, 5, RING_07, 0x00);
ControlSignal(CONTROL_2, 5, RING_8F, 0x00);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -