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

📄 复件 arx.c

📁 nRF24z1的c51参考代码
💻 C
字号:
#include <REG2051.H>
#include <intrins.h>
#include "ARX.h" 


code unsigned char channel_num[38]=
{
	0x06, 0x1c, 0x34, 0x4c, 0x18,
	0x30, 0x48, 0x14, 0x2c, 0x44,
	0x10, 0x28, 0x40, 0x0c, 0x24,
	0x3c, 0x08, 0x20, 0x38, 0x04,
	0x1e, 0x36, 0x4e, 0x1a, 0x32,
	0x4a, 0x16, 0x2e, 0x46, 0x12,
	0x2a, 0x42, 0x0e, 0x26, 0x3e,
	0x0a, 0x22, 0x3a
};

unsigned int bMsTimet;


#define	i2c_delay()	\
	{		\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	_nop_();	\
	}



//void timer0(void) interrupt 1
//{
//	bMsTimet++;
//	if(bMsTimet > 60000) bMsTimet = 60000;
//	
//	TH0 = 0x1C;
//	TL0 = 0x18;
//	TR0 = 1;
//}


void I2C_Start(BYTE device)
{
	if(device == DEVICE_RF)
	{
		I2C_SDA = 1; 	
		I2C_SCL = 1;
		i2c_delay();
		I2C_SDA = 0;
		i2c_delay();
		I2C_SCL = 0; 	
		i2c_delay();
	}
	else 
	{
		DAC_SDA = 1; 	
		DAC_SCL = 1;
		i2c_delay();
		DAC_SDA = 0;
		i2c_delay();
		DAC_SCL = 0; 	
		i2c_delay();
	}
}

void I2C_Stop(BYTE device)
{
	if(device == DEVICE_RF)
	{
		I2C_SDA = 0;
		i2c_delay();
		I2C_SCL = 1;
		i2c_delay();
		I2C_SDA = 1;
		i2c_delay();
		I2C_SCL = 0;
		i2c_delay();
	}
	else {
		DAC_SDA = 0;
		i2c_delay();
		DAC_SCL = 1;
		i2c_delay();
		DAC_SDA = 1;
		i2c_delay();
		DAC_SCL = 0;
		i2c_delay();
	}
}

void I2C_clock(BYTE device)
{
	if(device == DEVICE_RF)
	{
		I2C_SCL = 1;
		i2c_delay();
		I2C_SCL = 0;
		i2c_delay();
	}
	else {
		DAC_SCL = 1;
		i2c_delay();
		DAC_SCL = 0;
		i2c_delay();
	}
}

BYTE I2C_read_ack(BYTE device)
{
	BYTE sample;
	
	if(device == DEVICE_RF)
	{
		I2C_SCL = 1;
		i2c_delay();
		if(I2C_SDA == 0)sample = 0;
		else sample = 1;
		
		I2C_SCL = 0;
		i2c_delay();
	
		if (sample==0) return (0);
		else return (1);
	}
	else {
		DAC_SCL = 1;
		i2c_delay();
		if(DAC_SDA == 0)sample = 0;
		else sample = 1;
		
		DAC_SCL = 0;
		i2c_delay();
	
		if (sample==0) return (0);
		else return (1);
	}
}

void I2C_ack (BYTE device)
{ 
	if(device == DEVICE_RF)
	{
		I2C_SDA = 0; 
		I2C_clock(device);
		I2C_SDA = 1; 
	}
	else {
		DAC_SDA = 0;
		I2C_clock(device);
		DAC_SDA = 1; 
	}
}

BYTE I2C_send(BYTE device, BYTE i_data)
{
	BYTE i;
	if(device == DEVICE_RF)
	{
		for (i=0;i<8;i++)
		{
			if (i_data&0x80) 
			{
		     	   	I2C_SDA = 1;
		     	}
		     	else 
		     	{	
				I2C_SDA = 0;
		     	}
		 	i_data=i_data<<1;
		 	I2C_clock(device);
		}
	 	//charles	
		I2C_SDA = 1;
	}
	else {
		for (i=0;i<8;i++)
		{
			if (i_data&0x80) 
			{
		     	   	DAC_SDA = 1;
		     	}
		     	else 
		     	{	
				DAC_SDA = 0;
		     	}
		 	i_data=i_data<<1;
		 	I2C_clock(device);
		}
	 	//charles	
		DAC_SDA = 1;
	}
	return (!I2C_read_ack(device));
}

