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

📄 send8000(11.0592m).c

📁 基于89c2051开发的ptr8000一对多无线通信程序.
💻 C
字号:
#define __SRC
	#include "Config.h"
#undef	__SRC

#define HALFSECTICKS 500 //12
#define SECTICKS     1000 //24
#define COMRBUFLEN   16
#define COMSBUFLEN   16
uchar TLV=0x00; //0xb0;      //Now is 1000 times per seconds; //for 18432000,
uchar THV=0xfa; //0xff;      //                        
uchar temptl0,tempth0;
sbit RLED   = P1^2;
bit triggle=0,triggle1=0;
uint count=0;

#define PWR_ON		0
#define PWR_OFF		1
#define MOTO_FORW	1	/* 01 */
#define MOTO_BACK	2	/* 10 */
#define MOTO_STOP	3	/* 11 */

/************************************************************/
#define E2ADRSYS		0x00	/* 本系统于EEPROM中地址 */
uchar idata ADDRESS;	/**/
uchar idata URT_buf;		/* 串口接收数据缓冲器 	*/
uchar idata URT_cnt;		/* 数据接收计数器 	*/
uchar idata URT_rcv,URT_cmd,URT_len;
/************************************************************/
uchar idata wrrdadr;		/* EEPROM操作(读/写)首地址 */
uchar idata Databuf[16];	/* 16字节数据存储缓冲区 */
uchar idata comrbuf[COMRBUFLEN],comrbufp=0;	/* 16字节数据存储缓冲区 */
uchar idata comsbuf[COMSBUFLEN],comsbufp=0;	/* 16字节数据存储缓冲区 */
#define	BUFADR		Databuf[0]	/* 系统地址 */
#define	BUFPTST		Databuf[1]	/* 操作端口/状态 */
#define	BUFHOUR		Databuf[2]	/* 时间:时 */
#define	BUFMINT		Databuf[3]	/* 时间:分 */
extern ulong RX_ADDRESS;
#define RX_ADDRESS_0         RX_ADDRESS >> 24          //接收有效地址第1字节 Byte5       11100111
#define RX_ADDRESS_1         (RX_ADDRESS >> 16) & 0xff //接收有效地址第2字节 Byte6       11100111 
#define RX_ADDRESS_2         (RX_ADDRESS >> 8) & 0xff  //接收有效地址第3字节 Byte7       11100111
#define RX_ADDRESS_3         RX_ADDRESS & 0xff         //接收有效地址第4字节 Byte8       11100111

/*
uchar idata TX_ADDRESS[4]={0x50,0x51,0x52,0x53};	/* RF接收方地址  */

uchar idata TX_ADDRESS[4]={0xA0,0xA1,0xA2,0xA3};	/* RF接收方地址  */
/************************************************************/
uchar idata tim_cnt;	/* 定时计数器 	*/
uchar idata tim_scd;	/* 秒计数器 	*/
uchar idata tim_mnt;
uchar idata tim_hur;
bit bdata Flag_scd; 	/* 1秒标志位 	*/

/* 波特率发生器的初值fosc=7.3728MHz/(2*DIVM)=1.8432MHz */
/* 设置串口波特率 = Fosc / ((BRGR1,BRGR0)+16) */
#define BRGR1_DATA 	0x00	/* 9600BPS = 00B0H */
#define BRGR0_DATA 	0xB0	/* 2400BPS = 1DF0H */

/*==========================================================*/
void Spi_init(void);
void Config905(void);			/* 配置nRF905 */
void ChangeMode(uchar num);		/* RF模式配置 */
void RF905_Write(uchar RFcmd,uchar *RFdata);	/* 配置nRF905写地址/数据 */
void RF905_Read(uchar RFcmd,uchar *RFdata);	/* 配置nRF905读地址/数据 */
void Delayus(uchar xus);

