|
接收端:#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
#include <reg52.h>
#include <intrins.h>
sbit LCD_RS = P0^6;
sbit LCD_RW = P0^5;
sbit LCD_EN= P0^7;
#define LCD_DATA P2
#define MLX90614_ADDR 0x5A
#define TEMP_REG 0x07
sbit NRF_CE = P3^7;
sbit NRF_CSN = P3^2;
sbit NRF_SCK = P3^6;
sbit NRF_MOSI = P3^3;
sbit NRF_MISO = P3^5;
sbit IRQ = P3^4;
#define NRF_WRITE_REG(reg, value) nrf_write_register(reg, value)
#define NRF_READ_REG(reg) nrf_read_register(reg)
#define RF_CHANNEL 0x4C // 2.476GHz
#define DATA_RATE 0x07 // 1Mbps, 0dBm
#define PAYLOAD_LEN 0x20 // 32字節有效載荷
unsigned char RxBuf[20]; // 接收緩沖區
void delay_ms(unsigned int ms);
void SPI_Write(unsigned char dat) {
unsigned char i;
for(i=0; i<8; i++) {
NRF_MOSI = (dat & 0x80);
dat <<= 1;
NRF_SCK = 1;
_nop_();_nop_();
NRF_SCK = 0;
}
}
unsigned char SPI_Read() {
unsigned char i, dat=0;
for(i=0; i<8; i++) {
dat <<= 1;
NRF_SCK = 1;
_nop_();_nop_();
dat |= NRF_MISO;
NRF_SCK = 0;
}
return dat;
}
void NRF_WriteReg(unsigned char reg, unsigned char value) {
NRF_CSN = 0;
SPI_Write(reg | 0x20); // 寫命令
SPI_Write(value);
NRF_CSN = 1;
}
void NRF_WritePayload(unsigned char *dat, unsigned char len) {
unsigned char i;
NRF_CSN = 0;
SPI_Write(0xA0); // W_TX_PAYLOAD
for(i=0; i<len; i++)
SPI_Write(dat[i]);
NRF_CSN = 1;
}
void NRF_Init_RX() {
NRF_CE = 0;
NRF_CSN = 1;
NRF_WriteReg(0x00, 0x0F); // CONFIG: EN_CRC|PWR_UP|PRIM_RX
NRF_WriteReg(0x05, 0x4C); // 同發送端頻段
NRF_WriteReg(0x06, 0x07); // 同發送端設置
NRF_WriteReg(0x11, 0x20); // 接收緩沖區長度
NRF_CE = 1;
delay_ms(5);
}
unsigned char NRF_ReadPayload(unsigned char *dat) {
unsigned char i, status;
status = NRF_ReadReg(STATUS);
NRF_WriteReg(STATUS, status); // 清除所有中斷標志
NRF_CSN = 0;
SPI_Write(0x61); // R_RX_PAYLOAD
for(i=0; i<32; i++)
dat[i] = SPI_Read();
NRF_CSN = 1;
return status;
}
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<114; j++);
}
uchar exchange(unsigned char dat)
{
unsigned char i,j=0;
for(i=8;i>0;i--)
{
j|=(dat&0x01)<<(i-1);
dat>>=1;
}
return j;
}
void lcd_write_cmd(unsigned char cmd) {
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA =exchange(cmd);
LCD_EN = 1;
delay_ms(2);
LCD_EN = 0;
}
void lcd_write_data(unsigned char dat) {
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA =exchange(dat);
LCD_EN = 1;
delay_ms(2);
LCD_EN = 0;
}
void lcd_init() {
lcd_write_cmd(0x38);
delay_ms(5);
lcd_write_cmd(0x0C);
delay_ms(5);
lcd_write_cmd(0x06);
delay_ms(5);
lcd_write_cmd(0x01);
delay_ms(5);
}
void lcd_show_str(unsigned char x, unsigned char y, char *str) {
unsigned char addr;
if(y == 0) addr = 0x80 + x;
else addr = 0xC0 + x;
lcd_write_cmd(addr);
while(*str) {
lcd_write_data(*str++);
delay_ms(1);
}
}
void main() {
lcd_init();
NRF_Init_RX();
lcd_show_str(0, 0, "Waiting Data...");
while(1){
if(NRF_ReadPayload(RxBuf) ){
lcd_show_str(0, 0, "Received: ");
lcd_show_str(0, 1, RxBuf);
}
delay_ms(50);
}
}
發送端:
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
#include <reg52.h>
#include <intrins.h>
sbit LCD_RS = P0^6;
sbit LCD_RW = P0^5;
sbit LCD_EN= P0^7;
#define LCD_DATA P2
sbit SCL = P1^3;
sbit SDA = P1^2;
#define MLX90614_ADDR 0x5A
#define TEMP_REG 0x07
sbit NRF_CE = P3^7;
sbit NRF_CSN = P3^2;
sbit NRF_SCK = P3^6;
sbit NRF_MOSI = P3^3;
sbit NRF_MISO = P3^5;
sbit IRQ = P3^4;
#define NRF_WRITE_REG(reg, value) nrf_write_register(reg, value)
#define NRF_READ_REG(reg) nrf_read_register(reg)
#define MLX90614_ADDR 0x5A
#define TEMP_REG 0x07
// 全局變量
unsigned char TxBuf[20]; // 發送緩沖區
void delay_ms(unsigned int ms);
/******************** NRF24L01驅動函數 ********************/
void SPI_Write(unsigned char dat) {
unsigned char i;
for(i=0; i<8; i++) {
NRF_MOSI = (dat & 0x80);
dat <<= 1;
NRF_SCK = 1;
_nop_();_nop_();
NRF_SCK = 0;
}
}
unsigned char SPI_Read() {
unsigned char i, dat=0;
for(i=0; i<8; i++) {
dat <<= 1;
NRF_SCK = 1;
_nop_();_nop_();
dat |= NRF_MISO;
NRF_SCK = 0;
}
return dat;
}
void NRF_WriteReg(unsigned char reg, unsigned char value) {
NRF_CSN = 0;
SPI_Write(reg | 0x20); // 寫命令
SPI_Write(value);
NRF_CSN = 1;
}
void NRF_WritePayload(unsigned char *dat, unsigned char len) {
unsigned char i;
NRF_CSN = 0;
SPI_Write(0xA0); // W_TX_PAYLOAD
for(i=0; i<len; i++)
SPI_Write(dat[i]);
NRF_CSN = 1;
}
void NRF_Init_TX() {
NRF_CE = 0;
NRF_CSN = 1;
NRF_WriteReg(0x00, 0x0E); // CONFIG: EN_CRC|PWR_UP|PRIM_TX
NRF_WriteReg(0x05, 0x4C); // RF_CH: 頻段76 (2.476GHz)
NRF_WriteReg(0x06, 0x07); // RF_SETUP: 1Mbps, 0dBm
NRF_WriteReg(0x11, 0x20); // RX_PW_P0: 32字節
NRF_WriteReg(0x10, 0x20); // TX_ADDR設置
NRF_CE = 1;
delay_ms(5);
}
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<114; j++);
}
void i2c_delay() {
_nop_();_nop_();_nop_();_nop_();
}
void i2c_start() {
SDA = 1;
SCL = 1;
i2c_delay();
SDA = 0;
i2c_delay();
SCL = 0;
}
void i2c_stop() {
SDA = 0;
SCL = 1;
i2c_delay();
SDA = 1;
i2c_delay();
}
bit i2c_write(unsigned char dat) {
unsigned char i;
bit ack;
for(i=0; i<8; i++) {
SDA = (dat & 0x80) ? 1 : 0;
dat <<= 1;
SCL = 1;
i2c_delay();
SCL = 0;
}
SDA = 1;
SCL = 1;
i2c_delay();
ack = SDA;
SCL = 0;
return ack;
}
unsigned char i2c_read(bit ack) {
unsigned char i, dat = 0;
SDA = 1;
for(i=0; i<8; i++) {
SCL = 1;
i2c_delay();
dat <<= 1;
dat |= SDA;
SCL = 0;
i2c_delay();
}
SDA = ack ? 0 : 1;
SCL = 1;
i2c_delay();
SCL = 0;
SDA = 1;
return dat;
}
float read_temp() {
unsigned char tempL, tempH;
unsigned int tempData;
float temperature;
i2c_start();
i2c_write(MLX90614_ADDR << 1);
i2c_write(TEMP_REG);
i2c_start();
i2c_write((MLX90614_ADDR << 1) | 0x01);
tempL = i2c_read(1);
tempH = i2c_read(0);
i2c_stop();
tempData = (tempH << 8) | tempL;
temperature = tempData * 0.02 - 273.15;
return temperature;
}
uchar exchange(unsigned char dat)
{
unsigned char i,j=0;
for(i=8;i>0;i--)
{
j|=(dat&0x01)<<(i-1);
dat>>=1;
}
return j;
}
void lcd_write_cmd(unsigned char cmd) {
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA =exchange(cmd);
LCD_EN = 1;
delay_ms(2);
LCD_EN = 0;
}
void lcd_write_data(unsigned char dat) {
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA =exchange(dat);
LCD_EN = 1;
delay_ms(2);
LCD_EN = 0;
}
void lcd_init() {
lcd_write_cmd(0x38);
delay_ms(5);
lcd_write_cmd(0x0C);
delay_ms(5);
lcd_write_cmd(0x06);
delay_ms(5);
lcd_write_cmd(0x01);
delay_ms(5);
}
void lcd_show_str(unsigned char x, unsigned char y, char *str) {
unsigned char addr;
if(y == 0) addr = 0x80 + x;
else addr = 0xC0 + x;
lcd_write_cmd(addr);
while(*str) {
lcd_write_data(*str++);
delay_ms(1);
}
}
void main() {
float temp;
lcd_init();
NRF_Init_TX();
while(1) {
temp = read_temp();
sprintf(TxBuf, "T:%.2fC", temp);
// 無線發送
NRF_CE = 0;
NRF_WritePayload(TxBuf, sizeof(TxBuf));
NRF_CE = 1;
delay_ms(10);
// LCD顯示發送狀態
lcd_show_str(0, 0, "Sending:");
lcd_show_str(0, 1, TxBuf);
delay_ms(1000);
}
}
|
|