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

📄 scpu.c

📁 单片机C51 源程序
💻 C
字号:
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

#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 9
#define OFF_HOOK_8F 10
#define RING_07 8
#define RING_8F 9
#define TEST_07 10
#define TEST_8F 11
#define REVERSAL_07 12
#define REVERSAL_8F 13
#define DTMF_TS 16

uchar delay, err=0;
uchar xdata *RecBufPtr =  RAM_ADDR;

uchar data pre_status[2] = {0xff,0xff};
uchar data cur_status ;

uchar data TimeCount100ms = 25;
uchar data TimeCount1s = 250;
uint data TimeCount4s = 1000;
uchar xdata UserStatus[16];
uchar xdata CallUser[16];
uchar xdata AnswerUser[16];
uchar xdata RingOn[16];
uchar xdata TelNumber[16][3];
uchar xdata ConvertTelNumber[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uint xdata *UserStatusPtr = UserStatus;
uint xdata *CallUserPtr = CallUser;
uint xdata *AnswerUserPtr = AnswerUser;
uint xdata *RingOnPtr = RingOn;


sbit p10 = P1^0;
sbit p16 = P1^6;
bit TxFlag = 0;
bit RxFlag = 0;
bit CallFlag = 0;

void connect(uint control, uchar input_stream, uchar input_channel, uchar output_stream, uchar output_channel);
void disable(uint control, uchar stream, uchar channel);
uchar ReadData(uint control,uchar stream, uchar channel);
void ControlSignal(uint control, uchar stream, uchar channel, uchar message);
void enable(uint control, uchar stream, uchar channel);
void InitialScpu(void);
void ScanUserStatus(void);
void StatusAnalysis(void);
void RingControl(void);
void DisableRing(void);
void Timer0Int(void);
void delayxs(uchar);
void SendDataToMcpu(uchar);
uchar ReadDataFromMcpu(void);
void Compare(uchar, uchar);

void main(void)
{
//   uchar temp;

   InitialScpu();
    disable(CONTROL_1,5, 15);
                        disable(CONTROL_1,6, 31);

   p16 = 0;
   _nop_();
   p16 = 1;

   while(1)
   {
        uchar i,j,k,tmp ;
        uchar call_num=0;

        cur_status = ReadData(CONTROL_2, 5, 8);
        while(!(cur_status == 0x07));
        
         cur_status = ReadData(CONTROL_2, 5, 9);
         while(!(0x01&cur_status));
         
           ControlSignal(CONTROL_2, 5, 9, 0x80);
           while(!(0x80 & ReadData(CONTROL_2, 5, 10)));
           ControlSignal(CONTROL_2, 5, 9, 0x00);
           connect(CONTROL_1, 5, 15, 5, 0);
 			enable(CONTROL_1,5, 0);
                        connect(CONTROL_1, 5, 0, 5, 15);
 			enable(CONTROL_1,5, 15);
                         tmp=ReadData(CONTROL_2, 5, 9);
                        while(!(0x00&tmp));
                        disable(CONTROL_1,5, 15);
                         disable(CONTROL_1,5, 0);
                         while(1);
                         
                        
                        
                        


/*   
        cur_status =~ReadData(CONTROL_2, 6, 26);

        if(0x80&cur_status)
        {       connect(CONTROL_1, 0, 1, 6, 31);
 			enable(CONTROL_1,6, 31);
                ControlSignal(CONTROL_2, 6, 25, 0x80);

                tmp = ReadData(CONTROL_2, 5, 9);
                while(!(0x80&tmp))
                {
                RingControl();
                tmp = ReadData(CONTROL_2, 5, 9);
                }
                      ControlSignal(CONTROL_2, 5, RING_8F, 0x00);
        	       connect(CONTROL_1, 5, 15, 6, 31);
 			enable(CONTROL_1,6, 31);
                        connect(CONTROL_1, 6, 31, 5, 15);
 			enable(CONTROL_1,5, 15);

                 while(1);
          }
                                      */
        /*
        connect(CONTROL_1, 0, 1, 5, 0);
 			enable(CONTROL_1,5, 0);
         ControlSignal(CONTROL_2, 6, 25, 0x80);
        	connect(CONTROL_1, 5, 0, 6, 31);
 			enable(CONTROL_1,6, 31);
            connect(CONTROL_1, 6, 31, 5, 0);
 			enable(CONTROL_1,5, 0);
                        disable(CONTROL_1,5, 0);
                        disable(CONTROL_1,6, 31);    */
        }
 }

           /* while(!RxFlag);
    		temp = ReadDataFromMcpu();
    		RxFlag = 0;

            if(RecBufPtr<=0x7fff)
            {
            	 *RecBufPtr = temp;
                 rx_data = temp;
                 RecBufPtr++;
            }
            else
            {
                 RecBufPtr = RAM_ADDR;
                 *RecBufPtr = temp;
          	     rx_data = temp;
                 RecBufPtr++;
            }
            Compare(tx_data, rx_data);    */



          /*

		if(!TimeCount100ms)
		{
			TimeCount100ms = 25;
			ScanUserStatus();
		}

		for(i=0;i<16;i++)
		{
			if(0x80 & UserStatus[i])				//主叫摘机
			{
				 CallUser[call_num] = &(UserStatusPtr+i);
				 connect(CONTROL_1, 0, 1, 5, CallUser[call_num]);
 				 enable(CONTROL_1,5, CallUser[call_num]);
 				 connect(CONTROL_1, 5, CallUser[call_num], 0, DTMF_TS+i);
 				 enable(CONTROL_1,0, DTMF_TS+i);
 				 call_num++;
 			}

			else if(0x02 & UserStatus[i])		//被叫摘机
			{

			}



 		}

        for(k=0;k<call_num;k++)
 	    {
 		   if(0x08&ReadData(CONTROL_2,0,DTMF_TS+k))
 		   {
 				disable(CONTROL_1,5, CallUser[k]);
 				TelNumber[k][2] = ReadData(CONTROL_2,0,DTMF_TS+k);
 				while(!(0x08&ReadData(CONTROL_2,0,DTMF_TS+k)));
 				TelNumber[k][1] = ReadData(CONTROL_2,0,DTMF_TS);

 				TelNumber[k][0] = CallUser[k];

 				disable(CONTROL_1,0, DTMF_TS+k);

 				SendDataToMcpu(TelNumber[k][0]);
 				SendDataToMcpu(TelNumber[k][1]);
 				SendDataToMcpu(TelNumber[k][2]);
 		   }
 		   RingOn[k] = TelNumber[k][1] + TelNumber[k][0]>>4;
 	   }

 	   RingControl();

 	   for(i=0;i<16;i++)
 	   {
 			for(j=0;j<16;j++)
 			{
 				if(0x0f&RingOn[i]==0x0f&CallUser[j])
 					AnswerUser[i] = RingOn[i];
 			}

 	   }

 	   ControlSignal(CONTROL_2, 5, RING_07, 0x00);
       ControlSignal(CONTROL_2, 5, RING_8F, 0x00);

       connect(CONTROL_1, 5, 0x0f&RingOn[0], 5, 0x0f&&CallUser[0]);
 	   enable(CONTROL_1,5, 0x0f&CallUser[0]);
 	   connect(CONTROL_1, 5, 0x0f&CallUser[0], 5,0x0f&&RingOn[0] );
 	   enable(CONTROL_1, 5,0x0f&RingOn[0]);

 	}

 }
                    */

void InitialScpu(void)
{
    p10 = 1;
    p16 = 1;
    IE = 0;

	IP = 0x02;
	TMOD = 0x01;
	TR0 = 0;
	TL0 = (65536-4000) & 0xff;				//4ms
	TH0 = (65536-4000) >> 8;
	IT0 = 1;
	ET0 = 1;
	EX0 = 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);

    ControlSignal(CONTROL_2, 6, 24, 0x00);
    ControlSignal(CONTROL_2, 6, 25, 0x00);
    ControlSignal(CONTROL_2, 6, 26, 0x00);
    ControlSignal(CONTROL_2, 6, 27, 0x00);



}


