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

📄 p89c51rd2_iap.c

📁 基于P89C51RD2实现IAP基于应用程序在线编成
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************/
void wakeup_data_rd(){
	unsigned char idata trx_addr,trx_length,*register_buf;

	trx_addr = trx_wud_address;
	trx_length = 0x2;
	trx_register_rd(trx_addr,trx_length,register_buf);
}
/*****************************************************************************************/
void transmit_wakeup_message(){
	unsigned char temp1;
	unsigned int  idata wakeup_msg_buff;

	wakeup_msg_buff = wakeup_message;
	r_timer = 0;
	for(temp1 = 0; temp1 <10; temp1++)
	{
		DATAMSG = (wakeup_msg_buff & 0x8000)? 1: 0;
		wakeup_msg_buff <<= 1;
		while(r_timer != 1);
		r_timer = 0;
	}
	DATAMSG = 0;
}
/*****************************************************************************************/
void transmit_data(unsigned char length,unsigned char *t_Buffer)
{
	unsigned char idata temp,temp1;
	unsigned char idata IO_Data;

	r_timer = 0;
	DATAMSG = 1;
	TL0 = TimerL0_100us;
	TH0 = TimerH0_100us;
	while(r_timer != 100);	//延时10ms
	DATAMSG = 0;
	r_timer = 0;
	for(temp = 0; temp < length; temp++)
	{
		IO_Data = *t_Buffer++;
		for(temp1 = 0; temp1 <8; temp1++)
		{
			while (r_timer == 0);   //等待100us
			r_timer = 0;
			bitC = ((IO_Data)&(0x80))? 1:0;
			IO_Data <<= 1;
			if(bitC == 0)
			{
				DATAMSG = 1;
				while(r_timer == 0);
				r_timer = 0;
				DATAMSG = 0;
			}
			else
			{
				DATAMSG = 0;
				while(r_timer == 0);
				r_timer = 0;
				DATAMSG = 1;
			}
		}
	}
	r_timer = 0;
	while(r_timer == 0);
	DATAMSG = 0;
	return;
}
/***************************************************************************************/
void transmit(unsigned char length,unsigned char *t_Buffer)
{
	unsigned char idata transmit_count3,transmit_count;

	SelectRF();
	trx_init();
	wakeup_data_rd();
	make_transmit_mode();
	for(transmit_count3 = 0;transmit_count3<3;transmit_count3++)
	{

		for(transmit_count = 0; transmit_count < 180;transmit_count++)
		{
			r_timer = 0;
			while(r_timer != 10);	//1ms
			transmit_wakeup_message();
		}
		delay_1ms();
		transmit_data(length,t_Buffer);
		delay_1ms();
		transmit_data(length,t_Buffer);
	}
	EnableXint0();
	enter_wakeup_mode();
	NoSelect();
	return;
}
/****************************************************************************************/
unsigned char  receiver_data(unsigned char length,unsigned char *r_Buffer){
	unsigned char idata temp,temp1,count,r_count;
	signed char idata temp2,temp3;
	unsigned char idata IO_Data;
	bit MSG_Bit;

start_recerver:
	r_timer = 0;
	r_count = 0;
	count = 0;
	while(r_count < 20)
	{
		if(r_timer == 100)
		{
			r_timer = 0;
			count ++;
			if(count == 34)
				return (fail);
		}
		if(DATAMSG == 0)
			r_count = 0;
		else
			r_count ++;
	}
	r_timer = 0;
	count = 0;
	while(count < 8)
	{
		if(r_timer == 110) 
			goto start_recerver;
		if(DATAMSG == 1)
			count = 0;
		else 
			count ++;
	}
	if(r_timer < 80)
		goto start_recerver;
	r_timer = 0;
	for(count = 0; count <length; count ++)
	{
		for(temp1 = 0; temp1 < 8; temp1++)
		{
			while(r_timer == 0);	
			r_timer = 0;
			r_count = 0;
			for(temp = 0;temp <8; temp++)
			{	
				MSG_Bit = DATAMSG;
				if( MSG_Bit == 0)
					r_count ++;
			}
			temp2 = r_count - 5;		// sample_gate = 5;
			while(r_timer == 0);
			r_timer = 0;
			r_count = 0;
			for(temp =  0;temp < 8; temp++)
			{
				MSG_Bit = DATAMSG;
				if( MSG_Bit == 0)
					r_count ++;
			}
			temp3 = r_count -5;
			if(temp2 * temp3 > 0)
				goto start_recerver;
			IO_Data = IO_Data << 1;
			if(temp3 < 0) IO_Data ++;
		}
		*r_Buffer ++= IO_Data;
	}
	return (success);
}
/*****************************************************************************************/
unsigned char receiver(unsigned char length,unsigned char *r_Buffer){
	unsigned char idata count;

	SelectRF();
	trx_init();
	DisableXint0();
	wakeup  = 0;
	wakeup_data_rd();
	make_receiver_mode();
	count = receiver_data(length,r_Buffer);
	enter_wakeup_mode();
	wakeup_data_rd();
	EnableXint0();
	NoSelect();
	return count;
}
/*************************************************************************/
uchar str_length(uchar *num)		/*	Calculate  String  Length	*/
{
   uchar i=0;

   while( *(num+i) ) i++;
   return i;
}
/*************************************************************************/
void Disp_str(uchar *str,uchar x,uchar y,uchar inv)
{
	unsigned int idata invxy;
	y = y*2;
	invxy = (y<<8);
	invxy |= x;
	if( inv )
		invxy |= 0x8000;
	DispString(str,invxy);
}
/*****************************************************************************************/
unsigned char select_menu(unsigned char * menu[],unsigned char num,unsigned char  cursor)
{
	unsigned char idata ch,i,page;

	cursor = 0;
	page = 0;

	while(1)
	{
		ch = 0;
		InitLCD();		 	
		if(page<num/4)
		{
			for(i = 0;i<4;i++)
				Disp_str(menu[4*page+i] ,0,i,0);
		}
		 else
		 {
		 	if(num%4)
				for(i = 0;i<num%4;i++)
					Disp_str(menu[4*page+i] ,0,i,0)	;
	 	 }
		 Disp_str(menu[4*page+cursor] ,0,cursor,1);
		 lldelay(8);
		 ch = GetCH();
		 if(ch == DOWN)
		 {
			if(4*page+cursor<num-1)
			{
				cursor++;
				if(cursor == 4)
				{
					page++;
					cursor = 0;
				}
			}
		}
		if(ch == UP)
		{
			if(page|cursor)
			{
				if(cursor == 0)
				{
					page--;
					cursor = 3;
				}
				else
					cursor--;
			}
		}	
		if(ch == ESC)
			return 0xff;
		if( ch == ENTER)
		{
			ch = 4*page+cursor;
			return ch;
		}
	}
}
/*************************************************************************/
void ShangChuan(void)
{
unsigned char idata	t_Buffer[16] = {"学海无崖苦作舟."};	// transmit data
unsigned char code str[] = {"发送成功!"};
unsigned char code str1[] = {"传送信息吗?"};
unsigned char idata r_Buffer[17];
unsigned char idata i,line,state;

	InitLCD();
	state = fail;
	Disp_str(str1,0,1,0);
	i = GetCH();
	if(i == ENTER)
	{	
		LightOff();	
		InitLCD();
		
		Disp_str("传送中...",0,2,0);
	
		wakeup = 0;
		
		for(i=0;i<5;i++)
			transmit(16,&t_Buffer[0]);
//		delay_1ms();
//		delay_1ms();
//		r_timer = 0;
//		while(!wakeup&&r_timer != 250);
//		if(r_timer <= 250)
		while(!wakeup);
			state = receiver(16,&r_Buffer[0]);
		wakeup = 0;
		InitLCD();
		LightOn();
		if(state == success)
		{
			Disp_str(r_Buffer,0,line,0);
			line++;
			if(line == 4)
				line = 0;
			GetCH();
			InitLCD();
			Disp_str(str,1,1,0);
		}
		else
			Disp_str("对方没有响应!",0,2,0);
	}
	i = GetCH();
}
////////////////////////////////////////////////////////////////////////////
void Init_CPU(void)
{

	TMOD=0x21;
	PCON=0x80;
	TCON=0x51;
	SCON=0x70;
	TH1 = 0xfb;
	TL1 = 0xfb;
	TI=0;
	RI=0;
}
//////////////////////////////////////////////////////////////////////////
void Init_Device(void)
{
	Init_CPU();
	InitUART(BAUD38400);
	InitXint0();
	trx_init();
	InitLCD();
	EnableInterrup();
	EnableTime0();
}
//////////////////////////////////////////////////////////////////////////
//
//
/////////////////////////////////////////////////////////////////////////
void main(void)
{
	unsigned char code str1[14] = {"good evening!"};
	unsigned char idata ch;
		
		lldelay(5);
		Init_Device();
		ch=0;
		for(;;){
			LightOn();
//			Beep(2,3);
			ch = select_menu(Test_5,6,0);
			switch(ch){
				case 0:	
						break;
				case 1:	
						ShangChuan();
						break;
				case 2:		
						break;
				case 3:		
						DispLogo(2);
						break;
				case 4:		
						InitLCD();
						DispString(str1,0);
						break;
				case 5:
						break;
				default:	    ch=0;
			}
			LightOff();
		}
 }
/*void main(void)
{
	unsigned char i;
	unsigned char code str[14] = {"good morning!"};
	unsigned char buffer[10] = {1,2,3,4,0,4,0,0,3,0};	// transmit data
	unsigned char trx_dtr,trx_addr,trx_length;

	Init_CPU();
	InitUART(BAUD38400);
	InitXint0();
	SelectRF();
	trx_init();
	EnableInterrup();																																						
		for(i=0;i<14;i++)
			sendcode(str[i]);
	EnableTime0();
		
		wakeup = 0;
		trx_dtr = 0x01;

	while(1){
		EnableXint0();
//		enter_wakeup_mode();
		make_receiver_mode();
		trx_addr = trx_dtr_address;
		trx_length = 6;
		trx_register_wr(trx_length,trx_addr,&trx_dtr);
		sendhex(trx_dtr);
		r_timer = 0;
		while(r_timer!=100);
		r_timer = 0;
		if(wakeup){
			make_receiver_mode();
			wakeup = 0;
		}
		RI = 0;
		while(!RI);
	trx_dtr ++;
	sendcode('O');
	sendcode('K');
	}
}*/

⌨️ 快捷键说明

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