1、sbit IRQ=P16; /中断uchar bdata sta;sbit RX_DR =sta6; /接收数据准备就绪sbit TX_DS =sta5; /已发送数据sbit MAX_RT =sta4;sbit DQ=P33;unsigned char time; /设置全局变量,专门用于严格延时/*NRF24L01*/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 /
2、写待发数据指令#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 / 收发地址宽度设置#defin
3、e 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
4、 / 频道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
5、_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void init_io(void) CE=0; CSN=1; SCK=0;void delay_ms(unsigned int x) unsigned int i,j; for(i=0;ix;i+) j=108; while(j-); uchar SPI_RW(uchar byte)/发送指令,接受状态 ,返回值为状态值 uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) MOSI = (byte&0x80); byt
6、e = (byte1); SCK = 1; byte|=MISO; SCK=0; return(byte);uchar SPI_RW_Reg(uchar reg, uchar value) uchar status; CSN = 0; status = SPI_RW(reg); SPI_RW(value); CSN = 1; return(status);uchar SPI_Read(uchar reg) uchar reg_val; SPI_RW(reg); /写指令 reg_val = SPI_RW(0); /读reg的内容 return(reg_val);uchar SPI_Read_B
7、uf(uchar reg, uchar *pBuf, uchar bytes) uchar status,byte_ctr; for(byte_ctr=0;byte_ctrbytes;byte_ctr+) pBufbyte_ctr = SPI_RW(0);uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) byte_ctr byte_ctr+) SPI_RW(*pBuf+);void TX_Mode(void) SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS/*接收模块的地址*/, TX_
8、ADR_WIDTH/*地址宽度5*/); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0/*通道0 接收数据地址*/, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WR_TX_PLOAD,/*写待发数据指令a0*/ tx_buf, TX_PLOAD_WIDTH/*20*/); SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); /数据通道0应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); /接收数据通道0允许 SPI_RW_Reg(WRITE_REG + SETUP_
9、RETR, 0x1a);/等待 500+86us 自动重发10次 SPI_RW_Reg(WRITE_REG + RF_CH,40); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /数据传输率1Mbps ,发射功率0dBm SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); /配置寄存器 CE=1;void checkflag() sta=SPI_Read(STATUS);/读状态寄存器 / if(RX_DR) / / SPI_Read_Buf(RD_RX_PLOAD/*读取接收数据指令*/,rx_buf/*数组20*/,TX_PLOA
10、D_WIDTH/*20*/); / flag=1; / if(MAX_RT) SPI_RW_Reg(FLUSH_TX/*冲洗发送FIFO指令*/,0); SPI_RW_Reg(WRITE_REG+STATUS,sta);/清除中断/以下是DS18B20的操作程序 /*/ void delay1ms() unsigned char i,j;4; for(j=0;j33;j+) ;/*函数功能:延时若干毫秒入口参数:n*/ void delaynms(unsigned char n) unsigned char i;n; delay1ms();将DS18B20传感器初始化,读取应答信号出口参数:f
11、lag bit Init_DS18B20(void) bit flag; /储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; /先将数据线拉高 for(time=0;time=1; if(DQ=1) dat|=0x80; /如果读到的数据是1,则将1存入dat else dat|=0x00;/如果读到的数据是0,则将0存入dat /将单片机检测到的电平信号DQ存入ri ; /延时3us,两个读时序之间必须有大于1us的恢复期 return(dat); /返回读出的十六进制数据向DS18B20写入一个字节数据WriteOneChar(unsign
12、ed char dat) unsigned char i=0; for (i=0; i /将dat中的各二进制位数据右移1位 /稍作延时,给硬件一点反应时间做好读温度的准备void ReadyReadTemp(void) Init_DS18B20(); /将DS18B20初始化 WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换 delaynms(150); /转换一次需要延时一段时间 Init_DS18B20(); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器,前两个分别是温度的低位和
13、高位 void dwend(void) uchar TL; /储存暂存器的温度低位 uchar TH; /储存暂存器的温度高位 TL=ReadOneChar(); /先读的是温度值低位 TH=ReadOneChar(); /接着读的是温度值高位 distance_data0=TH ; /测量结果的高8位 distance_data1=TL; /放入16位的高8位void main(void) uchar xx; init_io(); while(1) ReadyReadTemp() ; dwend();checkflag(); for(xx=0;xxxx+) tx_bufxx= distanc
14、e_dataxx;/发数据之前必须把要发送的数据装入它 TX_Mode(); /必须启动发送模块 delay_ms(5);接收端程序:uchar code digit11=0123456789-; /定义字符数组显示数字uchar code Str=RICHMCU DS18B20 /说明显示的是温度/unsigned char code Error= DS18B20 ERROR /说明没有检测到DS18B20/unsigned char code Error1= PLEASE CHECKuchar code Temp=WENDU:uchar code Cent=Cent /温度单位uchar tm2;uchar flg=0; /负温度标志 和临时暂存变量uchar tltemp;#define TX_ADR_WIDTH 5 #define TX_PLOAD_WIDTH 2 int cout;sbit RS=P20; /寄存器选择位,将RS位定义为P2.0引脚sbit RW=P21; /读写选择位,将RW位定义为P2.1引脚sbit E=P22; /使能信号位,将E位定义为P2.2引脚sbit BF=P07; /忙碌标志位,将BF位定义为P0.7引脚#define RX_PW_P1 0x
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1