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

📄 main.c

📁 DTMF FSK 在51 上的实现
💻 C
字号:
                                                
//                                                                           
//                                                                           
//   PROGRAM DESCRIPTION: This is the main process                                                   
//                                                                           
//   ADDITIONAL DOCUMENTATION:                                               
//         Flow Chart:                                                       
//         Support Doc's:                                                    
//                                                                           
//   INPUTS:                                                                 
//   OUTPUTS:                                                                
//   REGISTERS USED:                                                         
//   SUBROUTINE CALLS:                                                       
//   CALLED BY:                                                              
//                                                                           
//   REVISION HISTORY:                                                       
//                                                                           
//   DATE        REVISED BY        DESCRIPTION OF CHANGE                     
// ------------------------------------------------------------------------- 


// tested under the Fosc = 12 Mhz.


#include<reg51f.h>
#include"DTMF.h"
#include"PCA.h"
#include"main_header.h"
#include"CFSK.h"

bit DTMF_process_flag;
bit CFSK_process_flag;
bit Timer2_timeout_flag;

void delay(unsigned int i)
{
    for(;i>0;i--)
	{}
}
void initialize(void)
{
    unsigned int i;
	i=0;
	CKCON =CKCON_ini;
    CCON  =CCON_ini;
	CMOD  = CMOD_ini;
	IP    = IP_ini;
	IPH   = IPH_ini;
	SCON  = SCON_ini;
	TCON  = TCON_ini;
	T2CON = T2CON_ini;
	TMOD  = TMOD_ini;
	T2MOD = T2MOD_ini;

	TH0 = 0xfc;
	TL0 = 0x21;
	IE = 0X80;
	TR0= 1;
	ET0= 1;
}
void Timer0_reload(void)
{
    TR0 = 0;
    TH0 = 0xfc;
	TL0 = 0x21;
	TR0 = 1;
	ET0 = 1;
}
void Timer0_isr(void)
{//timer0 1ms interrupt service routine. increase the pointer every 1ms
	//dtmf 1ms counter
    if(DTMF_1ms_timer)
	    DTMF_1ms_count++;
    //cfsk 1ms counter
	if(CFSK_1ms_timer)
	    CFSK_1ms_count++;
    //data receive capture interrupt service routine
	if(DTMF_capture_flag)
	{
	    if(DTMF_10ms_count<DTMF_capture_window)
		    DTMF_10ms_count++;
		else
		{
			if((PCA_capture_count>DTMF_1300)&&(PCA_capture_count<DTMF_1500))
			    received_tone=1400;
			else if((PCA_capture_count>DTMF_2200)&&(PCA_capture_count<DTMF_2400))
			    received_tone=2300;
			else
			    received_tone=PCA_capture_count;

			CEX2_first_period=1;
			PCA_capture_count=0;
			DTMF_10ms_count=0;
		}
	}
}
void Timer2_reload(void)
{/// 3.33ms mer2 interrupt value reload
    TR2 = 0;
	TL2 = 0x00;
	TH2 = 0xf3;
	TR2 = 1;
	ET2 = 1;
}
void Timer2_isr(void)
{
    if(CFSK_start_bit&&CFSK_capture_flag)
	{
		//start bit detected, this is one bit of a message
		if(!CFSK_bit_counter)
		{
			CCAPM2=PCA_CAPTURE_ON;
			CFSK_bit_counter++;
        }
        else if(CFSK_bit_counter<9)
		{

		    // here we check the bit is 1 or 0;
		    if(CFSK_bit_counter==1)
		        CFSK_bit_counter=1;
		        
		    CFSK_received_byte>>=1;
		    if(current_period<0x3AD)
			{
			    CFSK_received_byte|=0x80;
			}
		    // save the received bit into the byte buffer;
		    CFSK_bit_counter++;
		    CCAPM2=PCA_CAPTURE_ON;
		}
		else
		{
			// this is 9th bit:stop bit.
			//one byte have been received. reset and start new byte capture.
			//reset the start bit flag
			if(CFSK_bit_counter==1)
		        CFSK_bit_counter=1;
		        
		    CFSK_start_bit=0;
			CFSK_bit_counter=0;
			
			if(CFSK_byte_counter>0)
			{
	    	    /*******we receive 2 bytes as a message, store the data*******/
			    CFSK_receive_buf[test_char]=CFSK_received_byte;								
			    // set the request message flag, turn off PCA 2
			    if(CFSK_receive_buf[test_char]!=0)
			    {
			    	CFSK_request_flag=1;
		    	}
				CFSK_capture_flag=0;
				CCAPM2 = PCA_OFF;
				Timer0_reload();
				CFSK_byte_counter=0;
			}
			else
			{
				// this is the first byte of a message;
	  		  	CFSK_receive_buf[test_char]=CFSK_received_byte;
				//stop the timer 2 interrupt
				ET2=0;
				CFSK_byte_counter++;
				CCAPM2=PCA_CAPTURE_ON;
			}
			test_char++;
	    }
	}
	else if(CFSK_transmit_flag)
	{
        // this is CFSK tranmit routine
	    if(!CFSK_bit_counter)
		{
		    if(CFSK_byte_counter<CFSK_message_lenth)
			{
				// load the next data
				if(CFSK_message_lenth==6)
					CFSK_send_byte=CFSK_send_buf[CFSK_byte_counter];
				else
					CFSK_send_byte=CFSK_send_buf1[CFSK_byte_counter];
	    	}
	    	else
	    	{
	    		//
			    CFSK_transmit_flag=0;
			    CFSK_byte_counter=0;
			    ET2=0;
		    }
		    // increase the pointer;
		    CFSK_bit_counter++;
		}
		else if(CFSK_bit_counter==1)
		{
			//we send the start bit here;
			send_cfsk_bit(0);
			// increase the pointer;
			CFSK_bit_counter++;
		}
		else if(CFSK_bit_counter<10)
		{
		    // send the data
		    send_cfsk_bit(CFSK_send_byte);
		    // shift data left;
		    CFSK_send_byte>>=1;
		    CFSK_bit_counter++;
		}
		else
		{
			// send the stop bit;
			send_cfsk_bit(1);
			// one byte have been sent out ,let's reset
			CFSK_byte_counter++;
			CFSK_bit_counter=0;
		}
	}
}