BYTE I2C_wr_single_data(BYTE device, BYTE device_id, BYTE addr, BYTE i_data)
{
	I2C_Start(device);
	if(I2C_send(device, device_id))
	{
		if(I2C_send(device, addr))
		{
			if(I2C_send(device, i_data))
			{
				I2C_Stop(device);
				
				return(1);
			}
			else 
			{
				I2C_Stop(device);
				//LED_CON = 1;
				return(0);
			}
		}
		else {
			I2C_Stop(device);
			//LED_CON = 1;
			return(0);
		}
	}
	else {
		
		I2C_Stop(device);
		//LED_CON = 1;
		return(0);
	}
}

BYTE I2C_read_bit(BYTE device)
{
	BYTE sample;
	if(device == DEVICE_RF)
	{	
		I2C_SCL = 1;	
		i2c_delay();
		if(I2C_SDA == 0) sample = 0;
		else sample = 1;
		I2C_SCL = 0;
		i2c_delay();
	
		if (sample==0) return (0);
		else return (1);
	}
	else {
		DAC_SCL = 1;	
		i2c_delay();
		if(DAC_SDA == 0) sample = 0;
		else sample = 1;
		DAC_SCL = 0;
		i2c_delay();
	
		if (sample==0) return (0);
		else return (1);
	}	
}

BYTE I2C_rd_data(BYTE device)
{
	BYTE i,i_data=0;
	
	for (i=0;i<8;i++)
	{
		i_data*=2;
	    	if (I2C_read_bit(device)) i_data++;
	}
	
	return(i_data);
}
void mcu_wait_ms(unsigned int count)
{
	//bMsTimet = 0;
	
	while(count--);
}

BYTE I2C_rd_single_data(BYTE device, BYTE device_id, BYTE addr, BYTE i_data)
{
	I2C_Start(device);
	if(I2C_send(device, device_id))
	{
		if(I2C_send(device, addr))
		{
			I2C_Start(device);
			if(I2C_send(device, device_id|0x01))
			{
				i_data = I2C_rd_data(device);
				I2C_ack(device);
				I2C_Stop(device);
				return(1);
			}
			else {
				I2C_Stop(device);
				return(0);
			}
				
		}
		else {
			I2C_Stop(device);
			return(0);
		}
	}
	else {
		I2C_Stop(device);
		return(0);
	}
}

void dac_init(void) {
	
	
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x1E, 0x00);    // Resetting DAC before continuing with init, page 20
	
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x0E, 0x12);    // Slave mode, I2S, 16 bits, page 26
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x12, 0x01);    // Activate digital interface, page 31
	
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x0A, 0x00);    // 3 Disable mute, disable de-emphasis, page 15
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x10, 0x20);    // 256x at 44.1ksps, page 26?
	
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x08, 0x10);    // 1 Select DAC, page 17. It has to be put in here and not in dac_init()
        
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x0c, 0x67);    // 2 Power down CLKOUT and oscillator, enable output, DAC, and VMID page 33
	
	I2C_wr_single_data(DEVICE_DAC, DAC_WR_ADDR, 0x05, 0xff);
	DAC_PD = 1;
}

void ARX_init(void)
{
	BYTE bI;
	//---------------Link Table------------------------------
	for(bI=0; bI<38; bI++)
	{
		I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, CH0+bI, channel_num[bI]);
	}
	
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, BCHD, 0x0A);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, NBCH, 0x12);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, NACH, 0x26);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, NLCH, 0x26);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, LNKMOD, 0x00);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, LNKWTH, 0xFF);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, LNKETH, 0xFF);
	
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, ADDR_0, 0x98);	// Data for ADDR_0
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, ADDR_1, 0x38);	// Data for ADDR_1
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, ADDR_2, 0xA2);	// Data for ADDR_2
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, ADDR_3, 0x34);	// Data for ADDR_3
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, ADDR_4, 0x85);	// Data for ADDR_4  
	
	
	//-------------Interrupts table--------------------------
	//I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, INTSTA, 0x00);	// 
	//I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, INTCF, 0x02);	// Enable wakeup from power down interrupt
	//-------------ATX set table-----------------------------
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, TXSTA, 0x49);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, TXPWR, 0x03);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, TXFMT, 64);//  i2s
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, I2SCNF_IN, 0x80);//master
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, TXLAT, 0x04);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, TXMOD, 0x82);
	//------------ARX set table------------------------------
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, RXSTA, 0x08);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, RXPWR, 0x03);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, I2SCNF_OUT, 0);
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, RXMOD, 0x20);
	//------------data command-------------------------------
	I2C_wr_single_data(DEVICE_RF, ARX_WR_ADDR, RXDCMD, 0x82);
}

