當前位置:首頁 » 無線網路 » 無線感測網路和單片機
擴展閱讀
蘋果snr診斷軟體 2025-01-19 16:22:06
沉迷網路怎麼賣手機 2025-01-19 16:21:52

無線感測網路和單片機

發布時間: 2024-05-17 08:40:12

1. 物聯網如何學習

想要成為一名物聯網工程師,可以學習以下幾個方面:

1、物聯網產業與技術導論:全面了解物聯網RFID、M2M、感測網、兩化融合等技術與應用。

2、C語言程序設計:物聯網涉及底層編程,C語言為必修課,同時需要了解OSGi,OPC,Silverlight等技術標准。

3、Java程序設計:物聯網應用層,伺服器端集成技術,開放Java技術也是必修課,同時需要了解Eclipse,SWT,Flash,HTML5等技術使用。

4、TCP/IP網路與協議:TCP/IP以及OSI網路分層協議標準是所有有線和無線網路協議的基礎,Socket編程技術也是基礎技能。

5、嵌入式系統技術:嵌入式系統是物聯網感知層和通訊層重要技術。

6、無線感測網路:學習各種無線RF通訊技術與標准,Zigbee,藍牙,WiFi,GPRS,CDMA,3G,4G,5G等。

(1)無線感測網路和單片機擴展閱讀

物聯網的基本特徵

1、整體感知

可以利用射頻識別、二維碼、智能感測器等感知設備感知獲取物體的各類信息。

2、可靠傳輸

通過對互聯網、無線網路的融合,將物體的信息實時、准確地傳送,以便信息交流、分享。

3、智能處理

使用各種智能技術,對感知和傳送到的數據、信息進行分析處理,實現監測與控制的智能化。

2. STM32W鏃犵嚎灝勯慫igBee鍗曠墖鏈哄師鐞嗕笌搴旂敤鐨勫唴瀹圭畝浠

STM32W鏄鍩轟簬IEEE 802.15.4鏍囧噯鍜孉RM Cortex?M3鍐呮牳鐨勯珮鎬ц兘銆佷綆鍔熻椼佸唴宓岀綉緇滃崗璁鏍堢殑鏃犵嚎灝勯戝崟鐗囨満銆傚叏涔﹀叡7絝狅細絎1絝犱粙緇嶅嚑縐嶇煭璺濈繪棤綰跨綉緇滄妧鏈鍙婃爣鍑嗐佸崗璁錛涚2絝犱粙緇峉TM32W108鑺鐗囧強鍏剁數姘旂壒鎬э紱絎3絝犲拰絎4絝犺︾粏鎻忚堪STM32W108鐨勭郴緇熸ā鍧椼佸皠棰戞ā鍧楀拰鐗囧唴澶栬劇殑鍔熻兘銆佸師鐞嗗拰緙栫▼緇撴瀯錛涚5絝犱粙緇峉TM32W108鐨勫紑鍙戠幆澧冨拰宸ュ叿錛涚6絝犺︾粏璇存槑STM32W108鐨凪AC銆乑igBee錛堝寘鎷瀹夊叏錛夊拰RF4CE絳夌綉緇滃崗璁搴撶殑緇撴瀯鍜屼嬌鐢ㄦ柟娉曪紱絎7絝犱粙緇嶅熀浜嶴TM32W108鐨勭‖浠惰捐°佸簲鐢ㄦā鍧楀拰寮鍙戝椾歡錛屽苟鍒椾婦浜2涓搴旂敤璁捐″疄渚嬨
鏈涔﹂傚悎浜庝粠浜嬫棤綰誇紶鎰熺綉銆乑igBee/RF4CE銆佺墿鑱旂綉銆佹棤綰誇華鍣ㄤ華琛ㄣ佹棤綰塊仴鎺х瓑搴旂敤緋葷粺寮鍙戠殑宸ョ▼鎶鏈浜哄憳瀛︿範鍙傝冿紝涔熼傚悎浣滀負鏃犵嚎浼犳劅緗戙佺墿鑱旂綉絳夊疄璺佃劇▼鐨勬暀鏉愶紝浠ュ強STM32W鐨勫煿璁銆佽嚜瀛︾敤涔︺

3. 51鍗曠墖鏈哄拰DS18B20娓╁害浼犳劅鍣ㄣ丩CD1602娑叉櫠鏄劇ず錛孨RF24L01鏃犵嚎浼犺緭妯″潡 鐨勬棤綰挎俯搴︾洃嫻嬬郴緇熺殑鏀跺彂紼嬪簭

