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

📄 zpoint_yj.c

📁 无线收发芯片nRF2401三个发送节点
💻 C
字号:
#include <c8051f310.h>
#include <intrins.h>

sbit LCD_RS=P1^5;
sbit LCD_RW=P1^6;
sbit LCD_E=P1^7;
sbit D1=P3^1;
sbit D2=P3^2;
sbit PWR_UP=P1^0;
sbit CE=P1^1;
sbit CS=P1^2;
unsigned char i,count=0,buf[4]={0};
xdata unsigned char Show_Buf[4][16]={{0xA1,0xA0,0xA1,0xA0,0xA1,0xA0,0xCE,0xDE,0xCF,0xDF,0xA1,0xA0,0xA1,0xA0,0xA1,0xA0},
                                    {0xB6,0xE0,0xB2,0xCE,0xCA,0xFD,0xCB,0xAE,0xD6,0xCA,0xBC,0xE0,0xB2,0xE2,0xD2,0xC7},
                                    {0xD1,0xCE,0xA1,0xA0,0xB6,0xC8,0xA1,0xC3,0x20,0x20,0x20,0x20,0x20,0x20,0xA1,0xEB},
									{0xCE,0xC2,0xA1,0xA0,0xB6,0xC8,0xA1,0xC3,0x20,0x20,0x20,0x20,0x20,0x20,0xA1,0xE6}}; 

void  PORT_Init(void)
{   
 	P0MDOUT |=0x12;             //txd输出
	P0MDOUT &=~0x20;            //rxd输入
	P1MDOUT|=0xe7;              //P1.0 P1.1 P1.2 P1.5 P1.6 P1.7推挽输出
	P2MDOUT=0xff;               //推挽输出
	P3MDOUT|=0x06;              //P3.1 P3.2推挽输出
	P0MDIN &=0xf3;              //P0.2 P0.3为模拟输入,晶振
	P0SKIP|=0x0C;                //跳过晶体引脚
	XBR0=0x03;                  //UART的TX0 RX0连到端口引脚P0.4、P0.5,SPI连到端口引脚
	XBR1=0x41;                  //使能弱上拉,交叉开关启用,外部中断CEX0连到端口引脚
	P2=0xff;
}


void External_Crystal(void)
{
	unsigned char i;
	OSCXCN=0x67;                 //外部晶振,11.0592MHz
	for(i=0;i<254;i++);
	while (!(OSCXCN&0x80));      //等待外部晶振稳定
	CLKSEL=0x01;                //系统时钟取自外部振荡器
}


void INT0_Init(void)
{
	IT01CF=0x0f;              //INT0输入为高电平有效,分配的端口为P0.7
	IT0=0;  	               //INT0为边沿触发
	EX0=1;  	               //允许INT0引脚的中断
	EA=1;                      //总中断开
}

void UART0_Init(void)
{
	SCON0=0x10;                  //模式1,8位UART,启用RX
	TMOD|=0x20;                  //定时器1工作在模式2,8位自动装载
	TH1=0xD0;
	TL1=0xD0;                    //波特率9600
	TR1=1;                       //启动定时器1
	ES0=0;                       //禁止UART0中断
}

void SPI0_Init(void)
{
	SPIF=0;                   //清中断标志
	SPI0CFG=0x43;             //配置SPI0为主方式;空闲时为低电平;在SCK周期的第1个边沿采样
	SPI0CN=0x01;              //采用三线主从方式,使能SPI
	SPI0CKR=0x1a;             //设定SCK输出频率为200k
	ESPI0=0;                  //禁止SPI0中断
}

unsigned char spi_read_write(unsigned char byte)
{
	SPI0DAT=byte;    //SPI0发送一字节数据
	while(!SPIF);              //等待发送完
	SPIF=0;
	return SPI0DAT;     	
}

void SendCh(unsigned char c)      //串口发送一个字节
{
	TI0=0;                        //清发送中断标志
	SBUF0=c;                      //发送
	while(!TI0);                  //等待发送完
	TI0=0;
}

void Delay(void)
{
	unsigned int i;
	for(i=200;i--;i>0)_nop_();
}