#if 0
void mcu_init(void)
{
	                                     
	IE = 0x02;

/*	IP (Interrupt Priority Set)
	    (MSB)							(LSB)
	        D7  	D6  	D5  	D4  	D3  	D2  	D1  	D0
	     --------------------------------------------------------------
	    |       |       |       |       |       |       |       |       |
	    |   -   |  	-   |   -   |  PS   |  PT1  |  PX1  |  PT0  |  PX0  |
	    |   0   |   0   |   0   |   1   |   0   |   0   |   1   |   1   |
	    |       |       |       |       |       |       |       |       |
	     ---------------------------------------------------------------	*/
   	IP = 0x13;                                            

/*	TMOD (Timer & Counter Mode Control)
	    (MSB)							(LSB)
	        D7  	D6  	D5  	D4  	D3  	D2  	D1  	D0
	     --------------------------------------------------------------
	    |  TM1  |  TM1  |  TM1  |  TM1  |  TM0  |  TM0  |  TM0  |  TM0  |
	    | GATE  |  C/T  |  M1   |  M0   | GATE  |  C/T  |  M1   |  M0   |
	    |   0   |   0   |   1   |   0   |   0   |   0   |   0   |   1   |
	    |  int  |int clk|reload |       |       |int clk|       |       |
	     ---------------------------------------------------------------	*/
   	TMOD = 0x21;                                           

/*	TCON (Timer & Counter Control)
	    (MSB)							(LSB)
	        D7  	D6  	D5  	D4  	D3  	D2  	D1  	D0
	     --------------------------------------------------------------
	    |       |       |       |       |       |       |  VD   |  VD   |
	    |  TF1  |  TR1  |  TF0  |  TR0  |  IE1  |  IT1  |  IE0  |  IT0  |
	    |   0   |   0   |   0   |   0   |   0   |   1   |   0   |   1   |
	    |over f |tm1 oN |over f |tm0 off|1edge f|1 type |0edge f|0 type |
	     ---------------------------------------------------------------	*/
   	TCON = 0x30;                                           

                                  

/*	SCON(Serial Port Control )
	    (MSB)							(LSB)
	        D7  	D6  	D5  	D4  	D3  	D2  	D1  	D0
	     --------------------------------------------------------------
	    |       |       |       |RXenabl|9th bit|9th bit|       |       |
	    |  SM0  |  SM1  |  SM2  |  REN  |  TB8  |  RB8  |  TI   |  RI   |
	    |   0   |   1   |   0   |   1   |   0   |   0   |   0   |   0   |
	    |       |       |Multi x|       |       |       |       |       |
	     ---------------------------------------------------------------	*/
   	SCON = 0x00;                                           

/*	PCON(Power Control Set )
	    (MSB)							(LSB)
	        D7  	D6  	D5  	D4  	D3  	D2  	D1  	D0
	     --------------------------------------------------------------
	    |       |       |       |       |       |       |       |       |
	    | SMOD  |  	-   |   -   |   -   |  GF1  |  GF2  |  PD   |  IDL  |
	    |   1   |   0   |   0   |   0   |   0   |   0   |   0   |   0   |
	    |  baud |       |       |       |  flag |  flag |powerdn|Idlebit|
	     ---------------------------------------------------------------	*/
   	PCON = 0x10;                                           

/*	TH0H,L (Timer 0 Byte) */
   	TH0 = 0x1c;                                           
   	TL0 = 0x18;                                           


	P1 = 0xFF;

	P3 = 0x7f;
}
#endif
main(void)
{
	BYTE bTemp = 0;
	bMsTimet = 0;
	//mcu_init();
	LED_CON = 0;
	EA = 0;
	TR0 = 0;
	ARX_init();
	LED_CON = 1;
	dac_init();
	mcu_wait_ms(4000);
	
	I2C_rd_single_data(DEVICE_RF, ARX_WR_ADDR, I2SCNF_OUT, bTemp);	
	if(bTemp==0x40)
	{
		LED_CON = 0;
		while(1);
	}
	
	while(1)
	{
		LED_CON = 0;
		mcu_wait_ms(40000);
		LED_CON = 1;
		mcu_wait_ms(40000);
	}
}

⌨️ 快捷键说明

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