📄 main.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 + -