-
UID:1070803
-
- 注册时间2012-02-13
- 最后登录2015-09-02
- 在线时间432小时
-
-
访问TA的空间加好友用道具
|
中断方式 压缩包里是代码文件加sprntlayout文件 接收部分改过在下面。 - //jieshou.c
- #include <reg52.h>
- #include <intrins.h>
- #include "MAX232.h"
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char RevFlags;
- unsigned char sec;
- unsigned char TxData[4];
- unsigned char Flag;
- unsigned char bufTop;
- sbit CE=P1^2; //RX/TX模式选择端
- //sbit IRQ=P1^3; //可屏蔽中断端
- sbit IRQ=P3^2;
- sbit CSN=P1^4; //SPI片选端//就是SS
- sbit MOSI=P1^5; //SPI主机输出从机输入端
- sbit MISO=P1^6; //SPI主机输出从机输出端
- sbit SCK=P1^7; //SPI时钟端
- sbit BEEP = P1^1;
- sbit LED = P1^0;
- sbit LIGHT = P3^4;
- unsigned char RxBuf[8]={0};
- unsigned char RxBuf1[8]={0};
- unsigned char RxBuf2[8]={0};
- unsigned char RxBuf3[8]={0};
- unsigned char RxBuf4[8]={0};
- uchar sta; //状态标志
- #define RX_DR (sta & 0x40)
- #define TX_DS (sta & 0x20)
- #define MAX_RT (sta & 0x10)
- #define TX_ADR_WIDTH 5 // 5 uints TX address width
- #define RX_ADR_WIDTH 5 // 5 uints RX address width
- #define TX_PLOAD_WIDTH 5 // 20 uints TX payload
- #define RX_PLOAD_WIDTH 5 // 20 uints TX payload
- uchar RX_ADDRESS0[RX_ADR_WIDTH]= {0x12,0x34,0x56,0x78,0x90}; //通道0地址
- uchar RX_ADDRESS1[RX_ADR_WIDTH]= {0xc2,0x13,0x54,0xa5,0x76}; //通道1地址
- uchar RX_ADDRESS2[1]= {0xc3}; //通道2地址
- uchar RX_ADDRESS3[1]= {0xc4}; //通道3地址
- uchar RX_ADDRESS4[1]= {0xc5}; //通道4地址
- uchar RX_ADDRESS5[1]= {0xc6}; //通道5地址
- //***************************************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 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 // 工作频率设置
- #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 // 接收频道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 // FIFO栈入栈出状态寄存器设置
- //**************************************************************************************
- void Delay(unsigned int s);
- void inerDelay_us(unsigned char n);
- void init_NRF24L01(void);
- uchar SPI_RW(uchar byte);
- uchar SPI_Read(uchar reg);
- void SetRX_Mode(void);
- uchar SPI_RW_Reg(uchar reg, uchar value);
- uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar num);
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar num);
- unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
- void nRF24L01_TxPacket(unsigned char * tx_buf);
- void bin2hex(unsigned char ch,unsigned char* buf);
- void delayms(unsigned int count);
- void int_init(void);
- void inerDelay_us(unsigned char n)
- {
- for(;n>0;n--)
- _nop_();
- }
- //******************************************************************************************
- //***********毫秒延时程序********************/
- void delayms(unsigned int count)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- //****************************************************************************************
- //NRF24L01初始化
- void init_NRF24L01(void)
- {
- delayms(1);
- CE=0; // chip enable
- CSN=1; // Spi disable
- SCK=0; // Spi clock line init high
- //IRQ=1;
- SPI_Write_Buf(WRITE_REG + TX_ADDR, RX_ADDRESS0, TX_ADR_WIDTH); // 写本地地址,自动应答
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, RX_ADR_WIDTH); // 写发射端0地址
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); // 写发射端1地址
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P2, RX_ADDRESS2, 1); // 写发射端2地址
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P3, RX_ADDRESS3, 1); // 写发射端3地址
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P4, RX_ADDRESS4, 1); // 写发射端4地址
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P5, RX_ADDRESS5, 1); // 写发射端5地址
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f); // 频道0自动 ACK应答允许
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
- SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 设置信道工作为2.4GHZ,收发必须一致
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
- SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
- SPI_RW_Reg(WRITE_REG + RX_PW_P2, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
- SPI_RW_Reg(WRITE_REG + RX_PW_P3, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
- SPI_RW_Reg(WRITE_REG + RX_PW_P4, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
- SPI_RW_Reg(WRITE_REG + RX_PW_P5, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
- }
- //***************************************************************************************************
- //函数:uint SPI_RW(uint uchar)
- //功能:NRF24L01的SPI写时序
- //***************************************************************************************************/
- uchar SPI_RW(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++) // output 8-bit
- {
- MOSI = (byte & 0x80); // output 'uchar', MSB to MOSI
- //byte = (byte << 1); // shift next bit into MSB..
- byte <<= 1;
- SCK = 1; // Set SCK high..
- if(MISO)
- byte |= 1; // capture current MISO bit
- SCK = 0; // ..then set SCK low again
- }
- return(byte); // return read uchar
- }
- //***************************************************************************************************
- //函数:uchar SPI_Read(uchar reg)
- //功能:NRF24L01的SPI时序
- /****************************************************************************************************/
- 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 registervalue
- CSN = 1; // CSN high, terminate SPI communication
- return(reg_val); // return register value
- }
- //***************************************************************************************************/
- //功能:NRF24L01读写寄存器函数
- //***************************************************************************************************/
- uchar SPI_RW_Reg(uchar reg, uchar value)
- {
- uchar status;
- CSN = 0; // CSN low, init SPI transaction
- status = SPI_RW(reg); // select register
- SPI_RW(value); // ..and write value to it..
- CSN = 1; // CSN high again
- return(status); // return nRF24L01 status uchar
- }
- //***************************************************************************************************/
- //函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
- //功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
- //***************************************************************************************************/
- uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar num)
- {
- uchar status,i;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // Select register to write to and read status uchar
- for(i=0;i<num;i++)
- pBuf[i] = SPI_RW(0); //
- CSN = 1;
- return(status); // return nRF24L01 status uchar
- }
- //********************************************************************************************************
- //函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
- //功能: 用于写数据 reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
- //********************************************************************************************************/
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar num)
- {
- uchar status,i;
- CSN = 0; //SPI使能
- status = SPI_RW(reg);
- for(i=0; i<num; i++) //
- SPI_RW(*pBuf++);
- CSN = 1; //关闭SPI
- return(status); //
- }
- //***************************************************************************************************/
- //函数:void SetRX_Mode(void)
- //功能:数据接收配置
- //***************************************************************************************************/
- void SetRX_Mode(void)
- {
- CE=0;
- SPI_RW_Reg(WRITE_REG+CONFIG,0x0d);
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
- CE = 1;
- delayms(1);
- }
- //*****************************************************************************************************/
- //函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
- //功能:数据读取后放如rx_buf接收缓冲区中
- /******************************************************************************************************/
- unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
- {
- unsigned char revale=0;
- sta=SPI_Read(STATUS); // 读取状态寄存器来判断数据接收状况
- if(RX_DR) // 判断是否接收到数据
- {
- CE = 0; //SPI使能
- //delayms(1);
- SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
- revale =1; //读取数据完成标志
- //inerDelay_us(150);
- SPI_RW_Reg(WRITE_REG+STATUS,sta|0x70); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清除中断标志
- CE = 1;
- CSN=0;
- SPI_RW(FLUSH_RX);//清空接收FIFO
- CSN=1;
- //inerDelay_us(20);
- }
- return revale;
- }
- void showStatus()
- {
- unsigned char tmp;
- unsigned char tmps[3];
- //***************************************NRF24L01寄存器指令*******************************************************
- //*************************************SPI(nRF24L01)寄存器地址****************************************************
- /*
- tmp = SPI_Read(CONFIG);
- Max232SendAChar("\nCONFIG:");
- bin2hex(tmp,tmps);// 配置收发状态,CRC校验模式以及收发状态响应方式
- tmps[3] = '\0';
- Max232SendAChar(tmps);
- */
- tmp = SPI_Read(STATUS);
- Max232SendAChar("\nSTATUS:");
- bin2hex(tmp,tmps);// 状态寄存器
- tmps[3] = '\0';
- Max232SendAChar(tmps);
- }
- void beep(unsigned char s){
- if (s)
- {
- BEEP = 1;
- } else {
- BEEP = 0;
- }
- }
- void Light(unsigned char s){
- if (s)
- LIGHT = 1;
- else
- LIGHT = 0;
- }
- void bin2hex(unsigned char ch,unsigned char* buf)
- {
- buf[1] = ch & 0x0f;
- buf[1] += 0x30;
- if (buf[1] > 0x39)
- {
- buf[1] += 7;
- }
- buf[0] = ch & 0xf0;
- buf[0] >>= 4;
- buf[0] += 0x30;
- if (buf[0] > 0x39)
- {
- buf[0] += 7;
- }
- }
- //************************************主函数************************************************************
- void main(void)
- {
- //unsigned char RX_P_NO;//接收通道号
- unsigned char i;
- //unsigned char tmp;
- unsigned char tmps[3];
- unsigned char _Str_Buf[10];
- unsigned char _RxBuf[10];
- unsigned char detected;
- unsigned char timeout[6];
- for (i=0;i<6;i++)
- {
- timeout[i] = 0x00;
- }
- LED = 0;
- sec = 0;
- delayms(100);
- int_init();
- Max232Int();
- init_NRF24L01();
- bufTop = 1;
- ES=1;
- EA=1;
- delayms(1000);
- Max232SendAChar("Start");
- SetRX_Mode();
- while(1)
- {
- if (sec > 15) //70s左右没收到指定通道信号超时
- {
- sec = 0;
- for (i=0;i<2;i++)
- {
- timeout[i]++;
- if (timeout[i] > 4) {
- _Str_Buf[0] = 'T';
- _Str_Buf[1] = ':';
- _Str_Buf[2] = 0x30+i;
- _Str_Buf[3] = 0x00;
- Max232SendAChar(_Str_Buf);
- timeout[i] = 0;
- }
- }
- }
- LED = 0;
- if(bufTop > 1)
- {
- EX0 = 0; //关接收中断,转移一组数据
- switch (bufTop)
- {
- case 0x2:
- for (i=0;i<8;i++)
- _RxBuf[i] = RxBuf[i];
- break;
- case 0x3:
- for (i=0;i<8;i++)
- _RxBuf[i] = RxBuf1[i];
- break;
- case 0x4:
- for (i=0;i<8;i++)
- _RxBuf[i] = RxBuf2[i];
- break;
- case 0x5:
- for (i=0;i<8;i++)
- _RxBuf[i] = RxBuf3[i];
- break;
- case 0x6:
- for (i=0;i<8;i++)
- _RxBuf[i] = RxBuf4[i];
- break;
- }
- bufTop--;
- EX0 = 1; //开接收中断
- _RxBuf[8] = 0x00;
- LED = 1;
- //RX_P_NO=sta&0x0e;
- detected = 0;
- switch(_RxBuf[0])
- {
- case 0x12:
- timeout[0] = 0x00;
- if (_RxBuf[1] == 'K')
- {
- _Str_Buf[0] = 'K';
- _Str_Buf[1] = '1';
- _Str_Buf[2] = ':';
- bin2hex(_RxBuf[2],tmps);
- _Str_Buf[3] = tmps[0];
- _Str_Buf[4] = tmps[1];
- _Str_Buf[5] = '\0';
- Max232SendAChar(_Str_Buf);
- } else if (_RxBuf[1] == 'S') {
- Max232SendAChar("S1 Start");
- } else if (_RxBuf[1] == 'W')
- {
- detected = 1;
- _Str_Buf[0] = 'W';
- _Str_Buf[1] = ':';
- bin2hex(_RxBuf[2],tmps);
- _Str_Buf[2] = tmps[0];
- _Str_Buf[3] = tmps[1];
- bin2hex(_RxBuf[3],tmps);
- _Str_Buf[4] = tmps[0];
- _Str_Buf[5] = tmps[1];
- _Str_Buf[6] = '\0';
- Max232SendAChar(_Str_Buf);
- }
- break;
- case 0xC2:
- timeout[1] = 0x00;
- if (_RxBuf[1] == 'K')
- {
- _Str_Buf[0] = 'K';
- _Str_Buf[1] = '2';
- _Str_Buf[2] = ':';
- bin2hex(_RxBuf[2],tmps);
- _Str_Buf[3] = tmps[0];
- _Str_Buf[4] = tmps[1];
- _Str_Buf[5] = '\0';
- Max232SendAChar(_Str_Buf);
- } else if (_RxBuf[1] == 'S') {
- Max232SendAChar("S2 Start");
- } else if (_RxBuf[1] == 'W')
- {
- detected = 1;
- _Str_Buf[0] = 'W';
- _Str_Buf[1] = ':';
- bin2hex(_RxBuf[2],tmps);
- _Str_Buf[2] = tmps[0];
- _Str_Buf[3] = tmps[1];
- bin2hex(_RxBuf[3],tmps);
- _Str_Buf[4] = tmps[0];
- _Str_Buf[5] = tmps[1];
- _Str_Buf[6] = '\0';
- Max232SendAChar(_Str_Buf);
- }
- break;
- case 0xC3:
- timeout[2] = 0x00;
- Max232SendAChar("Sender3");
- break;
- case 0xC4:
- timeout[3] = 0x00;
- Max232SendAChar("Sender4");
- break;
- case 0xC5:
- timeout[4] = 0x00;
- Max232SendAChar("Sender5");
- break;
- case 0xC6:
- if (BEEP)
- {
- beep(0);
- } else {
- beep(1);
- }
- _Str_Buf[0] = 'B';
- _Str_Buf[1] = '\0';
- break;
- default:
- if (_RxBuf[1] == 'K')
- {
- _Str_Buf[0] = 'K';
- _Str_Buf[1] = 'u';
- _Str_Buf[2] = ':';
- bin2hex(_RxBuf[2],tmps);
- _Str_Buf[3] = tmps[0];
- _Str_Buf[4] = tmps[1];
- _Str_Buf[5] = '\0';
- Max232SendAChar(_Str_Buf);
- } else if (_RxBuf[1] == 'S') {
- Max232SendAChar("Su Start");
- } else if (_RxBuf[1] == 'W')
- {
- detected = 1;
- _Str_Buf[0] = 'W';
- _Str_Buf[1] = ':';
- bin2hex(_RxBuf[2],tmps);
- _Str_Buf[2] = tmps[0];
- _Str_Buf[3] = tmps[1];
- bin2hex(_RxBuf[3],tmps);
- _Str_Buf[4] = tmps[0];
- _Str_Buf[5] = tmps[1];
- _Str_Buf[6] = '\0';
- Max232SendAChar(_Str_Buf);
- }
- break;
- }
-
- if (detected)
- {
- detected = '\0';
- beep(1);
- }
- } else {
- if (RevFlags) //串口接收的单字节命令
- {
- ES = 0; //关串口中断
- switch (RevFlags)
- {
- case 'B':
- beep(1);
- Max232SendAChar("BO");
- break;
- case 'P':
- beep(0);
- Max232SendAChar("PO");
- break;
- case 'S':
- if (BEEP)
- Max232SendAChar("B:ON");
- else
- Max232SendAChar("B:OFF");
- if (LIGHT)
- Max232SendAChar("L:ON");
- else
- Max232SendAChar("L:OFF");
- break;
- case 'L':
- if (LIGHT)
- Light(0);
- else
- Light(1);
- Max232SendAChar("LO");
- break;
- case 'D':
- showStatus();
- break;
- default:
- Max232SendAChar("NC");
- }
- RevFlags = '\0';
- ES = 1;
- }
- }
- }
- }
- //MAX232.c
- *********************************************************************/
- #include"reg52.h"
- extern unsigned char RevFlags;
- /*************************串口初始化函数**************/
- void Max232Int()
- {
- PCON=0x00; //SMOD=0
- TMOD |= 0x20; //设置T1为工作方式2
- TH1=0xfd; //9600
- TL1=0xfd;
- SM0=0;
- SM1=1;//方式1,8位
- //EA=1;
- ES=1;
- TR1=1;//定时器1允许
- REN=1;//允许接收
- }
- /*************************串口发送一个字节函数********************/
- void Max232SendChar(unsigned char Data)
- {
- ES=0;
- SBUF=Data;
- while(!TI);
- TI=0;
- ES=1;
- }
- /**********************发送一个字符串******************************/
- void Max232SendAChar(unsigned char *string)
- {
- ET0=0; //关闭T0定时器中断,防止干扰串口时序导致接收乱码
- TR0=0;
- while(*string!='\0')
- {
- Max232SendChar(*string);
- string++;
- }
- ET0=1;
- TR0=1;
- }
- /**********************串口中断接收函数****************************/
- void ExInt() interrupt 4
- {
- ES=0;
- if(RI)
- {
- RI=0;
- RevFlags=SBUF;
- }
- ES=1;
- }
interrupt.h - #ifndef _INTERRUPT_H_
- #define _INTERRUPT_H_
- void int_init();
- #endif
MAX232.h - #ifndef _MAX232_H_
- #define _MAX232_H_
- void Max232Int();
- void Max232SendChar(unsigned char Data);
- void Max232SendAChar(unsigned char *string);
- extern void MAX232SendData();
- #endif
每次传送数据长度是5字节,依次是一字节地址码,一字节类型码,后面三字节随意。 [ 此帖被大号在2014-06-27 19:59重新编辑 ]
|