/******************************鏃犵嚎娓╁害鍙戦***********************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//鍙戦佸湴鍧瀹藉害璁劇疆涓5涓瀛楄妭
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01鎸囦護鏍煎紡錛
*******************************************************************/
#define R_REGISTER 0x00 // 璇誨瘎瀛樺櫒
#define W_REGISTER 0x20 // 鍐欏瘎瀛樺櫒
#define R_RX_PLOAD 0x61 // 璇籖X FIFO鏈夋晥鏁版嵁錛1-32瀛楄妭錛屽綋璇繪暟鎹瀹屾垚鍚庯紝鏁版嵁琚娓呴櫎錛屽簲鐢ㄤ簬鎺ユ敹妯″紡
#define W_TX_PLOAD 0xA0 // 鍐橳X FIFO鏈夋晥鏁版嵁錛1-32瀛楄妭錛屽啓鎿嶄綔浠庡瓧鑺0寮濮嬶紝搴旂敤浜庡彂灝勬ā寮
#define FLUSH_TX 0xE1 // 娓呴櫎TX FIFO瀵勫瓨鍣錛屽簲鐢ㄤ簬鍙戝皠妯″紡
#define FLUSH_RX 0xE2 // 娓呴櫎RX FIFO瀵勫瓨鍣錛屽簲鐢ㄤ簬鎺ユ敹妯″紡
#define REUSE_TX_PL 0xE3 // 閲嶆柊浣跨敤涓婁竴鍖呮湁鏁堟暟鎹錛屽綋CE涓洪珮榪囩▼涓錛屾暟鎹鍖呰涓嶆柇鐨勯噸鏂板彂灝
#define NOP 0xFF // 絀烘搷浣滐紝鍙浠ョ敤鏉ヨ葷姸鎬佸瘎瀛樺櫒
/******************************************************************
// nRF24L01瀵勫瓨鍣ㄥ湴鍧
*******************************************************************/
#define CONFIG 0x00 // 閰嶇疆瀵勫瓨鍣
#define EN_AA 0x01 // 鈥滆嚜鍔ㄥ簲絳斺濆姛鑳藉瘎瀛
#define EN_RX_ADDR 0x02 // 鎺ユ敹閫氶亾浣胯兘瀵勫瓨鍣
#define SETUP_AW 0x03 // 鍦板潃瀹藉害璁劇疆瀵勫瓨鍣
#define SETUP_RETR 0x04 // 鑷鍔ㄩ噸鍙戣劇疆瀵勫瓨鍣
#define RF_CH 0x05 // 灝勯戦氶亾棰戠巼璁劇疆瀵勫瓨鍣
#define RF_SETUP 0x06 // 灝勯戣劇疆瀵勫瓨鍣
#define STATUS 0x07 // 鐘舵佸瘎瀛樺櫒
#define OBSERVE_TX 0x08 // 鍙戦佹嫻嬪瘎瀛樺櫒
#define CD 0x09 // 杞芥嘗媯嫻嬪瘎瀛樺櫒
#define RX_ADDR_P0 0x0A // 鏁版嵁閫氶亾0鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P1 0x0B // 鏁版嵁閫氶亾1鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P2 0x0C // 鏁版嵁閫氶亾2鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P3 0x0D // 鏁版嵁閫氶亾3鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P4 0x0E // 鏁版嵁閫氶亾4鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P5 0x0F // 鏁版嵁閫氶亾5鎺ユ敹鍦板潃瀵勫瓨鍣
#define TX_ADDR 0x10 // 鍙戦佸湴鍧瀵勫瓨鍣
#define RX_PW_P0 0x11 // 鏁版嵁閫氶亾0鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P1 0x12 // 鏁版嵁閫氶亾1鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P2 0x13 // 鏁版嵁閫氶亾2鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P3 0x14 // 鏁版嵁閫氶亾3鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P4 0x15 // 鏁版嵁閫氶亾4鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P5 0x16 // 鏁版嵁閫氶亾5鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define FIFO_STATUS 0x17 // FIFO鐘舵佸瘎瀛樺櫒
//*********************************************************************************
uchar sta; // 鐘舵佸彉閲
#define RX_DR (sta & 0x40) // 鎺ユ敹鎴愬姛涓鏂鏍囧織
#define TX_DS (sta & 0x20) // 鍙戝皠鎴愬姛涓鏂鏍囧織
#define MAX_RT (sta & 0x10) // 閲嶅彂婧㈠嚭涓鏂鏍囧織
sbit CE=P1^5;
sbit IRQ=P1^0;
sbit CSN=P1^4;
sbit MOSI=P1^2;
sbit MISO=P1^1;
sbit SCK=P1^3;
//sbit key=P1^0;
sbit LED=P0^0;
sbit DQ=P1^6;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
//uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
uchar RX_Buffer[RX_DATA_WITDH];
uchar Temp_Value[]={0x00,0x00};
uchar Temp=0;
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK=1;
uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//decimal fraction
void _delay_tus(uint x)
{
while(--x);
}
void _delay_us(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<120;i++);
}
/**************************************************/
/*鍑芥暟鍔熻兘:DS18B20鍒濆嬪寲銆銆銆銆銆銆銆銆銆銆銆銆銆*/
/*鍏ュ彛鍙傛暟:鏃 */
/*鍑哄彛鍑芥暟:status */
/**************************************************/
uchar DS18B20_Init(void)
{
uchar status;
DQ=1;
_delay_tus(10);
DQ=0;
_delay_tus(90);
DQ=1;
_delay_tus(8);
status=DQ;
_delay_tus(100);
DQ=1;
return status;
}
/**************************************************/
/*鍑芥暟鍔熻兘:浠嶥S18B20璇誨彇涓瀛楄妭銆銆銆銆銆銆銆銆銆銆*/
/*鍏ュ彛鍙傛暟:鏃 */
/*鍑哄彛鍑芥暟:dat(榪斿洖璇誨彇鍒版暟鎹) */
/**************************************************/
uchar Read_One_Byte(void)
{
uchar i,dat=0;
DQ=1;
_nop_();
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
_nop_();_nop_();
if(DQ)
dat|=0x80;
_delay_tus(30);
DQ=1;
}
return dat;
}
/**************************************************/
/*鍑芥暟鍔熻兘:鍚慏S18B20鍐欎竴瀛楄妭銆銆銆銆銆銆銆銆銆銆銆*/
/*鍏ュ彛鍙傛暟:dat(鎶奷at鍐欏叆DS18B20) */
/*鍑哄彛鍑芥暟:鏃 銆銆*/
/**************************************************/
void Write_One_Byte(uchar dat)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
_delay_tus(5);
DQ=1;
dat>>=1;
}
}
/**************************************************/
/*鍑芥暟鍔熻兘:浠嶥S18B20璇誨彇鏁版嵁(鏁版嵁)銆銆銆銆銆銆銆銆*/
/*鍏ュ彛鍙傛暟:鏃 */
/*鍑哄彛鍑芥暟:鏃 銆銆 */
/**************************************************/
void Read_Temp(void)
{
uchar ng=0;
if(DS18B20_Init()==1)
DS18B20_IS_OK=0;
else
{
Write_One_Byte(0xcc);
Write_One_Byte(0x44);
DS18B20_Init();
Write_One_Byte(0xcc);
Write_One_Byte(0xbe);
Temp_Value[0]=Read_One_Byte();
Temp_Value[1]=Read_One_Byte();
DS18B20_IS_OK=1;
}
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=Temp/100;
Display_Digit[2]=Temp%100/10;
Display_Digit[1]=Temp%10;
}
/**************************************************/
/*鍑芥暟鍔熻兘:浠嶥S18B20璇誨彇鏁版嵁杞鎹㈡垚ASCII鐮佸啓鍏ユ恫鏅 */
/*妯″潡銆銆銆銆銆銆銆銆 */
/*鍏ュ彛鍙傛暟:鏃 */
/*鍑哄彛鍑芥暟:鏃 銆銆 */
/**************************************************/
/*void Display_Temperature(void)
{
uchar ng=0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=Temp/100;
Display_Digit[2]=Temp%100/10;
Display_Digit[1]=Temp%10;
}
Display_LINE1[13]=0x43;
Display_LINE1[12]=0xdf;
Display_LINE1[11]=Display_Digit[0]+'0';
Display_LINE1[10]='.';
Display_LINE1[9]=Display_Digit[1]+'0';
Display_LINE1[8]=Display_Digit[2]+'0';
Display_LINE1[7]=Display_Digit[3]+'0';
if(Display_Digit[3]==0)
Display_LINE1[7]=' ';
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Display_LINE1[8]=' ';
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-';
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-';
else
Display_LINE1[6]='-';
}
LCD_POS(0);
Show_String(Display_LINE0);
LCD_POS(0x40);
Show_String(Display_LINE1);
}
void main(void)
{
Init_LCD();
Read_Temp();
_delay_ms(1000);
while(1)
{
Read_Temp();
if(DS18B20_IS_OK)
Display_Temperature();
_delay_ms(200);
}
}*/
/*nRF24L01鍒濆嬪寲*/
void nRF24L01_Init(void)
{
_delay_us(2000);
CE=0;//寰呮満妯″紡鈪
CSN=1;
SCK=0;
IRQ=1;
}
/*SPI鏃跺簭鍑芥暟*/
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)//涓瀛楄妭8浣嶅驚鐜8嬈″啓鍏
{
if(byte&0x80)//濡傛灉鏁版嵁鏈楂樹綅鏄1//褰撹塊棶澶氬瓧鑺傚瘎瀛樺櫒鏃墮栧厛瑕佽/鍐欑殑鏄鏈浣庡瓧鑺傜殑楂樹綅?
MOSI=1;//鍚慛RF24L01鍐1
else //鍚﹀垯鍐0
MOSI=0;
byte<<=1;//浣庝竴浣嶇Щ鍒版渶楂樹綅
SCK=1;//SCK鎷夐珮錛屽啓鍏ヤ竴浣嶆暟鎹錛屽悓鏃惰誨彇涓浣嶆暟鎹
if(MISO)
byte|=0x01;
SCK=0;//SCK鎷変綆
}
return byte;//榪斿洖璇誨彇涓瀛楄妭
}
/*SPI鍐欏瘎瀛樺櫒涓瀛楄妭鍑芥暟*/
/*reg:瀵勫瓨鍣ㄥ湴鍧*/
/*value:涓瀛楄妭錛堝礆級*/
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;//榪斿洖鐘舵
CSN=0;//SPI鐗囬
status=SPI_RW(reg);//鍐欏叆瀵勫瓨鍣ㄥ湴鍧錛屽悓鏃惰誨彇鐘舵
SPI_RW(value);//鍐欏叆涓瀛楄妭
CSN=1;//
return status;//榪斿洖鐘舵
}
/*SPI*/
uchar SPI_R_byte(uchar reg)
{
uchar reg_value;
CSN=0;//SPI鐗囬
SPI_RW(reg);//鍐欏叆鍦板潃
reg_value=SPI_RW(0);//璇誨彇瀵勫瓨鍣ㄧ殑鍊
CSN=1;
return reg_value;//榪斿洖璇誨彇鐨勫
}
/*SPI璇誨彇RXFIFO瀵勫瓨鍣ㄦ暟鎹*/
/*reg:瀵勫瓨鍣ㄥ湴鍧*/
/**Dat_Buffer:鐢ㄦ潵瀛樿誨彇鐨勬暟鎹*/
/*DLen:鏁版嵁闀垮害*/
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI鐗囬
status=SPI_RW(reg);//鍐欏叆瀵勫瓨鍣ㄥ湴鍧錛屽悓鏃剁姸鎬
for(i=0;i<Dlen;i++)
{
Dat_Buffer[i]=SPI_RW(0);//瀛樺偍鏁版嵁
}
CSN=1;
return status;
}
/*SPI鍚慣XFIFO瀵勫瓨鍣ㄥ啓鍏ユ暟鎹*/
/*reg:鍐欏叆瀵勫瓨鍣ㄥ湴鍧*/
/*TX_Dat_Buffer:瀛樻斁闇瑕佸彂閫佺殑鏁版嵁*/
/*Dlen:鏁版嵁闀垮害*/
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI鐗囬夛紝鍚鍔ㄦ椂搴
status=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
SPI_RW(TX_Dat_Buffer[i]);//鍙戦佹暟鎹
}
CSN=1;
return status;
}
/*璁劇疆鍙戦佹ā寮*/
void nRF24L01_Set_TX_Mode(uchar *TX_Data)
{
CE=0;//寰呮満錛堝啓瀵勫瓨鍣ㄤ箣鍓嶄竴瀹氳佽繘鍏ュ緟鏈烘ā寮忔垨鎺夌數妯″紡錛
SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);/*鍐欏瘎瀛樺櫒鎸囦護+鎺ユ敹鑺傜偣鍦板潃+鍦板潃瀹藉害*/
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);/*涓轟簡鎺ユ敹璁懼囧簲絳斾俊鍙鳳紝鎺ユ敹閫氶亾0鍦板潃涓庡彂閫佸湴鍧鐩稿悓*/
SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/*鍐欐湁鏁堟暟鎹鍦板潃+鏈夋晥鏁版嵁+鏈夋晥鏁版嵁瀹藉害*/
SPI_W_Reg(W_REGISTER+EN_AA,0x01);/*鎺ユ敹閫氶亾0鑷鍔ㄥ簲絳*/
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/*浣胯兘鎺ユ敹閫氶亾0*/
SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);/*鑷鍔ㄩ噸鍙戝歡鏃250US+86US錛岄噸鍙10嬈*/
//SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+RF_CH,0x40);/*(2400+40)MHZ閫夋嫨灝勯戦氶亾0X40*/
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/*1Mbps閫熺巼,鍙戝皠鍔熺巼:0DBM,浣庡櫔澹版斁澶у櫒澧炵泭*/
SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/*鍙戦佹ā寮,涓婄數,16浣岰RC鏍¢獙,CRC浣胯兘*/
CE=1;//鍚鍔ㄥ彂灝
_delay_ms(5);/*CE楂樼數騫蟲寔緇鏃墮棿鏈灝10US浠ヤ笂*/
}
uchar Check_Rec(void)
{
uchar status;
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
status=1;
}
SPI_W_Reg(W_REGISTER+STATUS,0xff);
return status;
}
/*媯嫻嬪簲絳斾俊鍙*/
uchar Check_Ack(void)
{
sta=SPI_R_byte(R_REGISTER+STATUS);/*璇誨彇瀵勫瓨鐘舵*/
if(TX_DS||MAX_RT)/*濡傛灉TX_DS鎴朚AX_RT涓1,鍒欐竻闄や腑鏂鍜屾竻闄TX_FIFO瀵勫瓨鍣ㄧ殑鍊*/
{
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_TX);
CSN=1;
return 0;
}
else
return 1;
}
void main(void)
{
uchar i;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
nRF24L01_Init();
Read_Temp();
_delay_ms(1000);
while(1)
{
Read_Temp();
if(DS18B20_IS_OK)
{
for(i=0;i<TX_DATA_WITDH-4;i++)//鍑1鏄鍥犱負鏈鍚庝竴浣嶄負緇撴潫鏍囧織
{
LED=~LED;
nRF24L01_Set_TX_Mode(&Display_Digit[i]);
_delay_ms(100);
while(Check_Ack());
//LED=0;
}
}
}
}
/******************************鏃犵嚎娓╁害鎺ユ敹***********************/

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//鍙戦佸湴鍧瀹藉害璁劇疆涓5涓瀛楄妭
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01鎸囦護鏍煎紡錛
*******************************************************************/
#define R_REGISTER 0x00 // 璇誨瘎瀛樺櫒
#define W_REGISTER 0x20 // 鍐欏瘎瀛樺櫒
#define R_RX_PLOAD 0x61 // 璇籖X FIFO鏈夋晥鏁版嵁錛1-32瀛楄妭錛屽綋璇繪暟鎹瀹屾垚鍚庯紝鏁版嵁琚娓呴櫎錛屽簲鐢ㄤ簬鎺ユ敹妯″紡
#define W_TX_PLOAD 0xA0 // 鍐橳X FIFO鏈夋晥鏁版嵁錛1-32瀛楄妭錛屽啓鎿嶄綔浠庡瓧鑺0寮濮嬶紝搴旂敤浜庡彂灝勬ā寮
#define FLUSH_TX 0xE1 // 娓呴櫎TX FIFO瀵勫瓨鍣錛屽簲鐢ㄤ簬鍙戝皠妯″紡
#define FLUSH_RX 0xE2 // 娓呴櫎RX FIFO瀵勫瓨鍣錛屽簲鐢ㄤ簬鎺ユ敹妯″紡
#define REUSE_TX_PL 0xE3 // 閲嶆柊浣跨敤涓婁竴鍖呮湁鏁堟暟鎹錛屽綋CE涓洪珮榪囩▼涓錛屾暟鎹鍖呰涓嶆柇鐨勯噸鏂板彂灝
#define NOP 0xFF // 絀烘搷浣滐紝鍙浠ョ敤鏉ヨ葷姸鎬佸瘎瀛樺櫒
/******************************************************************
// nRF24L01瀵勫瓨鍣ㄥ湴鍧
*******************************************************************/
#define CONFIG 0x00 // 閰嶇疆瀵勫瓨鍣
#define EN_AA 0x01 // 鈥滆嚜鍔ㄥ簲絳斺濆姛鑳藉瘎瀛樺櫒
#define EN_RX_ADDR 0x02 // 鎺ユ敹閫氶亾浣胯兘瀵勫瓨鍣
#define SETUP_AW 0x03 // 鍦板潃瀹藉害璁劇疆瀵勫瓨鍣
#define SETUP_RETR 0x04 // 鑷鍔ㄩ噸鍙戣劇疆瀵勫瓨鍣
#define RF_CH 0x05 // 灝勯戦氶亾棰戠巼璁劇疆瀵勫瓨鍣
#define RF_SETUP 0x06 // 灝勯戣劇疆瀵勫瓨鍣
#define STATUS 0x07 // 鐘舵佸瘎瀛樺櫒
#define OBSERVE_TX 0x08 // 鍙戦佹嫻嬪瘎瀛樺櫒
#define CD 0x09 // 杞芥嘗媯嫻嬪瘎瀛樺櫒
#define RX_ADDR_P0 0x0A // 鏁版嵁閫氶亾0鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P1 0x0B // 鏁版嵁閫氶亾1鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P2 0x0C // 鏁版嵁閫氶亾2鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P3 0x0D // 鏁版嵁閫氶亾3鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P4 0x0E // 鏁版嵁閫氶亾4鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P5 0x0F // 鏁版嵁閫氶亾5鎺ユ敹鍦板潃瀵勫瓨鍣
#define TX_ADDR 0x10 // 鍙戦佸湴鍧瀵勫瓨鍣
#define RX_PW_P0 0x11 // 鏁版嵁閫氶亾0鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P1 0x12 // 鏁版嵁閫氶亾1鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P2 0x13 // 鏁版嵁閫氶亾2鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P3 0x14 // 鏁版嵁閫氶亾3鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P4 0x15 // 鏁版嵁閫氶亾4鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P5 0x16 // 鏁版嵁閫氶亾5鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define FIFO_STATUS 0x17 // FIFO鐘舵佸瘎瀛樺櫒
//*********************************************************************************
uchar sta; // 鐘舵佸彉閲
#define RX_DR (sta & 0x40) // 鎺ユ敹鎴愬姛涓鏂鏍囧織
#define TX_DS (sta & 0x20) // 鍙戝皠鎴愬姛涓鏂鏍囧織
#define MAX_RT (sta & 0x10) // 閲嶅彂婧㈠嚭涓鏂鏍囧織

