?? 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 + -