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

📄 main.c

📁 该程序是远程电话控制系统程序
💻 C
字号:
/****************************************************************************
* File:         MAIN.C                                                      *
* Version:      1.0                                       	       		    *
* Created:      21.06.2005                                                  *
* Last Change:  22.06.2005                                                  *
* Author:       yuanjun yin                                                 *
* Compiler:     KEIL C51 uVision2 V2.23                                     *
* Description:  89C54RD+-Firmware for MFRC500 Demo Serial Reader            *
****************************************************************************/

#include <stc89c54rd+.h>
#include "main.h"

unsigned int key_time;
uchar rxhead;
uint txhead=0;
uchar xdata receive_buf1[20];
unsigned char xdata send_buf1[20];
unsigned char data datalen;
unsigned int senddatalen;
unsigned char bell_sec;
unsigned int timecounter;
unsigned char callnumber=0;
uchar idata phonecode[]={1,3,3,8,10,10,9,9,1,1,6,0};// 本人通信号码
/////////////////////////////////////

sbit       	BELL=P4^1;
sbit 		CSE=P4^0;
sbit 		RSE=P2^1;
sbit 		WRE=P3^6;
sbit 		RDE=P3^7;
//sbit 		INT=P3^3;

sbit 		IRQ_PIN=P3^3;
///////////////////////////////////
void init(void);
unsigned char CMP_STRING(unsigned char *pt1,
                         unsigned char *pt2,unsigned char len);

unsigned char output(uchar hhh);
void write_eeprom(unsigned int addrdata,unsigned char data2);
void write_pagedata(unsigned char pagenumber);
unsigned char read_eeprom(unsigned int addrdata);
void erase_eeprom(unsigned char sectors);
void bell1(unsigned char dd);
void time2init(void);
void command_press(void);
uchar readsr(void);
void writesr(uchar a);
uchar readdata(void);
void writedata(uchar a);
void init_mt8888(void);
void dtmfout(void);
void delayms(uint n);
void sendDTMFdata(uchar d);
uchar GetDTMFdata(void);
void sendPhone(uchar *arr);	
void open_power(void);

	
unsigned char bdata flag;
//		sbit out_flag=flag^0;
//		sbit up_flag=flag^1;             //上活门标志
//		sbit down_flag=flag^2;           //下活门标志
//		sbit life_flag=flag^3;           //生死门标志
//		sbit second_flag=flag^4;         //输出二次标志
//		sbit reset_flag=flag^5;
//		sbit display_flag=flag^6;
//		sbit desk_flag=flag^7;

sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;

unsigned char bdata flag1;
//		sbit M_FLAG=flag1^0;
//		sbit HALF_FLAG=flag1^1;
//		sbit SHORT_FLAG=flag1^2;
//		sbit RCV_BIT=flag1^3;
//		sbit M_DATA_FLAG=flag1^4;
		sbit receive_flag=flag1^5;
//		sbit R_MRC=flag1^6;


unsigned char bdata flag2;
		sbit phone_flag=flag2^0;
		sbit off_flag=flag2^1;
		sbit on1_flag=flag2^2;
		sbit off1_flag=flag2^3;
//		sbit st_a4=flag2^4;
//		sbit st_a5=flag2^5;
//		sbit st_a6=flag2^6;


unsigned char bdata flag3;
//		sbit st_e=flag3^0;
//		sbit st_e1=flag3^1;
//		sbit st_e2=flag3^2;
//		sbit st_e3=flag3^3;
//		sbit st_e4=flag3^4;
//		sbit st_e5=flag3^5;
//		sbit st_e6=flag3^6;
//		sbit key_9=flag3^7;

unsigned char bdata flag4;
//		sbit X_BIT=flag4^0;
//		sbit M_KPFLG=flag4^1;
		sbit bell_flag=flag4^2;
