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

📄 main.c

📁 一种51单片机接收电话线上DTMF
💻 C
字号:
#include ".\pubDcl.dcl"
#include ".\reg52.h"
#include ".\extio.h"
#include ".\valuedef.h"

#include ".\display.c"
#include ".\otimer.c"
#include ".\ht9200.c"
//#include ".\okey.c"
#include ".\serial.c"
/*
void senddata_init()
{
	uchar i ;
	send_number[0] = 8 ;
	send_number[1] = 0 ;
	send_number[2] = 5 ;
	for(i=3;i<Maxnumber;i++)
	{
		send_number[i] = 0xff ;		//初始化拨号的号码
	}
}

void mem_move(uchar *out,uchar *in,uchar Len)
{
	uchar i ;
	
	for(i=0;i<Len;i++)
		*(out +i) = *(in +i) ;
}

void sendnumber()				//拨号
{
	uchar i ;
	for(i=0;i<Maxnumber;i++)
	{
		if(send_number[i] != 0xff)
		{
			disp_buf[0] = send_number[i] + 0x80;
			delay(100) ;
			send_ht9200(send_number[i]) ;
		}
		else return ;
	}
}

void send_dtmf(uchar in)
{
	uchar i ;
	for(i=0;i<10;i++)			//send 0-9
	{
		disp_buf[0] = i + 0x80;
		delay(100) ;
		send_ht9200(i) ;
	}
	disp_buf[0] = in + 0x80;
	delay(100) ;
	send_ht9200(in) ;			//send in
}
*/
void SysInit()
{
	P0=0xff;
	P1=0x0f;
	P2=0xef;
	P3=0xfb;
	keylen = 0 ;
	channel = 1 ;
	set_flag = 0 ;
	play_flag = 0 ;
	ring_flag = 0 ;
	zaiji_flag = 0 ;
	P2_BUF = 0xff ;
	send_time = 0xff ;
	mem_set(send_flag,FALSE,4) ;
	mem_set(key_buf,0xff,Maxnumber) ;
	checkRING_Init() ;
	checkDV_Init() ;
	checkDXC_Init() ;
//	senddata_init() ;
}

void Sys_Start()
{
	SysInit() ; 
	Sys_TimerInit () ;
//	OKey_RP_Init() ;
	disp_Init();
	Serial_Init() ;
	delay(800) ;
	while(check_DXC() == TRUE)
	{
		Updata_1Led(17,20,0,20) ;	//disp PHDX
		ALARM = 0 ;
		delay(100) ;
		ALARM = 1 ;
		delay(250) ;
		ALARM = 0 ;
		delay(100) ;
		ALARM = 1 ;
	}
}