void main()
{
    //----------------------This is the main entrance-----------
	initialize();
	SEIZE= 1;
	HOOK = 0;
	delay(50000);
	delay(50000);
	GAIN_CHN = 0;
	PULSE=0;
	delay(50000);
	DTMF_process_flag = 0;
	CFSK_process_flag = 1;
	test_char=0;
	while(1)
	{
        if(DTMF_process_flag)
    	    DTMF_process();
		else if(CFSK_process_flag)
		    CFSK_process();
	}
}
//----------------------below functions are the interrupt entrance-----------
void Int0(void)   interrupt 0
{
    
}
void Timer0(void) interrupt 1
{//1ms fixed interrupt
    Timer0_reload();
	Timer0_isr();
}
void Int1(void)   interrupt 2
{

}
void Timer1(void) interrupt 3
{

}
void Serial(void) interrupt 4
{
    
}
void Timer2(void) interrupt 5
{
	//used for frequency detecting and transmiting cfsk message
    Timer2_reload();
    // jump to interrupt service routine.
	Timer2_isr();
	TF2=0;
}
void PCA(void)    interrupt 6
{//PCA interrupt
	if(CCF2)
	{
	    CCF2=0;
	    CEX2_isr();
	}
    if(CCF0)
    {
	    CCF0=0;
	    CEX0_isr();
	}
	else if(CCF1)
	{
	    CCF1=0;
	    CEX1_isr();
	}
}

⌨️ 快捷键说明

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