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

📄 main.c

📁 nRF905无线FSK芯片在51单片机上工作的代码
💻 C
字号:

/////////////////////////////////////////////////////////
#include <absacc.h>
#include <reg51.h>
#include<DATA_define.h>
#include<Send_Receive.h>
#include<Buffer.h>
#include<set.h>
#include<display.h>
 void Set_INFO(void)
 {
 	INFO[0]=0;
	INFO[1]=2;
	INFO[2]=5;
	INFO[3]=0;
 
 }
/**** 主程序
*****/
////////////////////////////////////////////////////////////
//5ms定时
void timer0( void ) interrupt 1
{
		
	TR0=0;
	ET0=0;

	TH0=0xee;		// 载入计数初值
	TL0=0x00;
	output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/
 //	TR0=1;			// 开时钟,保证计时精确

 	Wireless_int0();
	d_time++;		// 每5ms对超时标志加1 /%
	d_time=d_time%200;//0~199循环计数
 
	if(d_time==D_T)
	{
		state_flag=C21a;
		Rbuffer_point=1;
		state=1;
	}//判定传输中断,处理


	
	if(d_time==RES_TIME)
	{
		Adrchange_flag=1;
		d_time=0;


				if(Adrchange_flag)	//掉线
		{	

			bus_control_count++;
			bus_control_count=bus_control_count%10;
			Set_address(bus_control_count);
			TI=1;
			Adrchange_flag=0;
		}
	}//判定掉线,处理

//	fir_dis=(Rbuffer[11]-'0')*16+(Rbuffer[12]-'0');
//	sec_dis=(Rbuffer[13]-'0')*16+(Rbuffer[14]-'0');
//	thi_dis=(Rbuffer[15]-'0')*16+(Rbuffer[16]-'0');
//	for_dis=(Rbuffer[17]-'0')*16+(Rbuffer[18]-'0');
	Display();//显示信息
	TR0=1;
	ET0=1;
}
///////////////////////////////////////////////////////////

/////////////////////////////////////////////////////
//主系统的发送接收程序
void Receive_interr(void) interrupt 4//一次串行发送/接收完成后,发出中断申请
{	unsigned char i;
	if(RI)///接收完毕
	{
		RI=0;//清除接收中断
		fir_dis=13;	///MARK

		d_time=0;//开始计时
		FSM();//有限状态机形式的接收数据
		if(buffer_flag)//接收完毕
		{


////////////////////////////////////////////////
			//保存info
				if(Get_ADR()==MOTOR_ADR)
				{
					for(i=0;i< Get_LENGTH()*2;i++)

					MOTOR_INFO_DOWN[i]=Rbuffer[i+11];
				}
				else if(Get_ADR()==CUP_ADR)
				{
					for(i=0;i<Get_LENGTH()*2;i++)

					CUP_INFO_DOWN[i]=Rbuffer[i+11];
				}
				else if(Get_ADR()==DIST_ADR)
				{	
					for(i=0;i<Get_LENGTH()*2;i++)

					DIST_INFO_DOWN[i]=Rbuffer[i+11];
				}
				else if(Get_ADR()==TOP_ADR)
				{
					
				}
		
			  ////////////////////////////////////////

			receivedone_flag=1;
			ES=0;
			while(d_time<=4);//延时20ms	 ????????????????????????????????????
/////////////////////////////////////////////////////////////////////////////

			bus_control_count++;
			bus_control_count=bus_control_count%10;
			Set_address(bus_control_count); //
			Set_INFO();
			Set_BUF();//把信息放入带发送信息
			receivedone_flag=0; ///标志复位
			TI=0;
			Sbuffer_point=0;
			SBUF=Sbuffer[0];/////////////
			Sbuffer_point++;
			ES=1;
//////////////////////////////////////////////////////////////////////////////			 


		
		}//当接收完毕时,发送反馈信息



	}
	else if(TI)	//发送完毕
	{

 		if(feedbackdone_flag) //当镇发送完毕时复位,等待下一次接收
		{
		  	feedbackdone_flag=0;
		  	TI=0;
		}
		else						//当没有发送完毕时,继续发送
	   	{
			REN=0;///关闭串行接收
			TI=0;	 //
			fir_dis=14;
		 
			if(Sbuffer[Sbuffer_point]!=EOI)
			{
			
				SBUF=Sbuffer[Sbuffer_point];
				Sbuffer_point++;
			
			}
			else 
			{
				ES=0;
				SBUF=Sbuffer[Sbuffer_point];
				Sbuffer_point=0;
				REN=1;//运行串行接收
				
				feedbackdone_flag=1;
//////////////////////////////////////////////////////////////
			 //for_dis=bus_control_count;
			 bus_control_count++;
			 bus_control_count=bus_control_count%10;
//			 if(bus_control_count%2==0)
//			 bus_control_count--;
			 Set_address(bus_control_count);
			 ES=1;
////////////////////////////////////////////////////////////////////




			} 	
			d_time=0;

		}
	}


	
}
//////////////////////////////////////////////////////



/////////////////////////////////////////////////////////////////
main()
{
//* 单片机系统初始化 *
    P1=0XFF;
    P3=0XFF;
    //** 中断工作寄存器初始化 **
	InitWireless();


   
    //** 定时器工作寄存器初始化 **
	PT1=1;//优先级设置
    TR1=1;
	

	//////////////////////////////
	SCON=0x40;//工作方式1
	TMOD=0X21;
	TH0=0xee;
	TL0=0x00;
	TH1=0xfd;//
   	TR1=1;
	ET1=0;
	ES=1;
	EA=1;
	ET0=1;
 	TR0=1;/*开中断*/
	PS=0;  //串口工作优先级低
	TI=1;
	PT0=1;//5ms定时器中断优先级高
	Set_BUF();
	

//	RESET_8255=0;//复位无效
//	ADDR_8255_control=0x80;//写方式字

	///////////////8255控制字///////



/////////////////////////////////////////	
//* 主循环,本例中,在T0中断服务程序未被执行的空余时间里,处理机在以下程序中不断循环 *
	while(1)
	{  
		
 		 Wireless_while();
	  }

	  
}

////////////////////////////////////////////////////////


⌨️ 快捷键说明

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