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);
}
}
宸查氲繃娴嬭瘯镄勶纴甯屾湜鑳藉府锷╁埌浣狅紒