📄 point3_fs.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]=0x33;
config_data[11]=0x44; //接收通道1地址
config_data[12]=0x83;
config_data[13]=0x6f;
config_data[14]=0x0c; //配置状态字,发送状态
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]=0x33;
transmit_data[3]=0x44;
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 + -