void nRF2401_powerup_config_1(void)   //接收节点1的数据,频率为2.402GHZ
{
	unsigned char i=0;
	unsigned char config_data[15]={0};
	D1=0;
	D2=0;                          //两个指示灯全亮
	config_data[0]=0x50;
	config_data[1]=0x08;            //通道1数据长度8位
	config_data[2]=0x00;
	config_data[3]=0xd0;
	config_data[4]=0xdd;
	config_data[5]=0xdd;
	config_data[6]=0xdd;
	config_data[7]=0x00;
	config_data[8]=0xaa;
	config_data[9]=0xbb;
	config_data[10]=0x11;
	config_data[11]=0x22;
	config_data[12]=0x83;
	config_data[13]=0x6f;
	config_data[14]=0x05;         //配置状态字,接收状态
	PWR_UP=1;
	CE=0;
	CS=1;                         //配置方式
	Delay();
	for(i=0;i<15;i++)
	{
		spi_read_write(config_data[i]);
    }	
	CE=1;              //进入激活状态
	CS=0;
	Delay();         //等待200us后,2401准备接收数据
	D1=1;
	D2=1;              //两个指示灯全灭
}
void nRF2401_powerup_config_2(void)   //接收节点2的数据,频率为2.404GHZ
{
	unsigned char i=0;
	unsigned char config_data[15]={0};
	D1=0;
	D2=0;                          //两个指示灯全亮
	config_data[0]=0x50;
	config_data[1]=0x08;            //通道1数据长度8位
	config_data[2]=0x00;
	config_data[3]=0xd0;
	config_data[4]=0xdd;
	config_data[5]=0xdd;
	config_data[6]=0xdd;
	config_data[7]=0x00;
	config_data[8]=0xaa;
	config_data[9]=0xbb;
	config_data[10]=0x22;
	config_data[11]=0x33;
	config_data[12]=0x83;
	config_data[13]=0x6f;
	config_data[14]=0x08;         //配置状态字,接收状态
	PWR_UP=1;
	CE=0;
	CS=1;                         //配置方式
	Delay();
	for(i=0;i<15;i++)
	{
		spi_read_write(config_data[i]);
    }	
	CE=1;              //进入激活状态
	CS=0;
	Delay();         //等待200us后,2401准备接收数据
	D1=1;
	D2=1;              //两个指示灯全灭
}
void nRF2401_powerup_config_3(void)    //接收节点3的数据,频率为2.402GHZ
{
	unsigned char i=0;
	unsigned char config_data[15]={0};
	D1=0;
	D2=0;                          //两个指示灯全亮
	config_data[0]=0x50;
	config_data[1]=0x08;            //通道1数据长度8位
	config_data[2]=0x00;
	config_data[3]=0xd0;
	config_data[4]=0xdd;
	config_data[5]=0xdd;
	config_data[6]=0xdd;
	config_data[7]=0x00;
	config_data[8]=0xaa;
	config_data[9]=0xbb;
	config_data[10]=0x33;
	config_data[11]=0x44;
	config_data[12]=0x83;
	config_data[13]=0x6f;
	config_data[14]=0x0c;         //配置状态字,接收状态
	PWR_UP=1;
	CE=0;
	CS=1;                         //配置方式
	Delay();
	for(i=0;i<15;i++)
	{
		spi_read_write(config_data[i]);
    }	
	CE=1;              //进入激活状态
	CS=0;
	Delay();         //等待200us后,2401准备接收数据
	D1=1;
	D2=1;              //两个指示灯全灭
}

//写指令子程序
void WriteCom(unsigned char CData)
{
	LCD_RS=0;			//RS=0  选择数据寄存器 写指令
	_nop_();_nop_();_nop_();_nop_();
	LCD_RW=0;			//RW=0  写
	_nop_();_nop_();_nop_();P2=CData;
	_nop_();
	LCD_E=1;			//E=1
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	LCD_E=0;			//E=0
	_nop_();_nop_();_nop_();_nop_();
	//P2=0xff;
	Delay();
}

//写数据子程序
void WriteData(unsigned char DData)
{
	LCD_RS=1;		                 	//RS=1  选择数据寄存器  写数据
	_nop_();_nop_();_nop_();_nop_();
	LCD_RW=0;			                //RW=0  写
	_nop_();_nop_();_nop_();P2=DData;_nop_();
	LCD_E=1;			                //E=1
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	LCD_E=0;			                //E=0
	_nop_();_nop_();_nop_();_nop_();
	//P2=0xff;
	Delay();
}