//		sbit sec4=flag4^3;
//		sbit sec5=flag4^4;
//		sbit sec6=flag4^5;
//		sbit sec7=flag4^6;
//		sbit c_bit=flag4^7;
/****************************************************************************

****************************************************************************/
void 	main (void)
{
  unsigned char counter,counter2,ttt;
  unsigned char mfout=2;//readbuf[16];
  unsigned char tt1[2];
  unsigned char tt;
  unsigned int i;
  unsigned int count,yyjj;

  init();

	yyjj=12;
	bell1(1);
//	yyjyj=0;
	ONTEL=0;
	OUT1=1;
	OUT2=1;
	delayms(500);
	init_mt8888();
	OUT1=1;                      //打开电源
	OUT2=1;

//	sendPhone(phonecode);

//	dtmfout();
	for(;;)
	{
		if(phone_flag==1)
		{
			phone_flag=0;
			open_power();
			ONTEL=0;
		}
//		{
//			delayms(60);
//			i=GetDTMFdata();
//			i=i&0x0f;
//			if(i==5)
//			{
//				OUT1=!OUT1;
//				OUT2=!OUT2;
///			}
//		}
//		i=10;	
	}
}
void open_power(void)
{
	unsigned int ii;
	OUT1=0;
	OUT2=0;
	for(ii=0;ii<65533;ii++);
	for(ii=0;ii<65533;ii++);
	OUT1=1;
	OUT2=1;

}
/****************************************************************************

****************************************************************************/
void 	init (void)
{

		 IP=0x00;
		 TCON=1;    
		 TMOD=0x21;     //定时器0为8位自动重装;定时器1为16位计数器工作方式
		 time2init();
		      //外部中断0的触发方式为边沿方式
		 SCON=0x50;
		 PCON|=0x80;           //dual 4800X2=9600
		 TH1=TL1=0xfa;        //TH1=TL1=256-(11059200/4800/32/12+0.5)
//		 TH1=0xf8;
//		 TL1=0xa3;
		 TH0=0xfc;
		 TL0=0x21;

	     ET0=1;
	     EX0=1;
		 TR1=1;
		 TR0=1;
		 PS=1;
		 PX0=1;
		 ES=1;
		 EA=1;
}
void time2init(void)
{
	T2MOD &= 0xFC; /* T2OE=0;定时器2输出不允许 */
	T2MOD |= 0x01; /* DCEN=1;可以设置为向上/下计数:此程序中为向上达到0xff时溢出*/ 
	EXF2=0; /* reset flag 定时器2外部标志位清除*/
	TCLK=0;
	RCLK=0; /* disable baud rate generator 不用于波特率发生器*/ 
	EXEN2=0; /* ignore events on T2EX 视T2EX(P1.1)端信号无效*/ 
	TH2=0xFd;//MSB_reload_value; /* Init msb_value 填入初始化值*/ 
	TL2=0x16;//LSB_reload_value; /* Init lsb_value */ 
	RCAP2H=0xfd;//MSB_reload_value; /* reload msb_value重载值 */ 
	RCAP2L=0x16;//LSB_reload_value; /* reload lsb_value */ 
	C_T2=0; /* timer mode 定时模式*/ 
	CP_RL2=0; /* reload mode 重载模式*/ 
//	EA=1; /* interupt enable 中断允许*/ 
	ET2=1; /* enable timer2 interrupt 允许T2中断*/ 
	TR2=1; /* timer2 run 开始计时*/
}
////////////////////////////////////////////////
void bell1(unsigned char dd)
{
	if(dd==0)return;
	else
	{
		bell_flag=1;
		BELL=0;
		bell_sec=dd;
	}
}

///////////////////////////////////////////////////////////////////////////
void timer2(void) interrupt 5 using 3
{
	key_time++;
	timecounter++;
	if(key_time>30000){callnumber=0;ONTEL=0;}
	if(callnumber>200)
		{
//			OUT1=0;
//			OUT2=0;
			callnumber=0;
//			ONTEL=1;
			phone_flag=1;
		}
	TF2=0;
}
///////////////////////////////////////
void 	delay_10ms (uint _10ms)
{
 
   ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer
  while (_10ms--)
  {
	while (!TF2)
	{
//	  if (CmdValid || CmdReceived)
	  {
		TR2 = FALSE;
		TF2 = FALSE;
		return;
	  }
	}
	TF2 = FALSE;
}
  TR2 = FALSE;
}

