標(biāo)題:
NRF24L01水庫無線傳輸控制
[打印本頁]
作者:
Beastly
時間:
2018-5-13 11:48
標(biāo)題:
NRF24L01水庫無線傳輸控制
水庫無線傳輸
附錄C
顯示電路程序
#include <reg51.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int
sbit rs = P2^6; //寄存器選擇輸入
sbit e = P2^7; //液晶使能控制
sbit MDO=P1^3;
sbit SCK=P1^4;
sbit CE=P1^5;
sbit IRQ=P1^2;
sbit MDI=P1^1;
sbit CSN=P1^0;
sbit key1=P1^6;
sbit key2=P1^7;
sbit key3=P3^2;
sbit key4=P3^3;
sbit buzzer=P2^5;
u8 code table1[16]=" WELCOME TO USE ";
u8 code table2[16]="Upper limit ";
u8 code table3[16]=" Connected ";
u8 code table4[16]="Lower limit ";
u8 code table5[16]=" Disconnected ";
u8 i,MAX,MIN,height,H;
u8 menu,cont,n,m,x,y;
bit star,lose,mode;
bit key1_press,key2_press,key3_press,key4_press;
bit s1,s2,s3,s4;
u8 tx[6],rx[6];
u16 wait;
void Delay15us() //@12.000MHz
{
unsigned char i;
i = 5;
while (--i);
}
void delay(u16 i)
{
while(i--)
Delay15us();
}
void write_com(u8 com) //函數(shù)功能:寫指令
{
e=0;
rs=0;
P0=com;
delay(10);
e=1;
delay(20);
e=0;
}
void write_data(u8 dat) //函數(shù)功能:寫數(shù)據(jù)
{
e=0;
rs=1;
P0=dat;
delay(10);
e=1;
delay(20);
e=0;
}
void init1602(void) //函數(shù)功能:初始化1602
{
delay(300);
write_com(0x38);
delay(100);
write_com(0x38);
delay(100);
write_com(0x38);
write_com(0x38);
write_com(0x01);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
u8 SPI(u8 byte) //以下為無線模塊的控制程序,比較復(fù)雜。SPI模擬程序
{
u8 i;
for(i=0;i<8;i++)
{
MDI=(byte&0x80);//單片機(jī)輸出最高位數(shù)據(jù)
SCK=1; //時鐘信號的上升沿后無線模塊讀取新數(shù)據(jù)
byte<<=1; //數(shù)據(jù)左移
byte|=MDO; //單片機(jī)讀取數(shù)據(jù)
SCK=0; //時鐘信號的下降沿后無線模塊輸出新數(shù)據(jù)
}
return byte;
}
void REG_write(u8 address,u8 command) //寫配置寄存器
{
CSN=0; //選中無線模塊
SPI(0x20+address); //地址
SPI(command); //命令
CSN=1; //停止操作
}
void FIFO_read(u8 DATA_IN[]) //讀取接收數(shù)據(jù)緩沖區(qū)
{
CSN=0;
SPI(0x61); //讀取命令
DATA_IN[0]=SPI(0); //讀取數(shù)據(jù)
DATA_IN[1]=SPI(0);
DATA_IN[2]=SPI(0);
DATA_IN[3]=SPI(0);
DATA_IN[4]=SPI(0);
DATA_IN[5]=SPI(0);
CSN=1;
}
void FIFO_write(u8 DATA_OUT[])
{
CSN=0;
SPI(0xa0);
SPI(DATA_OUT[0]);
SPI(DATA_OUT[1]);
SPI(DATA_OUT[2]);
SPI(DATA_OUT[3]);
SPI(DATA_OUT[4]);
SPI(DATA_OUT[5]);
CSN=1;
}
void NRF_init()
{
CE=0; //先關(guān)閉模塊,才能寫命令寄存器
SCK=0;
REG_write(0x01,0x00); //不允許自動應(yīng)答
REG_write(0x02,0x01); //使用P0信道通信,使用默認(rèn)地址
REG_write(0x04,0x00); //不允許自動應(yīng)答
REG_write(0x05,66); //使用第64頻道,總計128頻道,可自定義
REG_write(0x06,0x27); //250kbps,0dBm
REG_write(0x11,6);//每次信號6字節(jié)數(shù)據(jù)
CE=1;
}
void RX_mode()
{
CE=0; //先關(guān)閉模塊,才能寫命令寄存器
REG_write(0x00,0x3b); //CRC,8 bit,Power on,RX
CE=1;
}
void TX_mode()
{
CE=0;
REG_write(0x00,0x0a);
CE=1;
}
main()
{
delay(100);
init1602();
NRF_init();
TX_mode();
write_com(0x80);
for(i=0;i<16;i++)
{
write_data(table1[i]);
}
delay(50000);
FIFO_write(tx);
IP=0x08; //T1優(yōu)先級
star=1;MAX=70;MIN=40;tx[2]=MIN;mode=1;
TR1=1;
TR0=1;
IE=0x8a;
while(1);
}
void ET0_isr()interrupt 1
{
TL0 = 0xB0; //設(shè)置定時初值50ms
TH0 = 0x3C;
n++;
if(n==1)
{
TX_mode();
FIFO_write(tx);
delay(100);
RX_mode();
}
else if(n==10) //200ms
{
n=0;
lose=0;
if(IRQ==0)
{
FIFO_read(rx); //讀取接收數(shù)據(jù)
CE=0;
REG_write(0x07,0x40); //清除無線模塊中斷信號
CE=1;
}
else lose=1;
x=100-MIN;
y=100-MAX;
if(height>x||height<y||lose)buzzer=0;
else buzzer=1;
if(key1_press)
{
key1_press=0;
menu++;
if(menu>2)menu=0;
star=1;
}
if(key4_press)
{
key4_press=0;
if(mode)mode=0,tx[5]=0x55;
else mode=1,tx[5]=0;
}
if(menu==0)
{
star=0;
write_com(0x80);
if(lose)
{
for(i=0;i<16;i++)
{
write_data(table5[i]);
}
}
else
{ for(i=0;i<16;i++)
{
write_data(table3[i]);
}
}
write_com(0x80+0x40);
write_data('H');
write_data('e');
write_data('i');
write_data('g');
write_data('h');
write_data('t');
write_data(':');
H=rx[0];
if(H>90)H=90;
height=100-H;
if(height<100)write_data(' ');
else write_data(height/100+48);
write_data(height%100/10+48);
write_data(height%10+48);
write_data('m');
write_data(' ');
if(mode)
{
write_data('A');
write_data('u');
write_data('t');
write_data('o');
}
else
{
write_data('P');
write_data('u');
write_data('m');
write_data('p');
}
write_data((u8)mode+48);
}
else if(menu==1)
{
if(star)
{
star=0;
write_com(0x80);
for(i=0;i<16;i++)
{
write_data(table2[i]);
}
}
write_com(0x80+0x40);
if(key2_press) //調(diào)整最大值
{
key2_press=0;
MIN++;
}
if(key3_press)
{
key3_press=0;
MIN--;
}
tx[2]=MIN;
write_data('<');
write_data('=');
write_data(x%100/10+48);
write_data(x%10+48);
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
}
else if(menu==2)
{
if(star)
{
star=0;
write_com(0x80);
for(i=0;i<16;i++)
{
write_data(table4[i]);
}
}
write_com(0x80+0x40);
if(key2_press) //調(diào)整角度最大值
{
key2_press=0;
MAX++;
}
if(key3_press)
{
key3_press=0;
MAX--;
}
write_data('>');
write_data('=');
write_data(y%100/10+48);
write_data(y%10+48);
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
}
}
}
void ET1_isr()interrupt 3
{
TL1 = 0xf0; //設(shè)置定時初值10ms
TH1 = 0xd8;
if(key1) //按鍵檢測
{
if(s1)
{
s1=0;
key1_press=1;
}
}
else s1=1;
if(key2)
{
if(s2)
{
s2=0;
key2_press=1;
}
}
else s2=1;
if(key3)
{
if(s3)
{
s3=0;
key3_press=1;
}
}
else s3=1;
if(key4)
{
if(s4)
{
s4=0;
key4_press=1;
}
}
else s4=1;
}
控制電路程序
#include <reg51.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int
sbit trig=P1^7;
sbit echo=P1^6;
sbit relay= P1^0; //繼電器
u8 height,MIN,n;
sbit MDO=P2^3;
sbit SCK=P2^4;
sbit CE=P2^5;
sbit IRQ=P2^2;
sbit MDI=P2^1;
sbit CSN=P2^0;
u8 i;
u8 tx[6],rx[6];
u8 last,t,fast;
u16 h;
void Delay15us() //@12.000MHz
{
unsigned char i;
i = 5;
while (--i);
}
void delay(u16 i)
{
while(i--)
Delay15us();
}
u8 SPI(u8 byte) //以下為無線模塊的控制程序,比較復(fù)雜。SPI模擬程序
{
u8 i;
for(i=0;i<8;i++)
{
MDI=(byte&0x80);//單片機(jī)輸出最高位數(shù)據(jù)
SCK=1; //時鐘信號的上升沿后無線模塊讀取新數(shù)據(jù)
byte<<=1; //數(shù)據(jù)左移
byte|=MDO; //單片機(jī)讀取數(shù)據(jù)
SCK=0; //時鐘信號的下降沿后無線模塊輸出新數(shù)據(jù)
}
return byte;
}
void REG_write(u8 address,u8 command) //寫配置寄存器
{
CSN=0; //選中無線模塊
SPI(0x20+address); //地址
SPI(command); //命令
CSN=1; //停止操作
}
void FIFO_read(u8 DATA_IN[]) //讀取接收數(shù)據(jù)緩沖區(qū)
{
CSN=0;
SPI(0x61); //讀取命令
DATA_IN[0]=SPI(0); //讀取數(shù)據(jù)
DATA_IN[1]=SPI(0);
DATA_IN[2]=SPI(0);
DATA_IN[3]=SPI(0);
DATA_IN[4]=SPI(0);
DATA_IN[5]=SPI(0);
CSN=1;
}
void FIFO_write(u8 DATA_OUT[])
{
CSN=0;
SPI(0xa0);
SPI(DATA_OUT[0]);
SPI(DATA_OUT[1]);
SPI(DATA_OUT[2]);
SPI(DATA_OUT[3]);
SPI(DATA_OUT[4]);
SPI(DATA_OUT[5]);
CSN=1;
}
void NRF_init()
{
CE=0; //先關(guān)閉模塊,才能寫命令寄存器
SCK=0;
REG_write(0x01,0x00); //不允許自動應(yīng)答
REG_write(0x02,0x01); //使用P0信道通信,使用默認(rèn)地址
REG_write(0x04,0x00); //不允許自動應(yīng)答
REG_write(0x05,66); //使用第64頻道,總計128頻道,可自定義
REG_write(0x06,0x27); //250kbps,0dBm
REG_write(0x11,6);//每次信號6字節(jié)數(shù)據(jù)
CE=1;
}
void RX_mode()
{
CE=0; //先關(guān)閉模塊,才能寫命令寄存器
REG_write(0x00,0x3b); //CRC,8 bit,Power on,RX
CE=1;
}
void TX_mode()
{
CE=0;
REG_write(0x00,0x0a);
CE=1;
}
main()
{
delay(100);
NRF_init();
RX_mode();
MIN=40;
TMOD=0x01;
IE=0x82;
TR0=1;
while(1)
{
}
}
void ET0_isr()interrupt 1
{
TL0 = 0xB0; //設(shè)置定時初值50ms
TH0 = 0x3C;
if(IRQ==0)
{
FIFO_read(rx); //讀取接收數(shù)據(jù)
CE=0;
REG_write(0x07,0x40); //清除無線模塊中斷信號
CE=1;
MIN=rx[2];
TX_mode();
FIFO_write(tx);
delay(100);
RX_mode();
}
/*
*/
n++;
trig=1;
delay(30);
trig=0;
height=0;
while(!echo);
while(echo)
{
height++;
if(height>250)break;
}
h+=height;
if(n==10)
{
n=0;
h=h/10;
tx[0]=h;
t++;
if(t>4)
{
t=0;
if(h-15<MIN)
{
if(last-MIN>15)fast=1;
else fast=0;
last=MIN;
}
else fast=0,last=MIN+15;
}
if(h<MIN||rx[5]==0x55||fast)
{
relay=0;
}
else relay=1;
h=0;
}
}
復(fù)制代碼
程序.docx
2018-5-13 11:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.4 KB, 下載次數(shù): 6, 下載積分: 黑幣 -5
作者:
emnides
時間:
2019-10-22 22:54
感想分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1