sbit CE=P1^5; //RX/TX妯″紡閫夋嫨絝
sbit IRQ=P1^0; //鍙灞忚斀涓鏂絝
sbit CSN=P1^4; //SPI鐗囬夌//灝辨槸SS
sbit MOSI=P1^2;//SPI涓繪満杈撳嚭浠庢満杈撳叆絝
sbit MISO=P1^1;//SPI涓繪満杈撳嚭浠庢満杈撳嚭絝
sbit SCK=P1^3;//SPI鏃墮挓絝
sbit LED=P0^0;
sbit key=P2^0;
sbit LCD_RS=P2^2;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^0;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar RX_Buffer[RX_DATA_WITDH];
uchar code Display_LINE0[]={" FROM NRF24L01:"};
uchar Display_LINE1[]={" TEMP: "};
void _delay_us(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<120;i++);
}
bit LCD_Busy(void)//嫻嬪繖
{
bit LCD_Status;//榪斿洖鍊煎彉閲
LCD_RS=0;//璇誨彇鐘舵
LCD_RW=1;
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_Status=(bit)(P3&0x80);
LCD_EN=0;
return LCD_Status;
}
void LCD_Write_Command(uchar cmd)//鍐欐寚浠
{
//while(LCD_Busy());
LCD_RS=0;//
LCD_RW=0;
LCD_EN=0;
_nop_();_nop_();
P3=cmd;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=0;
}
void LCD_Write_Data(uchar dat)//鍐欐暟鎹
{
//while(LCD_Busy());//姣忔″啓鏁版嵁鎿嶄綔涔嬪墠鍧囬渶瑕佹嫻嬪繖淇″彿
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P3=dat;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=0;
}
void Init_LCD(void)//娑叉櫠鍒濆嬪寲
{
_delay_ms(15);//寤舵椂15MS
LCD_Write_Command(0x38);
_delay_ms(5);
LCD_Write_Command(0x38);
_delay_ms(5);
LCD_Write_Command(0x38);//浠ュ悗姣忔″啓鎸囦護鎿嶄綔涔嬪墠鍧囬渶瑕佹嫻嬪繖淇″彿
//while(LCD_Busy());
_delay_ms(5);
LCD_Write_Command(0x01);//娓呭睆
//while(LCD_Busy());
_delay_ms(5);
LCD_Write_Command(0x38);//璁劇疆16*2鏄劇ず,5*7鐐歸樀,8浣嶆暟鎹鎺ュ彛
_delay_ms(5);
//while(LCD_Busy());
LCD_Write_Command(0x0c);//寮鏄劇ず,涓嶆樉紺哄厜鏍
_delay_ms(5);
//while(LCD_Busy());
LCD_Write_Command(0x06);//褰撹繪垨鍐欎竴涓瀛楃﹀悗鍦板潃鎸囬拡鍔犱竴,涓斿厜鏍囧姞涓
}
void LCD_POS(uchar pos)//瀛楃︽樉紺轟綅緗
{
LCD_Write_Command(0x80|pos);
}
void Show_String(uchar *str)//鏄劇ず瀛楃︿覆
{
while(*str!='\0')
LCD_Write_Data(*str++);
}
void nRF24L01_Init(void)
{
_delay_us(2000);
CE=0;
CSN=1;
SCK=0;
IRQ=1;
}
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if(byte&0x80)
MOSI=1;
else
MOSI=0;
byte<<=1;
SCK=1;
if(MISO)
byte|=0x01;
SCK=0;
}
return byte;
}
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return status;
}
uchar SPI_R_byte(uchar reg)
{
uchar status;
CSN=0;
SPI_RW(reg);
status=SPI_RW(0);
CSN=1;
return status;
}
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
Dat_Buffer[i]=SPI_RW(0);
}
CSN=1;
return reg_value;
}
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
SPI_RW(TX_Dat_Buffer[i]);
}
CSN=1;
return reg_value;
}
void nRF24L01_Set_RX_Mode(void)
{
CE=0;//寰呮満
//SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);
SPI_W_Reg(W_REGISTER+EN_AA,0x01);
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
//SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+RF_CH,0x40);
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);
SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
CE=1;
_delay_ms(5);
}
uchar nRF24L01_RX_Data(void)
{
//uchar i,status;
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
//P3=RX_Buffer[0];
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_RX);
CSN=1;
return 1;
}
else
return 0;
}
void main(void)
{
uchar i,RX_Temp_Value[RX_DATA_WITDH];//ng;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
Init_LCD();
nRF24L01_Init();
_delay_us(1000);
LCD_POS(0);
Show_String(Display_LINE0);
while(1)
{
nRF24L01_Set_RX_Mode();
//_delay_ms(100);
if(nRF24L01_RX_Data())
{
for(i=0;i<RX_DATA_WITDH;i++)
{
RX_Temp_Value[i]=RX_Buffer[i];
LED=~LED;
}
}
Display_LINE1[7]=RX_Temp_Value[3]+'0';
Display_LINE1[8]=RX_Temp_Value[2]+'0';
Display_LINE1[9]=RX_Temp_Value[1]+'0';
Display_LINE1[10]='.';
Display_LINE1[11]=RX_Temp_Value[0]+'0';
Display_LINE1[12]=0xdf;
Display_LINE1[13]=0x43;
if(RX_Temp_Value[3]==0)
Display_LINE1[7]=' ';
/*if(RX_Temp_Value[2]==0&&RX_Temp_Value[3]==0)
Display_LINE1[8]=' ';
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-';
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-';
else
Display_LINE1[6]='-';*/
LCD_POS(0x40);
Show_String(Display_LINE1);
}
}
宸查氳繃嫻嬭瘯鐨勶紝甯屾湜鑳藉府鍔╁埌浣狅紒