void Delayms(uint xms)
{	
	//uint i = xus;
    uint startc,endc;
    startc=count;
    endc=count;
	while((endc+SECTICKS-startc)%SECTICKS < xms) endc=count;
}	

/*==========================================================*/
/*  功能:查询方式对地址范围为0x00~0xFF之间的EEPROM字节编程(写) */
/*  入口:	ptr,写入数据首地址
/*			e2adr,写入EEPROM首地址
/*			length,写入数据长度	
/*	出口:	无。
/************************************************************/
/*
void eeprom_write(uchar e2adr,uchar *ptr,uchar length)
{
	uchar i,j;
	i=j=0;
	for(i=0;i<length;i++)
	{	
		j=0;
		DEECON = 0;
		DEEDAT = ptr[i];
		DEEADR = e2adr;
		while(j==0)j=DEECON&0x80;
		e2adr++;
	}
}
*/
/*==========================================================*/
/*  功能:查询方式对地址范围为0x00~0xFF之间的EEPROM字节编程(读) */
/*  入口:	ptr,写入数据首地址
/*			e2adr,写入EEPROM首地址
/*			length,写入数据长度	
/*	出口:	无。
/************************************************************/
/*
void eeprom_read(uchar e2adr,uchar *ptr,uchar length)
{
	uchar i,j;
	i=j=0;
	for(i=0;i<length;i++)
	{	
		j=0;
		DEECON = 0;
		DEEADR = e2adr;
		while(j==0)j=DEECON&0x80;
		ptr[i] = DEEDAT;
		e2adr++;
	}
}
*/
void uart_init(void)
{
	//SCON=0x50;	/* 串行口为方式1   SM2=0,REN=1 */
/*	PCON|=0x40;	/* SMOD0=1,使用FE标志位(与SSTAT.3是同一标志) */
	//PCON=0x00;
	//SSTAT=0x20;	/* 禁止双缓冲使能,中断独立,每发送一字节产生一次中断 */
/* 设置串口波特率:Fosc / ((BRGR1,BRGR0)+16) */
	//BRGCON=0x00;	/* 关波特率发生器 */
	//BRGR1=BRGR1_DATA;
	//BRGR0=BRGR0_DATA;
	//BRGCON=0x03;	/* 打开串口波特率发生器,使用串口波特率发生器 */
	ES=1;	/* 允许接收中断 */
	//EST=0;	/* 禁止发送中断 */
	//RI=0;
	//TI=0;
	SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x21;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    //TH1   = 0xfb; //9600bps 0xe8; //1200bps,0xfd;               //9600bps for 11.0592M /* TH1:  reload value for 1200 baud @ 16MHz   */
    TH1   = 0xfd; //9600bps 0xe8; //1200bps,0xfd;               //9600bps for 11.0592M /* TH1:  reload value for 1200 baud @ 16MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 1;                  /* TI:   set TI to send first char of UART    */
}

/*=================================================*/
/*发送数据子程序*/
void mscom_snd(uchar *ptr,uchar length)
{
	uchar i;
	for(i=0;i<length;i++)
	{	SBUF=ptr[i];
		while(TI==0);
		TI=0;
	}
}

void mscom_byte(uchar sndat)
{
	SBUF=sndat;
	while(TI==0);
	TI=0;
}
/**************************************************/
/***********  串口(Rx)中断服务子程序  *************/
void Mscom_rcv(void) interrupt 4 using 1
{
	if(RI==1)
	{
		RI=0;
		//URT_rcv=SBUF;
		comrbuf[comrbufp]=SBUF;
		if(comrbuf[comrbufp]=='E' && comrbuf[(comrbufp+COMRBUFLEN-1)%COMRBUFLEN]==0 && comrbuf[(comrbufp+COMRBUFLEN-4)%COMRBUFLEN]=='S')
 	    {
		 comsbuf[12]=comrbuf[(comrbufp+COMRBUFLEN-3)%COMRBUFLEN];
		 comsbuf[13]=comrbuf[(comrbufp+COMRBUFLEN-2)%COMRBUFLEN];
		}
		if(++comrbufp==COMRBUFLEN) comrbufp=0;
		mscom_byte(URT_rcv);				
	}/* 串口接收程序结束 */
}/* 串口中断程序结束 */