/****************************************************************************

****************************************************************************/
void isr_timer0(void) interrupt 1 using 1
{

		EA=0;
		TL0=0x21;
		TH0=0xfc;
		EA=1;
}
/*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		uart interrupt 4
		receive_send
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
void receive_send() interrupt 4
{
		unsigned char s;
		unsigned char bcc=0;
		ES=0;
		if(RI)
		{
			RI=0;
			s=SBUF;
			if((rxhead==0)&&(s!=0x02))
			{
				rxhead=0;
				ES=1;
				return;
			}
			if(rxhead==3)
			{
				datalen=s;
			}
			receive_buf1[rxhead++]=s;
			if(rxhead==(datalen+5))
			{
				if(s==0x03)
				{
					receive_flag=1;
					datalen=rxhead-3;
					ES=1;
					rxhead=0;
				}
				else
				{
					rxhead=0;
					ES=1;
					return;
				}
			}

		}
		else if(TI)
		{
			TI=0;
			if(txhead>senddatalen+2)
			{
				txhead=0;
				ES=1;
				return;
			}
			SBUF=send_buf1[txhead];
			txhead++;
			ES=1;
			return;
		}
		ES=1;

}
/***************************************************************************/
void EM_REV (void) interrupt 0 using 1
{
//		phone_flag=1;
//		timecounter=0;
		key_time=0;
		callnumber++;
}
/***************************************************************************/
//;;;;;;;;;;read inter data flash(EEPROM)program ;;;;;;;;;;;;;;;;
//;;;;;;;;;;;;;;ext address data is form 0~29696;;;;;;;;;;;;;;;;;;;;
unsigned char read_eeprom(unsigned int addrdata)
{
		unsigned int address;
		unsigned char data1;
		address=0x2000+addrdata;
		ISP_ADDRH=(unsigned char)(address>>8);
		ISP_ADDRL=(unsigned char)address;
		ISP_CONTR=WAIT_TIME;
		ISP_CONTR=0x80;
		ISP_CMD=ISP_IAP_BYTE_READ;
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
		;;;
		data1=ISP_DATA;
		return data1;
}
//;;;;;;;;;;write data flash(EEPROM) program;;;;;;;;;;;;;;;;;;
//;;;;;;;;;;;ext address 0~29696   data :;;;;;;;;;;;;;;;;;;;;
void write_eeprom(unsigned int addrdata,unsigned char data2)
{
		unsigned int address;
		address=0x2000+addrdata;
		ISP_DATA=data2;
		ISP_ADDRH=(unsigned char)(address>>8);
		ISP_ADDRL=(unsigned char)address;
		ISP_CONTR=WAIT_TIME;
		ISP_CONTR=0x80;
		ISP_CMD=ISP_IAP_BYTE_PROGRAM;
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
}
/////////////////////////////////////////////////////////////////////////////
void erase_eeprom(unsigned char sectors)
{
		unsigned int addr;
		addr=0x2000+sectors*0x200;                //89c51rc is 0x2000  89c54rd+ is 0x8000
		ISP_ADDRH=(unsigned char)(addr>>8);
		ISP_ADDRL=(unsigned char)addr;
		ISP_CONTR=WAIT_TIME;
		ISP_CONTR=0x80;
		ISP_CMD=ISP_IAP_SECTOR_ERASE;
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
}
///////////////////////////////////////////////////////////////////////////
void command_press(void)
{
	unsigned char ss;
	receive_flag=0;
	ss=receive_buf1[1];
	switch(ss)
	{
		
		case 0x01:             //写卡数据处理
		bell1(3);
		break;
		
		break;
		default:
		break;
	}
}
////////////////////////////////////////////////////
uchar readsr(void)
{
	uchar b;
	WRE=1;
	RDE=0;
	RSE=1;
	CSE=0;
	_nop_();
	_nop_();
	b=P0&0x0f;
	CSE=1;
	return(b);
}	

void writesr(uchar a)
{
	WRE=0;
	RDE=1;
	RSE=1;
	CSE=0;
	_nop_();
	_nop_();
	P0=a;
	_nop_();
	_nop_();
	CSE=1;
}

uchar readdata(void)
{
	uchar b;
	WRE=1;
	RDE=0;
	RSE=0;
	CSE=0;
	_nop_();
	_nop_();
	b=P0&0x0f;
	CSE=1;
	return(b);
}	

void writedata(uchar a)
{
	WRE=0;
	RDE=1;
	RSE=0;
	CSE=0;
	_nop_();
	_nop_();
	P0=a;
	_nop_();
	_nop_();
	CSE=1;
}


void delayms(uint n)
{
	uint b;
	while(n>0)
	{
		for(b=0;b<100;b++);
		n--;
	}
}

void init_mt8888(void)
{
	uchar a;
//	P1=0;
//	ONTEL=0;
	delayms(100);
	a=readsr();
	writesr(0);
	writesr(0);
	writesr(8);
	writesr(0);
	a=readsr();

}

uchar GetDTMFdata(void)				//接收一位号码
{
   uchar i;
//   control_status=0xfd;  //设置:音频输出、DTMF、中断、下一次访问CRB 
   writesr(0xfd);
   writesr(0);
   i=readsr();
   if(i&0x04)
   {  
		//i=r_wDTMF;
		i=readdata();
		i&=0x0f;		// 接收到有效号码
	}
   else
		i=0;
		return  i;		//没有接收到有效号码,返回0
}
void sendDTMFdata(uchar d)  //发送一位号码
{
	uchar i;
	writedata(d);
	IRQ_PIN=1;
	while(IRQ_PIN);
//	OUT1=!OUT1;
//	OUT2=!OUT2;
	delayms(800);
	while(1)
	{
		i=readsr();
		if(i&0x02)break;
	}
	OUT1=!OUT1;
	OUT2=!OUT2;
}	
void sendPhone(uchar *arr)					//发送一个完整的电话号码,遇0停止("0"是字符数组的///////////结束标志符,而不是电话号码"0",电话号/码中//的"0"=10
{
	uchar data *p;
	ONTEL=1;
//	control_status=0xfd;
//	control_status=0;         //CRB=0000 
	writesr(0xfd);
   	writesr(0);
   	for(p=arr;*p!=0;p++)
	sendDTMFdata(*p);
}

⌨️ 快捷键说明

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