版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.先发后接:/*/hc-sr04 超声波测距模块 DEMO 程序/晶振:11.0592/接线:模块TRIG接 P3.6 ECH0 接p3.5/数码管:共阴数码管P2接数据口,P1.0 P1.1 P1.2接选通数码管/*/ #include <reg52.h> /器件配置文件#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;/*#define TX_ADR_WIDTH 1 / 5 uints TX address width#define RX_ADR_WIDTH 1 /
2、5 uints RX address width#define TX_PLOAD_WIDTH 1 / 20 uints TX payload#define RX_PLOAD_WIDTH 1 / 20 uints TX payloaduint const TX_ADDRESSTX_ADR_WIDTH= 0x01; /本地地址uint const RX_ADDRESSRX_ADR_WIDTH= 0x01;/接收地址/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PL
3、OAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02
4、/ 可用信道设置#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_A
5、DDR_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 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#d
6、efine RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, ucha
7、r value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);void delayus(unsigned int i);void delayms(unsigned int k);void write_command
8、(unsigned char command);void write_data(unsigned char dat);void init_1602();uchar RxBuf1; /存放接收到的数据uchar TxBuf1; /需要发送的数据/*uint bdata sta; /状态标志sbitRX_DR=sta6;sbitTX_DS=sta5;sbitMAX_RT=sta4;/*NRF24L01端口定义*sbit MISO=P15;sbit MOSI=P11;sbitSCK =P16;sbitCE =P17;sbitCSN=P12;sbitIRQ=P32;/1602控制端口sbit rs_1
9、602=P00;sbit rw_1602=P01;sbit en_1602=P02;unsigned char a,b; /a用于接收的,b用于发送的/*以下为无线模块*/NRF24L01初始化void init_NRF24L01(void)delayus(100); CE=0; / chip enable CSN=1; / Spi disable SCK=0; / Spi clock line init highSPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址SPI_Write_Buf(WRITE_RE
10、G + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节
11、SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dB/SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CRC,主接收 /SPI_RW_Reg(WRITE_REG + CONFIG, 0xbf);/函数:uint SPI_RW(uint uchar)/功能:NRF24L01的SPI写时序uint SPI_RW(uint uchar)uint bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr+) / output 8-bit
12、 MOSI = (uchar & 0x80); / output 'uchar', MSB to MOSIuchar = (uchar << 1); / shift next bit into MSB.SCK = 1; / Set SCK high.uchar |= MISO; / capture current MISO bitSCK = 0; / .then set SCK low again return(uchar); / return read uchar/函数:uchar SPI_Read(uchar reg)/功能:NRF24L01的SPI时序
13、uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI communicationreturn(reg_val); / return register value/功能:NRF24L01读写寄存器函数uint SPI_RW_Re
14、g(uchar reg, uchar value)uint status;CSN = 0; / CSN low, init SPI transactionstatus = SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high againreturn(status); / return nRF24L01 status uchar/函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/功能: 用于读数据,reg
15、:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0
16、); / CSN = 1; return(status); / return nRF24L01 status uchar/函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; u
17、char_ctr<uchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1; /关闭SPIreturn(status); / /函数:void SetRX_Mode(void)/功能:数据接收配置 void SetRX_Mode(void)CE=0;/SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CRC,主接收CE = 1; delayus(130);/函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/功能:数据读取后放如rx_b
18、uf接收缓冲区中unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0;sta=SPI_Read(STATUS);/ 读取状态寄存其来判断数据接收状况if(RX_DR)/ 判断是否接收到数据 CE = 0; /SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;/读取数据完成标志SPI_RW_Reg(WRITE_REG+STATUS,sta
19、); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;/函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/功能:发送 tx_buf中数据void nRF24L01_TxPacket(unsigned char * tx_buf)CE=0;/StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_
20、PLOAD_WIDTH); / 装载数据/SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送CE=1; /置高CE,激发数据发送delayus(10);/通过串口将接收到数据发送给PC端void R_S_Byte(uchar R_Byte) SBUF = R_Byte; while( TI = 0 );/查询法 TI = 0; /*无线模块到此为止*/*以下为延时模块*/延时1MS函数void delayms(unsigned int k) unsigned int j,i; for(j=k;j>0;j-) for
21、(i=110;i>0;i-);/延时1us函数void delayus(unsigned int i) for(;i>0;i-);/*延时模块到此为止*/*以下为LCD1602模块*/1602写指令函数void write_command(unsigned char command)/写指令函数 rs_1602=0; rw_1602=0; en_1602=0; delayms(2); P2=command; delayus(2); en_1602=1; delayms(3); en_1602=0;/1602写数据函数void write_data(unsigned char dat
22、)/写数据函数 rs_1602=1; rw_1602=0; en_1602=0; delayms(2); P2=dat; delayus(2); en_1602=1; delayms(3); en_1602=0;/1602初始化程序void init_1602()/初始化 write_command(0x01);/清屏 write_command(0x38);/设置16*2显示,5*7点阵,8位数据口 write_command(0x0c);/开显示、显示光标 write_command(0x80);/写1062初始地址,0x80为1602第一行第一个地址/*LCD1602模块到此为止*/vo
23、id main() a=1;b=1;TxBuf0=5;RxBuf0=0;init_1602(); /1602初始化init_NRF24L01(); /无线通信24L01初始化delayms(300);EA=1; /开启总中断EX0=1;/开外部中断1IT0=1;/下降沿触发while(1) SPI_RW_Reg(WRITE_REG + CONFIG, 0xfe); /24L01处于发送状态delayms(30);nRF24L01_TxPacket(TxBuf);/ Transmit Tx buffer datadelayms(30); /可变SPI_RW_Reg(WRITE_REG+STATU
24、S,0XFF); delayms(30); while(b)a=1;TxBuf0+;if(TxBuf0>9) TxBuf0=0;break;SPI_RW_Reg(WRITE_REG + CONFIG, 0xbf); /24L01处于接收状态 SetRX_Mode(); /等待接受数据,在接受数据前要写这条指令delayms(300); while(a) /接收循环,中断函数中成功接收数据后,退出该循环 _nop_(); write_command(0x80);write_data(0x30+RxBuf0%10); void zhongd() interrupt 0 /外部中断函数ucha
25、r i,j=1,temp;while(j) if(nRF24L01_RxPacket(RxBuf) /接收数据 temp+; for(i=0;i<1;i+) R_S_Byte(RxBufi); delayms(3); j=0;/通过无线接收到的数据存入RxBuf0后再退出中断 a=0; /接收到数据后,退出接收循环(循环在主函数里面进行)b=1; /接收到数据后,进入发送循环(循环在主函数里面进行) 先接后发:/*/hc-sr04 超声波测距模块 DEMO 程序/晶振:11.0592/接线:模块TRIG接 P3.6 ECH0 接p3.5/数码管:共阴数码管P2接数据口,P1.0 P1.1
26、 P1.2接选通数码管/*/ #include <reg52.h> /器件配置文件#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;/*#define TX_ADR_WIDTH 1 / 5 uints TX address width#define RX_ADR_WIDTH 1 / 5 uints RX address width#define TX_PLOAD_WIDTH 1 / 20 uints TX payload#define RX_PLOAD_WIDTH 1 /
27、 20 uints TX payloaduint const TX_ADDRESSTX_ADR_WIDTH= 0x01; /本地地址uint const RX_ADDRESSRX_ADR_WIDTH= 0x01;/接收地址/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define
28、FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工
29、作频率设置#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接收数据地址#de
30、fine RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / F
31、IFO栈入栈出状态寄存器设置void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, u
32、char *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);void delayus(unsigned int i);void delayms(unsigned int k);void write_command(unsigned char command);void write_data(unsigned char dat);void init_1602();uchar RxBuf1; /存放接收到
33、的数据uchar TxBuf1; /需要发送的数据/*uint bdata sta; /状态标志sbitRX_DR=sta6;sbitTX_DS=sta5;sbitMAX_RT=sta4;/*NRF24L01端口定义*sbit MISO=P35;sbit MOSI=P31;sbitSCK =P36;sbitCE =P33;sbitCSN=P30;sbitIRQ=P32;/LCD12864端口定义sbit rs_12864=P10;sbit rw_12864=P11;sbit en_12864=P12;sbit psb_12864=P37;unsigned char a,b; /a用于接收的,b
34、用于发送的/*以下为无线模块*/NRF24L01初始化void init_NRF24L01(void)delayus(100); CE=0; / chip enable CSN=1; / Spi disable SCK=0; / Spi clock line init highSPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址SPI_RW_Reg(WRITE_RE
35、G + EN_AA, 0x01); / 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dB/SPI_R
36、W_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CRC,主接收 /SPI_RW_Reg(WRITE_REG + CONFIG, 0xbf);/函数:uint SPI_RW(uint uchar)/功能:NRF24L01的SPI写时序uint SPI_RW(uint uchar)uint bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr+) / output 8-bit MOSI = (uchar & 0x80); / output 'uchar', MSB to MOSIuchar
37、 = (uchar << 1); / shift next bit into MSB.SCK = 1; / Set SCK high.uchar |= MISO; / capture current MISO bitSCK = 0; / .then set SCK low again return(uchar); / return read uchar/函数:uchar SPI_Read(uchar reg)/功能:NRF24L01的SPI时序uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize
38、SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI communicationreturn(reg_val); / return register value/功能:NRF24L01读写寄存器函数uint SPI_RW_Reg(uchar reg, uchar value)uint status;CSN = 0; / CSN low, init SPI tran
39、sactionstatus = SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high againreturn(status); / return nRF24L01 status uchar/函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数uint SPI_Read_Buf(uchar reg, uchar
40、 *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); / CSN = 1; return(status); / return nRF24L01 status uchar/函数:uint S
41、PI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1; /关闭SPIreturn(
42、status); / /函数:void SetRX_Mode(void)/功能:数据接收配置 void SetRX_Mode(void)CE=0;/SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CRC,主接收CE = 1; delayus(130);/函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/功能:数据读取后放如rx_buf接收缓冲区中unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigne
43、d char revale=0;sta=SPI_Read(STATUS);/ 读取状态寄存其来判断数据接收状况if(RX_DR)/ 判断是否接收到数据 CE = 0; /SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;/读取数据完成标志SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;/函数:void nR
44、F24L01_TxPacket(unsigned char * tx_buf)/功能:发送 tx_buf中数据void nRF24L01_TxPacket(unsigned char * tx_buf)CE=0;/StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 装载数据/SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送CE=1; /置高CE,激发数据发送delay
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB34-T 5413-2026 小儿手术室外舒适化诊疗麻醉管理规范
- 农业银行:积极满足美丽中国建设多元融资需求
- 关于树立和践行正确政绩观的重要论述研讨发言材料
- 汉语言师范职业方向
- 预制构件厂配料机管控细则
- 某变速器厂车间安全防护办法
- 体育赛事中的AI黑科技
- 襄阳四中2026届高三下学期质量检测 物理试卷+答案
- XX中学2025-2026学年春季学期校园体育馆建设方案
- 2026年看守所三级安全教育培训试题卷
- 《流域综合规划》课件
- 2023眼视光行业白皮书-美团医疗x动脉网-202406
- 化工企业生产异常工况辨识方法
- 《复旦大学》课件
- 提高混凝土外墙螺杆洞封堵质量验收合格率
- 品质部绩效考核评分表(KPI)
- 脉冲分配放大器校准规范
- 茅台酱酒文化知识讲座
- 光电器件教学课件
- 浙江万盛股份有限公司年产43500吨磷酸酯无卤阻燃剂及副产43000吨30%盐酸、含氯化钠盐等装备提升技改项目、年产10000吨氯丁烷技改项目、年产6000吨复配型阻燃剂项目环评报告
- 上海印象旅游城市介绍模板(免费下载)
评论
0/150
提交评论