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

📄 point2_fs.c

📁 无线收发芯片nRF2401三个发送节点
💻 C
字号:
/*****************************************
*Copyright (c) 2007 江苏大学电气学院
*All right reserved
*文件名称:fs.c
*摘要
 无线发射
*当前版本1.1
*作者:电气学院-季峰
*完成日期:2007年10月12日
******************************************/
#include <c8051f310.h>
xdata unsigned int stBuf[32]={0};	
sbit D1=P3^1;
sbit D2=P3^2;
sbit PWR_UP=P1^0;
sbit CE=P1^1;
sbit CS=P1^2;
void  PORT_Init(void)
{   
 	P0MDOUT |=0x10;             //txd输出
	P0MDOUT &=~0x20;            //rxd输入
	P0MDIN &=0xf3;              //P0.2 P0.3为模拟输入,晶振
	P0SKIP|=0x0C;                //跳过晶体引脚
	P1MDOUT|=0x07;              //P1.0 P1.1 P1.3 推挽输出
	P3MDOUT|=0x06;              //P3.1 P3.2推挽输出
	P2MDIN=0x00;                 //P2口都配置为模拟输入,用于A/D转换
	P2SKIP=0xff;                 //P2口都被交叉开关跳过,用于A/D转换
	XBR0=0x03;                  //UART的TX0 RX0连到端口引脚P0.4、P0.5,SPI连到端口引脚
	XBR1=0x41;                  //使能弱上拉,交叉开关启用,外部中断CEX0连到端口引脚
}

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

}

void SPI0_Init(void)
{
	SPIF=0;                   //清中断标志
	SPI0CFG=0x47;             //配置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 delay(unsigned int n)
{
	unsigned int i;
	for(i=0;i<n;i++);
}

void Init_ADC(void)
{
	AMX0P=0x0f;              //AD输入选择P2.7,盐度A/D转换通道
	AMX0N=0x1f;              //单端输入
	ADC0CF=0x40;             //右对齐
	ADC0CN=0x80;             //ADC0允许,正常方式,向ADC0BUSY写1时启动ADC
	REF0CN=0x0a;             //VDD为参考电压,温度传感器关闭,内部偏压工作
	EIE1&=0xf7;              //EADC0置0,禁止ADC0转换结果中断
}

unsigned int GetADC(void)
{
	unsigned int result;
	AD0EN=1;                      //使能ADC0
	AD0INT=0;                      //清ADC0中断标志
	AD0WINT=0;                      //清ADC0窗口比较标志
	delay(20000);
	AD0BUSY=1;                       //启动A/D转换
	while(!AD0INT);
	AD0INT=0;
	AD0EN=0;
	result=((unsigned int)ADC0H<<8)+ADC0L;
	return result;
}

void nRF2401_powerup_config(void)
{
	unsigned char i=0;
	unsigned char config_data[15]={0};
	config_data[0]=0x50;
	config_data[1]=0x08;            //发送8位数据
	config_data[2]=0x00;
	config_data[3]=0xd0;
	config_data[4]=0xdd;
	config_data[5]=0xdd;
	config_data[6]=0xdd;           //接收通道2地址
	config_data[7]=0x00;
	config_data[8]=0xaa;
	config_data[9]=0xbb;
	config_data[10]=0x22;
	config_data[11]=0x33;           //接收通道1地址
	config_data[12]=0x83;
	config_data[13]=0x6f;
	config_data[14]=0x08;         //配置状态字,发送状态,发送频率2400MHZ+4*1.0HZ=2.404GHZ
	PWR_UP=1;
	CE=0;
	CS=1;                         //配置方式
	delay(10);                    //延时5us以上
	for(i=0;i<15;i++)
	{
		spi_read_write(config_data[i]);
    }
	CE=1;              //进入激活状态
	CS=0;
	D2=0;              //配置完成,进入激活状态D2亮
}

void Transmit_address_data(unsigned char number)
{
	unsigned char i=0;
	unsigned char transmit_data[5]={0};
	transmit_data[0]=0xaa;
	transmit_data[1]=0xbb;
	transmit_data[2]=0x22;
	transmit_data[3]=0x33;
	transmit_data[4]=number;
	CE=1;	                                //准备发送数据,CE置高
	delay(10);
	for(i=0;i<5;i++)
	{
		spi_read_write(transmit_data[i]);
	}
	CE=0;                          //CE置低,数据发射出去
	D1=0;                          //数据发射,D1灯亮
}

void main(void)
{
	unsigned char i,b=0,c=0;
	unsigned int saltcode=0,temperaturecode=0,a=0;
	unsigned long sum=0;
	PCA0MD&=~0x40;           //关闭看门狗
	PORT_Init();
	External_Crystal();
	SPI0_Init();
	Init_ADC();                 //初始化ADC转换
	nRF2401_powerup_config();
	while(1)
	{	
		for(i=0;i<32;i++)
		{
			stBuf[i]=GetADC();
			sum=sum+stBuf[i];
		}
		saltcode=sum>>5;
		a=saltcode;
		b=a;                        //低8位
		c=a>>8;                     //高2位
		Transmit_address_data(c);
		delay(500);
        Transmit_address_data(b);
		sum=0;
		AMX0P=0x0e;              //AD输入选择P2.6,温度A/D转换通道
        for(i=0;i<32;i++)
		{
			stBuf[i]=GetADC();
			sum=sum+stBuf[i];
		}
		temperaturecode=sum>>5;
		a=temperaturecode;
		b=a;                        //低8位
		c=a>>8;                     //高2位
		Transmit_address_data(c);
		delay(500);
        Transmit_address_data(b);
		sum=0;
        AMX0P=0x0f;              //AD输入选择P2.7,盐度A/D转换通道
		for(i=0;i<100;i++)
		{
			delay(50000);
		}
	}
}

⌨️ 快捷键说明

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