软件设计(1)从机软件
① 流程图
② 源程序
/**************************************************************
无线领域的总结,1、注意微机之间的通信,2、选择接受通道,3、设置工作通道频率
4、接收通道选择和发送通道相同有效数据宽度 5、发射速率、功耗功能设置
6、CRC 使能,16 位 CRC 校验,上电,模式选择
***************************************************************/
#include <reg52.h>
#include<intrins.h>//函数定义_nop_()的头文件
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="0123456789";// 定义字符数组显示数字
uchar code Str[]={"test by ds18b20"};//温度显示字符说明
开始
显示、发送温度
是否接受到
指令?
降温 加热正常工作
Y
N
uchar code Error1[]={"Error!check! "};//没有检测到 DS18B20
uchar code Error2[]={" "};//检测不到 18B20 时清除第二行
uchar code table1[]={"temp:"};
//声明液晶
sbit lcdrs=P2^5;
sbit lcdrw=P2^6;
sbit lcden=P2^7;
sbit BF=P0^7; //忙碌标志位
sbit ds=P1^7; //DS18B20
sbit led=P1^0;
sbit relay=P2^0;//继电器
sbit dianji=P2^1;//电机声明
//NRF24L01 声明
/***************************************************/
#define TX_ADR_WIDTH 5 // 5 字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 20 // 数据通道有效数据宽度
unsigned char tf =0;
unsigned char TxBuf[20]={0}; //
unsigned char RxBuf[20]={0};
sbit CE = P1^6; //芯片的模式控制线,在 CSN 为低时,CE 与 CONFIG 寄存器共同决
定状态 Chip Enable pin signal (output)
sbit CSN = P1^1; //芯片的片选线,CSN 为低电平芯片工作 Slave Select pin, (output
to CSN, nRF24L01)
sbit SCK = P1^5; //芯片控制的时钟线(SPI 时钟) Master Out, Slave In pin (output)
sbit MOSI = P1^2; //芯片控制数据线,串行输入 Serial Clock pin, (output)
sbit MISO = P1^4; //芯片控制数据线,串行输出 Master In, Slave Out pin (input)
sbit IRQ = P1^3; // 采用中断写时必须接到 P32 或 P33 上 Interrupt signal, from
nRF24L01 (input)
// SPI(nRF24L01) commands
#define READ_REG 0x00 //读寄存器指令 Define read command to register
#define WRITE_REG 0x20 //写寄存器指令 Define write command to register
#define RD_RX_PLOAD 0x61 //读取接收数据指令 Define RX payload register address
#define WR_TX_PLOAD 0xA0 //写待发数据指令 Define TX payload register address
#define FLUSH_TX 0xE1 //冲洗发送 TX FIFO 指令 Define flush TX register command
#define FLUSH_RX 0xE2 //冲洗接收 FIFO 指令 Define flush RX register command
#define REUSE_TX_PL 0xE3 //定义重复装载数据指令 Define reuse TX payload
register command
//重新使用上一包发射的有效数据,当 CE=1 时,数据不
断的重新发射
#define NOP 0xFF // 空 操 作 , 可 以 用 来 读 状 态 寄 存 器 Define No
Operation, might be used to read status register
// SPI(nRF24L01) registers(addresses)
#define CONFIG 0x00 //配置收发状态,CRC 校验模式以及收发状态响应方式
'Config' register address
#define EN_AA 0x01 //自动应答功能设置 'Enable Auto Acknowledgment'
register address
#define EN_RXADDR 0x02 //可用信道设置 'Enabled RX addresses' register address
#define SETUP_AW 0x03 //收发地址宽度设置 'Setup address width' register
address
#define SETUP_RETR 0x04 //自动重发功能设置 'Setup Auto. Retrans' register
address
#define RF_CH 0x05 //工作频率设置 'RF channel' register address
#define RF_SETUP 0x06 // 发射速率、功耗功能设置'RF setup' register address
#define STATUS 0x07 //状态寄存器 'Status' register address
#define OBSERVE_TX 0x08 //发送监测功能 'Observe TX' register address
#define CD 0x09 //地址检测 'Carrier Detect' register address
#define RX_ADDR_P0 0x0A //频道 0 接收数据地址,最大长度为五字节 'RX address
pipe0' register address
#define RX_ADDR_P1 0x0B // 'RX address pipe1' register address
#define RX_ADDR_P2 0x0C // 'RX address pipe2' register address
#define RX_ADDR_P3 0x0D // 'RX address pipe3' register address
#define RX_ADDR_P4 0x0E // 'RX address pipe4' register address
#define RX_ADDR_P5 0x0F //频道 5 接收数据地址 'RX address pipe5' register
address
#define TX_ADDR 0x10 //发送地址寄存器 'TX address' register address
#define RX_PW_P0 0x11 //接收频道 0 接收数据长度,有效数据长度 1~32 'RX
payload width, pipe0' register address
#define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address
#define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address
#define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address
#define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address
#define RX_PW_P5 0x16 // 接收频道 5 接收数据长度 'RX payload width, pipe5'
register address
#define FIFO_STATUS 0x17 //FIFO 栈入栈出状态寄存器设置 'FIFO Status Register'
register address
uchar code TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//定义一个静
态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar flag=0;
uchar bdata sta;
sbit RX_DR = sta^6;//接收数据中断,当收到有效数据后置 1,写 1 清除中断
sbit TX_DS = sta^5;//数据发送完成中断,写 1 清除中断
sbit MAX_RT = sta^4;//重发次数溢出中断,写 1 清除中断,如果 MAX_RT 产生中断,
必须清楚后系统才能进行通
/*********延时******************************/
void delayus(uint n)
{while(n--);}
void delay(uint z) // 延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/**************************************************************
液晶函数
***************************************************************/
bit BusyTest()//判读液晶的忙碌状态
{
bit result;
lcdrs=0;
lcdrw=1;//才可以读状态
lcden=1;//才允许读写
_nop_();
_nop_();
_nop_();
_nop_();
result=BF;//为 1 忙碌,为 0 不忙
lcden=0;
return result;
}
void write_com(uchar com) // 独立函数