无线货架仓储控制系统实验项目报告.docx
《无线货架仓储控制系统实验项目报告.docx》由会员分享,可在线阅读,更多相关《无线货架仓储控制系统实验项目报告.docx(43页珍藏版)》请在冰豆网上搜索。
无线货架仓储控制系统实验项目报告
无线货架仓储控制系统实验
——项目报告
一:
实验名称
二:
实验目的
掌握嵌入式系统开发的方法,熟练掌握从总体方案设计、硬件电路的搭建调试、软件的编写测试到最终的软硬件联调、系统性能测试等各环节;掌握无线模块的控制方法.
三:
实验内容
利用51单片机开发板,无线模块,液晶显示屏等实现低成本,简单的无线仓储系统的设计。
四:
相关知识
五:
实验步骤
1.总体方案设计
总体方案设计图
2.软件设计
单片机部分
主程序流程首先是初始化,主要包括通用I/O端口,UART,SPI,以及LCD初始化,并在LCD上显示开机初始信息。
接着单片机开始接收从无线模块发的信息,然后进行485通信,实现仓储管理。
总机
#include
#include"LCD1602.h"
#defineucharunsignedchar
#defineuintunsignedint
#define_ERR_0xff
#define_SUCC_0xfe
sbitREDE=P3^4;
ucharrec;
ucharnum,temp;
voiddelay(uintt)
{
for(;t>0;t--);
}
voidldelay(uintt)
uinti=100;
for(;i>0;i--)
voidSend_date(uchar*buf)
ucharlen;
ucharecc;
uchari;
len=strlen(buf);
ecc=len;
REDE=1;
TI=0;
TB8=0;
SBUF=len;
while(!
TI);
for(i=0;i{ecc=ecc^(*buf);TB8=0;SBUF=*buf;buf++;while(!TI);TI=0;}TB8=0;SBUF=ecc;while(!TI);TI=0;REDE=0;}voidSend_addr(ucharaddr,uchar*buf){uchartmp=addr-1;while(tmp!=addr){REDE=1;TI=0;TB8=1;SBUF=addr;while(!TI);TI=0;REDE=0;RI=0;ldelay(1);while(!RI);tmp=SBUF;RI=0;}tmp=_ERR_;while(tmp!=_SUCC_){Send_date(buf);REDE=0;RI=0;while(!RI);tmp=SBUF;RI=0;}wdec(addr);//wstr("#OK");}voidinit(){delay(10);//延时等待复位wcmd(0x38);//设置为8总线16*2,5*7点阵wcmd(0x01);//清屏幕wcmd(0x06);//光标移动,显示区不移动wcmd(0x0f);//开显示,光标闪烁}voiddisplay(ucharaa){//wcmd(0x80);loc(2,1);wdate(aa);}ucharkeyscan(){P2=0xef;temp=P2;temp=temp&0x0f;while(temp!=0x0f){delay(5);temp=P2;temp=temp&0x0f;while(temp!=0x0f){temp=P2;switch(temp){case0xee:num=0x30;break;case0xed:num=0x31;init();wstr("zongj");loc(2,1);SCON=0x90;PCON=0x80;ES=1;EA=1;REDE=0;Send_addr(0x01,"a");break;case0xeb:num=0x32;init();wstr("zongj");loc(2,1);SCON=0x90;PCON=0x80;ES=1;EA=1;REDE=0;Send_addr(0x01,"b");Send_addr(0x02,"b");break;case0xe7:num=0x33;break;}while(temp!=0x0f){temp=P2;temp=temp&0x0f;}}}P2=0xdf;temp=P2;temp=temp&0x0f;while(temp!=0x0f){delay(5);temp=P2;temp=temp&0x0f;while(temp!=0x0f){temp=P2;switch(temp){case0xde:num=0x34;break;case0xdd:num='5';init();wstr("zongj");loc(2,1);SCON=0x90;PCON=0x80;ES=1;EA=1;REDE=0;Send_addr(0x01,"s");break;case0xdb:num='6';break;case0xd7:num='7';break;}while(temp!=0x0f){temp=P2;temp=temp&0x0f;}}}P2=0xbf;temp=P2;temp=temp&0x0f;while(temp!=0x0f){delay(5);temp=P2;temp=temp&0x0f;while(temp!=0x0f){temp=P2;switch(temp){case0xbe:num='8';break;case0xbd:num='9';break;case0xbb:num='A';break;case0xb7:num='B';break;}while(temp!=0x0f){temp=P2;temp=temp&0x0f;}}}P2=0x7f;temp=P2;temp=temp&0x0f;while(temp!=0x0f){delay(5);temp=P2;temp=temp&0x0f;while(temp!=0x0f){temp=P2;switch(temp){case0x7e:num='C';break;case0x7d:num='D';break;case0x7b:num='E';break;case0x77:num='F';break;}while(temp!=0x0f){temp=P2;temp=temp&0x0f;}}}returnnum;}voidmain(){INIT();num=0;while(1){display(keyscan());}}分机#include#include#include"LCD1602.h"#defineucharunsignedchar#defineuintunsignedint#defineMYADD0x01#define_ERR_0xff#define_SUCC_0xfesbitREDE=P3^4;ucharbuf[10];//JIADEsbityou=P2^1;sbityouchu=P2^3;//JIADEvoiddelay(uintt){for(;t>0;t--);}voidldelay(uintt){uinti=100;for(;i>0;i--)for(;t>0;t--);}ucharRec_date(uchar*buf){ucharlen;ucharecc;uchartmp;uchari;REDE=0;RI=0;while(!RI);if(RB8==1)return0xfe;len=SBUF;RI=0;ecc=len;for(i=0;i{while(!RI);if(RB8==1)return0xfe;*buf=SBUF;RI=0;ecc=ecc^(*buf);buf++;}*buf='\0';while(!RI);if(RB8==1)return0xfe;tmp=SBUF;RI=0;ecc=tmp^ecc;if(ecc!=0){*(buf-len)='\0';REDE=1;TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;REDE=0;return0xff;}REDE=1;TI=0;TB8=0;SBUF=_SUCC_;while(!TI);TI=0;REDE=0;return0;}voidserial_RI()interrupt4{uchartmp;tmp=0;while(tmp!=MYADD){while(!RI);tmp=SBUF;RI=0;}delay(1000);REDE=1;TI=0;TB8=0;SBUF=MYADD;while(!TI);TI=0;REDE=0;SM2=0;tmp=0xff;while(tmp==0xff){tmp=Rec_date(buf);}if(tmp==0xfe)SM2=1;wstr(buf);}voidinit(){delay(10);//延时等待复位wcmd(0x38);//设置为8总线16*2,5*7点阵wcmd(0x01);//清屏幕wcmd(0x06);//光标移动,显示区不移动wcmd(0x0f);//开显示,光标闪烁}voidmain(){init();wstr("fenj1");loc(2,1);SCON=0xb0;PCON=0x80;ES=1;EA=1;REDE=0;P2=0xf7;while(1){if(you==0){delay(5);if(you==0){youchu=1;}while(!you);delay(5);while(!you);youchu=0;}if(P1=='a'){youchu=1;}if(P1=='b'){youchu=1;}if(P1=='s'){youchu=0;}}}无线发射、接受部分#include#defineucharunsignedchar#defineuintunsignedint#defineBYTE_BIT00x01#defineBYTE_BIT10x02#defineBYTE_BIT20x04#defineBYTE_BIT30x08#defineBYTE_BIT40x10#defineBYTE_BIT50x20#defineBYTE_BIT60x40#defineBYTE_BIT70x80//,具体细节请参考相关电路图FYTOOvNRFDemo2401.SchDoc(用PortelDXP打开)sbitPWR_UP=P2^6;sbitCE=P2^2;//sbitDR2=P3^5;//暂时没有用到//sbitCLK2=P3^4;//sbitOUT2=P3^3;sbitCS=P2^1;sbitDR1=P2^0;sbitCLK1=P3^7;sbitDATA=P3^3;/***************************************************************RF2401Configuration**保存2401的配置信息***************************************************************//*==========*///芯片测试用,无需修改#defineTEST_20x8E//MSBD143~D136#defineTEST_10x08//D135~D128#defineTEST_00x1C//D127~D120/*注意:DATAx_W+ADDRx_W+CRC的值必须小于256!单个数据包的大小必须小于32字节(256位)*/#defineDATA2_W0x10//2字节//频道2数据长度(单位:Bit)#defineDATA1_W0x10//28字节//频道1数据长度(单位:Bit)//频道2接收地址(当前模块地址)#defineADDR2_40x00#defineADDR2_30x1c#defineADDR2_20xcc#defineADDR2_10xcc#defineADDR2_00xcc//频道1接收地址#defineADDR1_40xcc#defineADDR1_30xcc#defineADDR1_20xcc#defineADDR1_10xcc#defineADDR1_00xcc#defineADDR_W0x10//2字节//接收地址宽度(单位:Bit)#defineCRC_L0x1//CRC模式0:8位1:16#defineCRC_EN0x1//CRC校验启用#defineRX2_EN0x0//双频道功能启用#defineCM0x1//0:Directmode1:ShockBurstmode#defineRFDR_SB0x0//0:250kbps1:1Mbps#defineXO_F0x3//nRF2401晶振频率000:4M001:8M010:12M011:16M100:20M#defineRF_PWR0x3//0dBm信号发射功率00:-20dBm01:-10dBm10:-5dBm11:0dBm#defineRF_CH0x2//ChannelRF频率channel=2400Mhz+RF-CH*1.0Mhz#defineRXEN0x0//0:Tx1:Rx程序会通过SetTxMode和SetRxMode重新设置此参数#defineRFConfig_Byte0TEST_2#defineRFConfig_Byte1TEST_1#defineRFConfig_Byte2TEST_0#defineRFConfig_Byte3DATA2_W#defineRFConfig_Byte4DATA1_W#defineRFConfig_Byte5ADDR2_4#defineRFConfig_Byte6ADDR2_3#defineRFConfig_Byte7ADDR2_2#defineRFConfig_Byte8ADDR2_1#defineRFConfig_Byte9ADDR2_0#defineRFConfig_Byte10ADDR1_4#defineRFConfig_Byte11ADDR1_3#defineRFConfig_Byte12ADDR1_2#defineRFConfig_Byte13ADDR1_1#defineRFConfig_Byte14ADDR1_0#defineRFConfig_Byte15(ADDR_W<<2|CRC_L<<1|CRC_EN)#defineRFConfig_Byte16(RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)#defineRFConfig_Byte17(RF_CH<<1|RXEN)unsignedcharcodenRF2401_Conf[18]={RFConfig_Byte0,RFConfig_Byte1,RFConfig_Byte2,RFConfig_Byte3,RFConfig_Byte4,RFConfig_Byte5,RFConfig_Byte6,RFConfig_Byte7,RFConfig_Byte8,RFConfig_Byte9,RFConfig_Byte10,RFConfig_Byte11,RFConfig_Byte12,RFConfig_Byte13,RFConfig_Byte14,RFConfig_Byte15,RFConfig_Byte16,RFConfig_Byte17};voidDelay100(void){unsignedinti;for(i=0;i<100;i++);}voidDelay(ucharn){uinti;while(n--)for(i=0;i<80;i++);}bdataunsignedcharDATA_BUF;#defineDATA7((DATA_BUF&BYTE_BIT7)!=0)//最高位为1#defineDATA0((DATA_BUF&BYTE_BIT0)!=0)//最低位为1unsignedcharSpi_ByteRead(void){unsignedchari=0;for(i=0;i<8;i++){DATA_BUF=DATA_BUF<<1;CLK1=1;DATA=1;//设置为输入状态if(DATA)//读取最高位,保存至最末尾,通过左移位完成整个字节{DATA_BUF|=BYTE_BIT0;}else{DATA_BUF&=~BYTE_BIT0;}CLK1=0;}returnDATA_BUF;}voidSpi_ByteWrite(unsignedcharsend){unsignedchari;DATA_BUF=send;CLK1=0;for(i=0;i<8;i++){if(DATA7)//总是发送最高位{DATA=1;}else{DATA=0;}CLK1=1;DATA_BUF=DATA_BUF<<1;CLK1=0;}}voidConfig2401(void){unsignedinti=0;
ecc=ecc^(*buf);
SBUF=*buf;
buf++;
SBUF=ecc;
REDE=0;
voidSend_addr(ucharaddr,uchar*buf)
uchartmp=addr-1;
while(tmp!
=addr)
TB8=1;
SBUF=addr;
RI=0;
ldelay
(1);
RI);
tmp=SBUF;
tmp=_ERR_;
=_SUCC_)
Send_date(buf);
wdec(addr);
//wstr("#OK");
voidinit()
delay(10);//延时等待复位
wcmd(0x38);//设置为8总线16*2,5*7点阵
wcmd(0x01);//清屏幕
wcmd(0x06);//光标移动,显示区不移动
wcmd(0x0f);//开显示,光标闪烁
voiddisplay(ucharaa)
//wcmd(0x80);
loc(2,1);
wdate(aa);
ucharkeyscan()
P2=0xef;
temp=P2;
temp=temp&0x0f;
while(temp!
=0x0f)
delay(5);
switch(temp)
case0xee:
num=0x30;
break;
case0xed:
num=0x31;
init();
wstr("zongj");
SCON=0x90;
PCON=0x80;
ES=1;
EA=1;
Send_addr(0x01,"a");
case0xeb:
num=0x32;
Send_addr(0x01,"b");
Send_addr(0x02,"b");
case0xe7:
num=0x33;
P2=0xdf;
case0xde:
num=0x34;
case0xdd:
num='5';
Send_addr(0x01,"s");
case0xdb:
num='6';
case0xd7:
num='7';
P2=0xbf;
case0xbe:
num='8';
case0xbd:
num='9';
case0xbb:
num='A';
case0xb7:
num='B';
P2=0x7f;
case0x7e:
num='C';
case0x7d:
num='D';
case0x7b:
num='E';
case0x77:
num='F';
returnnum;
voidmain()
INIT();
num=0;
while
(1)
display(keyscan());
分机
#defineMYADD0x01
ucharbuf[10];
//JIADE
sbityou=P2^1;
sbityouchu=P2^3;
ucharRec_date(uchar*buf)
uchartmp;
if(RB8==1)
return0xfe;
len=SBUF;
for(i=0;i{while(!RI);if(RB8==1)return0xfe;*buf=SBUF;RI=0;ecc=ecc^(*buf);buf++;}*buf='\0';while(!RI);if(RB8==1)return0xfe;tmp=SBUF;RI=0;ecc=tmp^ecc;if(ecc!=0){*(buf-len)='\0';REDE=1;TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;REDE=0;return0xff;}REDE=1;TI=0;TB8=0;SBUF=_SUCC_;while(!TI);TI=0;REDE=0;return0;}voidserial_RI()interrupt4{uchartmp;tmp=0;while(tmp!=MYADD){while(!RI);tmp=SBUF;RI=0;}delay(1000);REDE=1;TI=0;TB8=0;SBUF=MYADD;while(!TI);TI=0;REDE=0;SM2=0;tmp=0xff;while(tmp==0xff){tmp=Rec_date(buf);}if(tmp==0xfe)SM2=1;wstr(buf);}voidinit(){delay(10);//延时等待复位wcmd(0x38);//设置为8总线16*2,5*7点阵wcmd(0x01);//清屏幕wcmd(0x06);//光标移动,显示区不移动wcmd(0x0f);//开显示,光标闪烁}voidmain(){init();wstr("fenj1");loc(2,1);SCON=0xb0;PCON=0x80;ES=1;EA=1;REDE=0;P2=0xf7;while(1){if(you==0){delay(5);if(you==0){youchu=1;}while(!you);delay(5);while(!you);youchu=0;}if(P1=='a'){youchu=1;}if(P1=='b'){youchu=1;}if(P1=='s'){youchu=0;}}}无线发射、接受部分#include#defineucharunsignedchar#defineuintunsignedint#defineBYTE_BIT00x01#defineBYTE_BIT10x02#defineBYTE_BIT20x04#defineBYTE_BIT30x08#defineBYTE_BIT40x10#defineBYTE_BIT50x20#defineBYTE_BIT60x40#defineBYTE_BIT70x80//,具体细节请参考相关电路图FYTOOvNRFDemo2401.SchDoc(用PortelDXP打开)sbitPWR_UP=P2^6;sbitCE=P2^2;//sbitDR2=P3^5;//暂时没有用到//sbitCLK2=P3^4;//sbitOUT2=P3^3;sbitCS=P2^1;sbitDR1=P2^0;sbitCLK1=P3^7;sbitDATA=P3^3;/***************************************************************RF2401Configuration**保存2401的配置信息***************************************************************//*==========*///芯片测试用,无需修改#defineTEST_20x8E//MSBD143~D136#defineTEST_10x08//D135~D128#defineTEST_00x1C//D127~D120/*注意:DATAx_W+ADDRx_W+CRC的值必须小于256!单个数据包的大小必须小于32字节(256位)*/#defineDATA2_W0x10//2字节//频道2数据长度(单位:Bit)#defineDATA1_W0x10//28字节//频道1数据长度(单位:Bit)//频道2接收地址(当前模块地址)#defineADDR2_40x00#defineADDR2_30x1c#defineADDR2_20xcc#defineADDR2_10xcc#defineADDR2_00xcc//频道1接收地址#defineADDR1_40xcc#defineADDR1_30xcc#defineADDR1_20xcc#defineADDR1_10xcc#defineADDR1_00xcc#defineADDR_W0x10//2字节//接收地址宽度(单位:Bit)#defineCRC_L0x1//CRC模式0:8位1:16#defineCRC_EN0x1//CRC校验启用#defineRX2_EN0x0//双频道功能启用#defineCM0x1//0:Directmode1:ShockBurstmode#defineRFDR_SB0x0//0:250kbps1:1Mbps#defineXO_F0x3//nRF2401晶振频率000:4M001:8M010:12M011:16M100:20M#defineRF_PWR0x3//0dBm信号发射功率00:-20dBm01:-10dBm10:-5dBm11:0dBm#defineRF_CH0x2//ChannelRF频率channel=2400Mhz+RF-CH*1.0Mhz#defineRXEN0x0//0:Tx1:Rx程序会通过SetTxMode和SetRxMode重新设置此参数#defineRFConfig_Byte0TEST_2#defineRFConfig_Byte1TEST_1#defineRFConfig_Byte2TEST_0#defineRFConfig_Byte3DATA2_W#defineRFConfig_Byte4DATA1_W#defineRFConfig_Byte5ADDR2_4#defineRFConfig_Byte6ADDR2_3#defineRFConfig_Byte7ADDR2_2#defineRFConfig_Byte8ADDR2_1#defineRFConfig_Byte9ADDR2_0#defineRFConfig_Byte10ADDR1_4#defineRFConfig_Byte11ADDR1_3#defineRFConfig_Byte12ADDR1_2#defineRFConfig_Byte13ADDR1_1#defineRFConfig_Byte14ADDR1_0#defineRFConfig_Byte15(ADDR_W<<2|CRC_L<<1|CRC_EN)#defineRFConfig_Byte16(RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)#defineRFConfig_Byte17(RF_CH<<1|RXEN)unsignedcharcodenRF2401_Conf[18]={RFConfig_Byte0,RFConfig_Byte1,RFConfig_Byte2,RFConfig_Byte3,RFConfig_Byte4,RFConfig_Byte5,RFConfig_Byte6,RFConfig_Byte7,RFConfig_Byte8,RFConfig_Byte9,RFConfig_Byte10,RFConfig_Byte11,RFConfig_Byte12,RFConfig_Byte13,RFConfig_Byte14,RFConfig_Byte15,RFConfig_Byte16,RFConfig_Byte17};voidDelay100(void){unsignedinti;for(i=0;i<100;i++);}voidDelay(ucharn){uinti;while(n--)for(i=0;i<80;i++);}bdataunsignedcharDATA_BUF;#defineDATA7((DATA_BUF&BYTE_BIT7)!=0)//最高位为1#defineDATA0((DATA_BUF&BYTE_BIT0)!=0)//最低位为1unsignedcharSpi_ByteRead(void){unsignedchari=0;for(i=0;i<8;i++){DATA_BUF=DATA_BUF<<1;CLK1=1;DATA=1;//设置为输入状态if(DATA)//读取最高位,保存至最末尾,通过左移位完成整个字节{DATA_BUF|=BYTE_BIT0;}else{DATA_BUF&=~BYTE_BIT0;}CLK1=0;}returnDATA_BUF;}voidSpi_ByteWrite(unsignedcharsend){unsignedchari;DATA_BUF=send;CLK1=0;for(i=0;i<8;i++){if(DATA7)//总是发送最高位{DATA=1;}else{DATA=0;}CLK1=1;DATA_BUF=DATA_BUF<<1;CLK1=0;}}voidConfig2401(void){unsignedinti=0;
*buf=SBUF;
*buf='\0';
ecc=tmp^ecc;
if(ecc!
=0)
*(buf-len)='\0';
SBUF=_ERR_;
return0xff;
SBUF=_SUCC_;
return0;
voidserial_RI()interrupt4
tmp=0;
=MYADD)
delay(1000);
SBUF=MYADD;
SM2=0;
tmp=0xff;
while(tmp==0xff)
tmp=Rec_date(buf);
if(tmp==0xfe)
SM2=1;
wstr(buf);
wstr("fenj1");
SCON=0xb0;
P2=0xf7;
if(you==0)
youchu=1;
you);
youchu=0;
if(P1=='a'){youchu=1;}
if(P1=='b'){youchu=1;}
if(P1=='s'){youchu=0;}
无线发射、接受部分
#defineBYTE_BIT00x01
#defineBYTE_BIT10x02
#defineBYTE_BIT20x04
#defineBYTE_BIT30x08
#defineBYTE_BIT40x10
#defineBYTE_BIT50x20
#defineBYTE_BIT60x40
#defineBYTE_BIT70x80
//,具体细节请参考相关电路图FYTOOvNRFDemo2401.SchDoc(用PortelDXP打开)
sbitPWR_UP=P2^6;
sbitCE=P2^2;
//sbitDR2=P3^5;//暂时没有用到
//sbitCLK2=P3^4;
//sbitOUT2=P3^3;
sbitCS=P2^1;
sbitDR1=P2^0;
sbitCLK1=P3^7;
sbitDATA=P3^3;
/*
*************************************************************
*RF2401Configuration*
*保存2401的配置信息*
*/
/*==========*/
//芯片测试用,无需修改
#defineTEST_20x8E//MSBD143~D136
#defineTEST_10x08//D135~D128
#defineTEST_00x1C//D127~D120
/*注意:
DATAx_W+ADDRx_W+CRC的值必须小于256!
单个数据包的大小必须小于32字节(256位)*/
#defineDATA2_W0x10//2字节//频道2数据长度(单位:
Bit)
#defineDATA1_W0x10//28字节//频道1数据长度(单位:
//频道2接收地址(当前模块地址)
#defineADDR2_40x00
#defineADDR2_30x1c
#defineADDR2_20xcc
#defineADDR2_10xcc
#defineADDR2_00xcc
//频道1接收地址
#defineADDR1_40xcc
#defineADDR1_30xcc
#defineADDR1_20xcc
#defineADDR1_10xcc
#defineADDR1_00xcc
#defineADDR_W0x10//2字节//接收地址宽度(单位:
#defineCRC_L0x1//CRC模式0:
8位1:
16
#defineCRC_EN0x1//CRC校验启用
#defineRX2_EN0x0//双频道功能启用
#defineCM0x1//0:
Directmode1:
ShockBurstmode
#defineRFDR_SB0x0//0:
250kbps1:
1Mbps
#defineXO_F0x3//nRF2401晶振频率000:
4M001:
8M010:
12M011:
16M100:
20M
#defineRF_PWR0x3//0dBm信号发射功率00:
-20dBm01:
-10dBm10:
-5dBm11:
0dBm
#defineRF_CH0x2//ChannelRF频率channel=2400Mhz+RF-CH*1.0Mhz
#defineRXEN0x0//0:
Tx1:
Rx程序会通过SetTxMode和SetRxMode重新设置此参数
#defineRFConfig_Byte0TEST_2
#defineRFConfig_Byte1TEST_1
#defineRFConfig_Byte2TEST_0
#defineRFConfig_Byte3DATA2_W
#defineRFConfig_Byte4DATA1_W
#defineRFConfig_Byte5ADDR2_4
#defineRFConfig_Byte6ADDR2_3
#defineRFConfig_Byte7ADDR2_2
#defineRFConfig_Byte8ADDR2_1
#defineRFConfig_Byte9ADDR2_0
#defineRFConfig_Byte10ADDR1_4
#defineRFConfig_Byte11ADDR1_3
#defineRFConfig_Byte12ADDR1_2
#defineRFConfig_Byte13ADDR1_1
#defineRFConfig_Byte14ADDR1_0
#defineRFConfig_Byte15(ADDR_W<<2|CRC_L<<1|CRC_EN)
#defineRFConfig_Byte16(RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)
#defineRFConfig_Byte17(RF_CH<<1|RXEN)
unsignedcharcodenRF2401_Conf[18]={
RFConfig_Byte0,
RFConfig_Byte1,
RFConfig_Byte2,
RFConfig_Byte3,
RFConfig_Byte4,
RFConfig_Byte5,
RFConfig_Byte6,
RFConfig_Byte7,
RFConfig_Byte8,
RFConfig_Byte9,
RFConfig_Byte10,
RFConfig_Byte11,
RFConfig_Byte12,
RFConfig_Byte13,
RFConfig_Byte14,
RFConfig_Byte15,
RFConfig_Byte16,
RFConfig_Byte17
};
voidDelay100(void)
unsignedinti;
for(i=0;i<100;i++);
voidDelay(ucharn)
uinti;
while(n--)
for(i=0;i<80;i++);
bdataunsignedcharDATA_BUF;
#defineDATA7((DATA_BUF&BYTE_BIT7)!
=0)//最高位为1
#defineDATA0((DATA_BUF&BYTE_BIT0)!
=0)//最低位为1
unsignedcharSpi_ByteRead(void)
unsignedchari=0;
for(i=0;i<8;i++)
DATA_BUF=DATA_BUF<<1;
CLK1=1;
DATA=1;//设置为输入状态
if(DATA)//读取最高位,保存至最末尾,通过左移位完成整个字节
DATA_BUF|=BYTE_BIT0;
else
DATA_BUF&=~BYTE_BIT0;
CLK1=0;
returnDATA_BUF;
voidSpi_ByteWrite(unsignedcharsend)
unsignedchari;
DATA_BUF=send;
if(DATA7)//总是发送最高位
DATA=1;
DATA=0;
voidConfig2401(void)
unsignedinti=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1