//液晶初始化
void initLCD(void)
{
    LCD_RS=0;
	LCD_RW=0;
	LCD_E=0;
	WriteCom(0x30);Delay();//功能设定 DL=1 RE=0 8位控制界面	
	WriteCom(0x01);         //清除显示
	Delay();Delay();Delay();Delay();
	WriteCom(0x06);Delay();//进入点设定 I/D=1 光标右移,S=0 整体显示不移动;
	WriteCom(0x0c);Delay();//显示状态开/关 D=1 整体显示ON 
	WriteCom(0x80);Delay();//设定DDRAM 设定DDRAM位址到位址计数器AC;
	
}

void INT0_ISR(void) interrupt 0
{
	unsigned char s=0;
	EA=0;
	D1=0;                      //接收到有效的数据,D1灯亮
	s=spi_read_write(0x00);
	SendCh(s);
	buf[count]=s;
	count++;
	CE=1;                      //CE保持高电平,2401准备接收新的数据
	EA=1;	
	D1=1;
}

unsigned int saltprocess(unsigned int Sin )
{
	double s,s1,s2,s3;
	s=(Sin*3.3)/1024;
	s1=s*s;
	s2=s*s1;
	s3=80.1458*s2-69.3107*s1+43.0198*s+0.0844;
	return((int)(s3*1000));

}

unsigned int tempprocess(unsigned int Tin )
{
	double t,t1;
	t=(Tin*3300L)>>10;
	t1=43.2642*t+1408.6;
	return((int)t1);

}
void deal_with(unsigned char x_buf[4])
{   
     unsigned char j,sc3,sc2,sc1,sc0,st3,st2,st1,st0;
     unsigned int saltadc,tempadc,salt,temp;
            count=0;               //计数器复位
			saltadc=((unsigned int)x_buf[0]<<8)+x_buf[1];
			salt=saltprocess(saltadc);
			tempadc=((unsigned int)x_buf[2]<<8)+x_buf[3];
			temp=tempprocess(tempadc);
			sc3=salt/10000;
			sc2=(salt%10000)/1000;
			sc1=(salt%1000)/100;
			sc0=salt%10;
			Show_Buf[2][9]=0x30+sc3;
			Show_Buf[2][10]=0x30+sc2;
			Show_Buf[2][11]=0x2E;
			Show_Buf[2][12]=0x30+sc1;
			Show_Buf[2][13]=0x30+sc0;	
			WriteCom(0x8C);				
			for(j=9;j<14;j++)
			{WriteData(Show_Buf[2][j]);} 

			st3=temp/10000;
			st2=(temp%10000)/1000;
			st1=(temp%1000)/100;
			st0=temp%10;
			Show_Buf[3][9]=0x30+st3;
			Show_Buf[3][10]=0x30+st2;
			Show_Buf[3][11]=0x2E;
			Show_Buf[3][12]=0x30+st1;
			Show_Buf[3][13]=0x30+st0;	
			WriteCom(0x9C);				
			for(j=9;j<14;j++)
			{WriteData(Show_Buf[3][j]);} 
	WriteCom(0x01);         //清除显示
}

//主程序
void main(void)
{
	
	PCA0MD&=~0x40;           //关闭看门狗
	PORT_Init();
	External_Crystal();
	INT0_Init();
	UART0_Init();
	SPI0_Init();
	
	initLCD();
	WriteCom(0x80);			//指定第1行的起始地址
	for(i=0;i<16;i++)
	{WriteData(Show_Buf[0][i]);}
	WriteCom(0x90);			//指定第2行的起始地址
	for(i=0;i<16;i++)
	{WriteData(Show_Buf[1][i]);}
	 WriteCom(0x88);			//指定第3行的起始地址
	for(i=0;i<16;i++)
	{WriteData(Show_Buf[2][i]);}
	WriteCom(0x98);			//指定第4行的起始地址
	for(i=0;i<16;i++)
	{WriteData(Show_Buf[3][i]);}
	D2=0;
	while(1)
	{
         nRF2401_powerup_config_1();
         while(count==4)
         {deal_with(&buf);}
         Delay();
         nRF2401_powerup_config_2();
         while(count==4)
         {deal_with(&buf);}
         Delay();
         nRF2401_powerup_config_1();
         while(count==4)
         {deal_with(&buf);}
         Delay();
    }

}

⌨️ 快捷键说明

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