/****************************************************************/
//////////Timer0 interrupt//////

void t0int() interrupt 1
{
 temptl0=TL0;
 tempth0=TH0;
 TH0=THV+tempth0;
 TL0=TLV+temptl0+10;
 count++;
 if(count==HALFSECTICKS)
 {
  triggle=1;
  RLED=1;
 }
 if(count==SECTICKS)
 {
  count=0;
  triggle=1;
  RLED=0;
 }
}

void Ptimer1(void) interrupt 3 using 1
{
	TH1=(65536-46080)/256;	/* Fosc=733728MHz/4=1.8432MHz */
	TL1=(65536-46080)%256;	/* 50ms timer interrupt */
	TR1=1;
	if(++tim_cnt==20)
	{
		tim_cnt=0;
		Flag_scd=1;
		if(tim_scd++==60)
		{
			tim_scd=0;
			if(tim_mnt++==60)
			{
				tim_mnt=0;
				if(tim_hur++==24) tim_hur=0;
			}
		}
	}
}


/************************************************************************************************/
main()
{	
	uchar i;
	for(i=0;i<4;i++) comsbuf[i]=TX_ADDRESS[i];
	comsbuf[4]=RX_ADDRESS_0;
	comsbuf[5]=RX_ADDRESS_1;
	comsbuf[6]=RX_ADDRESS_2;
	comsbuf[7]=RX_ADDRESS_3;
	comsbuf[8]=0xff;
	comsbuf[9]=0xd7;
	comsbuf[10]=0x06;
	comsbuf[11]='S';
	comsbuf[14]=0x00;
	comsbuf[15]='E';

	/*IO口模式设置00准双向;01推挽;10高阻输入;11开漏 */
	//P0M1=0x00;	/* P0M1: 00000000   键盘 双向*/
	//P0M2=0x0F;	/* P0M2: 00001111   LED  推挽*/
	//P1M1=0x2C;	/* P1M1: 00101100   P1.2/P1.3配置为开漏,外接上拉电阻;P1.5(RST)仅能为输入(高阻);*/
	//P1M2=0x0C;	/* P1M2: 00001100   中断1,串口为准双向;*/
	//P2M1=0x00;	/* P2M1: 00000000   */
	//P2M2=0x00;	/* P2M2: 00000000   */
	//P3M1=0x00;	/* IO口模式设置: 准双向口00,使用内部时钟 */
	//P3M2=0x00;
	
	//P0=0xFF;	/* 初化P0口 */
	//P1=0xFF;			
	//P2=0xFF;	/*  */
	//P3=0xFF;	/*  */
						
	//DIVM=2;	/* 降低工作频率,以便程序移植 */
	TR0   = 1;
    IE    = 0x82;          //Enable timer0.

	uart_init();	/* 串口初始化9600BPS */
	Spi_init();				/* 初始化SPI端口 */

	ChangeMode(Standby);	/* nRF905进入待机SPI通讯模式 */
	//Delayus(1000);
	Delayms(1);
	Config905();			/* 配置nRF905 */
				
	//TMOD|=0x10;				/* Timer1 mode set Mode1 */
	//TH1=(65536-46080)/256;	/* Fosc=1.8432MHz,50ms timer interrupt */
	//TL1=(65536-46080)%256;
	//ET1=1;TR1=1;
	//EA=1;
	
	//eeprom_read(E2ADRSYS,Databuf,16);	/* 读取本系统地址及参数 */
	//ADDRESS = BUFADR;
	//if(ADDRESS==0xFF)	/* 地址为0xFF时,初始化地址为1 */
	//{
	//	BUFADR = ADDRESS = 0x01;	/* 本系统地址存储为0x01 */
	//	for(i=1;i<16;i++)Databuf[i]=i;
	//	eeprom_write(E2ADRSYS,Databuf,16);	/* 存储本系统地址及参数 */
	//}
	mscom_snd(Databuf,16);

	RF905_Read(RC,Databuf);
	mscom_snd(Databuf,16);
	ChangeMode(RXMode);		/**/

	while(1)
	{	
		while(RF_DR && RF_AM)
		{
			ChangeMode(Standby);
			Delayms(1);
			RF905_Read(RRP,Databuf);
			ChangeMode(RXMode);	
			//Delayus(300);
			//Delayms(1);
			mscom_snd(Databuf,16);
            if(Databuf[15]=='E' && Databuf[14]==0x00 && Databuf[11]=='S')
			{
             triggle1=1;
			}
		}
        if(triggle1)
        {
         //triggle=0;
         triggle1=0;
		 ChangeMode(TXMode);	
		 //Delayus(3100);
		 Delayms(3);
		 RF905_Write(WTA,TX_ADDRESS);
		 //RF905_Write(WTP,Databuf);	
		 RF905_Write(WTP,comsbuf);	
		 ChangeMode(TXData);	
		 //mscom_snd(TX_ADDRESS,4);
		 //mscom_snd(Databuf,16);
		 //Delayus(650);			// ensure nRF905 have began TX 
		 //Delayms(2);
		 while(!RF_DR);
		 ChangeMode(RXMode);			
        }
		/*
        switch (URT_rcv)
		{
		 case 0x00:
			for(i=0;i<16;i++) Databuf[i]=i;
			//eeprom_write(E2ADRSYS,Databuf,16);
			//eeprom_read(E2ADRSYS,Databuf,16);
			//mscom_snd(Databuf,16);
			URT_rcv =0x10;
			break;
		 case 0x01:
		 	ChangeMode(Standby);
			Delayus(3100);
			RF905_Read(RC,Databuf);
			ChangeMode(RXMode);		
			mscom_snd(Databuf,16);
			URT_rcv =0x10;
		 	break;
		 case 0x02:
		 	ChangeMode(TXMode);	
			Delayus(3100);
			RF905_Write(WTA,TX_ADDRESS);
			RF905_Write(WTP,Databuf);	
		 	ChangeMode(TXData);	
			//mscom_snd(TX_ADDRESS,4);
			//mscom_snd(Databuf,16);
			Delayus(650);			// ensure nRF905 have began TX 
			ChangeMode(RXMode);			
		 	URT_rcv =0x10;
			break;
		 case 0x03:
		  	ChangeMode(Standby);
			RF905_Read(RTP,Databuf);
			Delayus(650);
			ChangeMode(RXMode);		
		  	mscom_snd(Databuf,16);
			URT_rcv =0x10;
			break;
		 case 0x04:
		  	ChangeMode(Standby);	
			RF905_Read(RRP,Databuf);
			Delayus(650);
			ChangeMode(RXMode);		
		  	//mscom_snd(Databuf,16);
			URT_rcv =0x10;
			break;
	     case 0x05:
			for(i=0;i<16;i++) Databuf[i]=15-i;
			//eeprom_write(E2ADRSYS,Databuf,16);
			//eeprom_read(E2ADRSYS,Databuf,16);
			//mscom_snd(Databuf,16);
			URT_rcv =0x10;
			break;
         case 0x06:
			for(i=0;i<16;i++) Databuf[i]=0x06;
			//eeprom_write(E2ADRSYS,Databuf,16);
			//eeprom_read(E2ADRSYS,Databuf,16);
			//mscom_snd(Databuf,16);
			URT_rcv =0x10;
			break;
		 case 0x07:
		  	ChangeMode(PowerDown);
			URT_rcv =0x10;
		 default:
			ChangeMode(RXMode);			
		 	URT_rcv =0x10;
			break;
		}
        */
	}
}	


⌨️ 快捷键说明

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