📄 zpoint_yj.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 + -