/**********************************************************************************************
*
* This routine sets up a connection between an input channel and an output
* channel.
*
***********************************************************************************************/

void connect(uint control, uchar input_stream, uchar input_channel, uchar output_stream, uchar output_channel)
{
	uchar temp;
	uchar 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(uint control, uchar stream, uchar channel)
{
	uchar 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(uint control, uchar stream, uchar channel)
{
	uchar 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(uint control,uchar stream, uchar channel, uchar message)
{

		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;

 }


uchar ReadData(uint control,uchar stream, uchar channel)
{
	uchar temp;

	XBYTE[control] = SPLIT | stream;			//  0x85;

	delay = 0;

	temp = XBYTE[control + 0x20 + channel];
    temp = XBYTE[control + 0x20 + channel];
	delay = 0;

	return(temp);


}


void Timer0Int(void) interrupt 1 using 2
{
	 TR0 = 0;
     TimeCount1s--;
     TimeCount4s--;
     TimeCount100ms--;
	 TL0 = (65536-4000) & 0xff;
	 TH0 = (65536-4000) >> 8;
	 TR0 = 1;

 }

void ExInt0(void) interrupt 0 using 3
{
	EX0 = 0;
	RxFlag = 1;
	EX0 = 1;

}

/***************************************************************
*   D7: 主叫摘机;D6: 挂机;D4: 通话;D1: 被叫摘机;D0:  振铃  *
***************************************************************/

void ScanUserStatus(void)
{
	uchar i;

	cur_status = ~ReadData(CONTROL_2, 5, OFF_HOOK_07);
	if(~cur_status&pre_status[0])
	{
		for(i=0;i<8;i++)
		{
			if(0x01&(~cur_status>>i))
			{
				if(!(0x01 & CallUser[i]))
					CallUser[i] = 0x80 | CallUser[i];			//主叫摘机
				else
					CallUser[i] = 0x02;						    //被叫摘机
			}
		}
	}
	pre_status[0] = cur_status;

    cur_status = ~ReadData(CONTROL_2, 5, OFF_HOOK_8F);
	if(~cur_status&pre_status[1])
	{
		for(i=0;i<8;i++)
		{
			if(0x01&(~cur_status>>i))
			{
				if(!(0x01 & CallUser[i+8]))
					CallUser[i+8] = 0x80 | CallUser[i+8];
				else
					CallUser[i+8] = 0x02;
			}
		}
	}
	pre_status[1] = cur_status;

}


void RingControl(void)
{
	uchar i;

//	for(i=0;i<16;i++)
//	{
	/*	if(RingOn[i]<8)
			ControlSignal(CONTROL_2, 5, RING_07, ConvertTelNumber[RingOn[i]]);
		else    */
			ControlSignal(CONTROL_2, 5, RING_8F, 0x80);
    //	TimeCount1s = 250;
    	if(!TimeCount1s)
    	{
    		ControlSignal(CONTROL_2, 5, RING_07, 0);
    		ControlSignal(CONTROL_2, 5, RING_8F, 0);
    		TimeCount4s = 1000;
    		if(!TimeCount4s)
    		{
    		/*	if(RingOn[i]<8)
					ControlSignal(CONTROL_2, 5, RING_07, ConvertTelNumber[RingOn[i]]);
				else     */
					ControlSignal(CONTROL_2, 5, RING_8F, 0x80);
    			TimeCount1s = 250;
    		}
    	}
   // }

}


void DisableRing(void)
{
	ControlSignal(CONTROL_2, 5, RING_07, 0x00);
   	ControlSignal(CONTROL_2, 5, RING_8F, 0x00);

}

void delayxs(uchar time)
{
	uchar i, j;
	for(j=0;j<time;j++)
		for(i=0;i<0xff;i++)
			_nop_();
}


void SendDataToMcpu(uchar tx_data)
{
	XBYTE[COMM_CPU] = tx_data;
	delayxs(10);
 	p10 = 1;
    _nop_();
    p10 = 0;
    _nop_();
    p10 = 1;
}


uchar ReadDataFromMcpu(void)
{
	uchar temp;
	temp = XBYTE[COMM_CPU];
	return(temp);
}

void Compare(uchar tx_value, uchar rx_value)
{
	if(tx_value == rx_value)
		err = 0;
	else
		err++;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -