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

📄 op_8980.c

📁 单片机C51 源程序
💻 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 + -