main()
{
	uchar temp_ret;
	uchar temp_data;
	
	Sys_Start();
	Serial_SendCommand("ok",2) ;
	while(1)
	{
/*		if((send_time>=0)&&(send_time<4)&&(send_flag[send_time] == FALSE))
		{
			SW = 1 ;
			zaiji_flag = 1 ;
			Updata_1Led(send_time+1,25,25,25) ;		//disp channel
			P3 = 0xdc | (send_time&0x03) ;			//选择通道 0-3
			sendnumber() ;					//拨号
			send_flag[send_time] = TRUE ;
			temp_ret = Sys_TimerReqire(OTimerID0,200,0) ;	//超时处理
		}*/
		temp_ret = check_RING() ;				//ring check 
		if(temp_ret == TRUE)
		{
			disp_buf[0] = 21  + 0x80 ;
			disp_buf[1] = 0 + 0x80 ;
			disp_buf[2] = 18 + 0x80 ;
			disp_buf[3] = 2 + 0x80 ;
			Serial_SendCommand("ring",4) ;
/*			ALARM = 0 ;
			delay(400) ;
			ALARM = 1 ;
			delay(500) ;
			ALARM = 0 ;
			delay(400) ;
			ALARM = 1 ;
			SW = 1 ;
			delay(100) ;
			zaiji_flag = 1 ;
			send_ht9200(0x0a) ;	//send A 
			temp_ret = Sys_TimerReqire(OTimerID0,200,0) ;		//超时处理*/
			ring_flag++ ;
			delay(800) ;
		}
		temp_ret = check_DV() ;			//check dtmf dv
		if(temp_ret == TRUE)
		{
			temp_data = DTMF_read() ;	//in data
			if(temp_data != 0xff )
			{
//				disp_buf[1] = 0 ;
//				disp_buf[2] = 0 ;
				disp_buf[0] = temp_data + 0x80;			//display
				Serial_SendCommand(&temp_data,1) ;
//				Sys_TimerRelease(OTimerID0) ;			//release timer
/*				if(temp_data == 0x0a)
				{
					delay(800) ;
					ALARM = 0 ;				//SEND MUSIC
					delay(1000) ;
					ALARM = 1 ;
					send_dtmf(0x0b) ;			//send 0-9,b
					temp_ret = Sys_TimerReqire(OTimerID0,200,0) ;		//超时处理
				}
				else if(temp_data == 0x0b)
				{
					delay(300) ;
					send_dtmf(0x0c) ;			//send c  end now start check next channel
					delay(100) ;
					SW = 0 ;
					mem_set(disp_buf,0,4) ;
					delay(500) ;
				}
				else if(temp_data == 0x0c)
				{
					send_time ++ ;
					if(send_time > 3)
					{
						SW = 0 ;
						delay(400) ;
						send_time = 0xff ;
						mem_set(send_flag,FALSE,4) ;
						Updata_1Led(12,16,21,0) ;	//disp CEND
						ALARM = 0 ;
						delay(200) ;
						ALARM = 1 ;
					}
					else
					{
						SW = 0 ;
						delay(1000) ;
					}
				}*/
//				if(ring_flag == 1)
//				{
/*					key_buf[keylen] = temp_data ;
					if(keylen<Maxnumber)  keylen ++ ;
					if(keylen>=12)
					{
						Serial_SendCommand(key_buf,keylen) ;
						keylen = 0 ;
						ring_flag = 0 ;
					}
//				}*/
			}
		}
		temp_ret = Analyse_OTimerID() ;
		if(temp_ret == OTimerID0)
		{
			SW = 0 ;
			zaiji_flag = 0 ;
			send_time = 0xff ;
			mem_set(send_flag,FALSE,4) ;
			Updata_1Led(16,23,23,0) ;
			ALARM = 0 ;
			delay(100) ;
			ALARM = 1 ;
			delay(250) ;
			ALARM = 0 ;
			delay(100) ;
			ALARM = 1 ;
		}
/*		temp_ret = OKey_RP_Scan();
		if((temp_ret!=OKey_Macro_NoKey)&&(temp_ret!=Macro_UnhandEvent))
		{
			if((temp_ret>=0)&&(temp_ret<10))
			{
				if(zaiji_flag == 1)
				{
					Updata_1Led(channel,25,25,temp_ret) ;
					send_ht9200(temp_ret) ;	//send number key
				}
				else
				{
					key_buf[keylen] = temp_ret ;
					if(keylen<Maxnumber)  keylen ++ ;
					if(keylen<2)
						mem_set(disp_buf,0,4) ;
					Updata_Number(temp_ret) ;	//disp number
				}
			}
			else if(temp_ret == 15)		//# set
			{
				if(set_flag == 1)
				{
					set_flag = 0 ;
					mem_move(send_number,key_buf,keylen) ;
					keylen = 0 ;
					ALARM = 0 ;		// set ok
					delay(200) ;
					ALARM = 1 ;
					mem_set(disp_buf,0,4) ;
				}
				else if(set_flag == 2)
				{
					set_flag = 0 ;
					channel = key_buf[keylen-1]%4 ;
					P3 = 0xdc|((channel-1)&0x03) ;
					keylen = 0 ;
					ALARM = 0 ;		// set ok
					delay(200) ;
					ALARM = 1 ;
					mem_set(disp_buf,0,4) ;
				}
			}
			else if(temp_ret == 14)		//* auto check
			{
				send_time = 0 ;		//start send
				disp_buf[3] = send_time  + 0x80 ;
			}
			else if(temp_ret == 13)		//set
			{
				set_flag ++ ;		//start set
				if(set_flag > 2)
					set_flag = 0 ;
				keylen = 0 ;
				if(set_flag == 0)
					 mem_set(disp_buf,0,4) ;
				else	 Updata_1Led(5,25,25,set_flag) ;
			}
			else if(temp_ret == 12)		//clear
			{
				SW = 0 ;
				keylen = 0 ;
				set_flag = 0 ;
				play_flag = 0 ;
				zaiji_flag = 0 ;
				send_time = 0xff ;
				P3 = 0xdc|((channel-1)&0x03) ;
				Sys_TimerRelease(OTimerID0) ;
				mem_set(send_flag,FALSE,4) ;
				mem_set(key_buf,0xff,Maxnumber) ;
				mem_set(disp_buf,0,4) ;
				delay(500) ;
			}
			else if(temp_ret == 11)		// play music
			{
				if(play_flag == 0)	//play
				{
					play_flag = 1 ;
					ALARM = 0 ;
					Updata_1Led(17,18,10,24) ;	//disp  Play
				}
				else			//stop
				{
					play_flag = 0 ;
					ALARM = 1 ;
					mem_set(disp_buf,0,4) ;	//no disp
				}
				
			}
			else if(temp_ret == 10)		//摘机或挂机
			{
				if(zaiji_flag == 0)	//摘机
				{
					zaiji_flag = 1 ;
					SW = 1 ;
					Updata_1Led(2,25,0,21) ;	//disp Z-ON
					delay(500) ;
				}
				else			//挂机
				{
					zaiji_flag = 0 ;
					SW = 0 ;
					Updata_1Led(2,25,0,22) ;	//disp Z-OF
					delay(500) ;
				}
			}
		}*/
	}
}

⌨️ 快捷键说明

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