|
代碼仿真沒有問題
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
// NRF24L01 引腳定義
sbit CE = P3^7;
sbit CSN = P3^2;
sbit SCK = P3^6;
sbit MOSI = P3^3;
sbit MISO = P3^5;
sbit IRQ = P3^4;
// MLX90614 引腳定義
sbit SCL = P1^3;
sbit SDA = P1^2;
// LCD1602 引腳定義
sbit RS = P0^6;
sbit RW = P0^5;
sbit E = P0^7;
#define DataPort P2;
// 延時函數(shù)
void delay_ms(unsigned int ms) {
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<=168;j++);
}
// NRF24L01 寫寄存器
void NRF24L01_Write_Reg(unsigned char reg, unsigned char value) {
unsigned char i;
CSN = 0;
SCK = 0;
// 發(fā)送寄存器地址
for (i = 0; i < 8; i++) {
MOSI = (reg & 0x80) >> 7;
SCK = 1;
SCK = 0;
reg <<= 1;
}
// 發(fā)送數(shù)據(jù)
for (i = 0; i < 8; i++) {
MOSI = (value & 0x80) >> 7;
SCK = 1;
SCK = 0;
value <<= 1;
}
CSN = 1;
}
// NRF24L01 初始化
void NRF24L01_Init() {
CE = 0;
CSN = 1;
SCK = 0;
// 配置相關(guān)寄存器,如工作模式等
NRF24L01_Write_Reg(0x00, 0x0E);
NRF24L01_Write_Reg(0x01, 0x03);
NRF24L01_Write_Reg(0x02, 0x01);
NRF24L01_Write_Reg(0x03, 0x00);
NRF24L01_Write_Reg(0x04, 0x00);
NRF24L01_Write_Reg(0x05, 0x02);
NRF24L01_Write_Reg(0x06, 0x07);
NRF24L01_Write_Reg(0x07, 0x70);
NRF24L01_Write_Reg(0x0A, 0x34);
NRF24L01_Write_Reg(0x0B, 0x43);
NRF24L01_Write_Reg(0x10, 0x34);
NRF24L01_Write_Reg(0x11, 0x02);
}
// I2C 起始信號
void I2C_Start() {
SDA = 1;
SCL = 1;
_nop_();
SDA = 0;
_nop_();
SCL = 0;
}
// I2C 停止信號
void I2C_Stop() {
SDA = 0;
SCL = 1;
_nop_();
SDA = 1;
_nop_();
}
// I2C 發(fā)送一個字節(jié)
void I2C_SendByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
SDA = (dat & 0x80) >> 7;
SCL = 1;
_nop_();
SCL = 0;
dat <<= 1;
}
// 等待應(yīng)答
SDA = 1;
SCL = 1;
_nop_();
SCL = 0;
}
// I2C 接收一個字節(jié)
unsigned char I2C_ReceiveByte() {
unsigned char i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++) {
SCL = 1;
dat <<= 1;
dat |= SDA;
SCL = 0;
}
return dat;
}
// MLX90614 讀取溫度
float MLX90614_Read_Temp() {
unsigned int temp;
float temperature;
I2C_Start();
I2C_SendByte(0xB4);
I2C_SendByte(0x07);
I2C_Start();
I2C_SendByte(0xB5);
temp = I2C_ReceiveByte();
temp |= (I2C_ReceiveByte() << 8);
I2C_Stop();
temperature = (float)temp * 0.02 - 273.15;
return temperature;
}
// NRF24L01 發(fā)送數(shù)據(jù)
void NRF24L01_Send_Data(unsigned char *dat, unsigned char len) {
unsigned char j;
unsigned char i;
CE = 0;
NRF24L01_Write_Reg(0x07, 0x7E);
CSN = 0;
// 發(fā)送命令
for (i = 0; i < 8; i++) {
MOSI = 0xA0 >> (7 - i);
SCK = 1;
SCK = 0;
}
// 發(fā)送數(shù)據(jù)
for (i = 0; i < len; i++) {
for (j = 0; j < 8; j++) {
MOSI = (dat[i] & 0x80) >> 7;
SCK = 1;
SCK = 0;
dat[i] <<= 1;
}
}
CSN = 1;
CE = 1;
delay_ms(1);
CE = 0;
}
// LCD1602 寫命令
void LCD1602_Write_Cmd(unsigned char cmd) {
RS = 0;
RW = 0;
P2 = cmd;
delay_ms(200);
E = 1;
delay_ms(5);
E = 0;
delay_ms(5);
}
// LCD1602 初始化
void LCD1602_Init() {
LCD1602_Write_Cmd(0x38);
delay_ms(25);
LCD1602_Write_Cmd(0x38);
delay_ms(25);
LCD1602_Write_Cmd(0x38);
delay_ms(25);
LCD1602_Write_Cmd(0x38);
LCD1602_Write_Cmd(0x08);
LCD1602_Write_Cmd(0x06);
LCD1602_Write_Cmd(0x01);
LCD1602_Write_Cmd(0x0C);
delay_ms(200);
}
// LCD1602 寫數(shù)據(jù)
void LCD1602_Write_Data(unsigned char dat) {
RS = 1;
RW = 0;
delay_ms(200);
P2 = dat;
E = 1;
delay_ms(5);
E = 0;
delay_ms(5);
}
// LCD1602 顯示字符串
void LCD1602_Display_String(unsigned char x, unsigned char y, unsigned char *str) {
unsigned char addr;
if (y == 0)
addr = 0x80 + x;
else
addr = 0xC0 + x;
LCD1602_Write_Cmd(addr);
while (*str != '\0') {
LCD1602_Write_Data(*str);
str++;
}
}
// LCD1602 顯示數(shù)字
void LCD1602_Display_Number(unsigned char x, unsigned char y, float num) {
unsigned char str[10];
sprintf(str, "wendu:%.2f", num);
LCD1602_Display_String(x, y, str);
}
void main() {
float temperature;
unsigned char dat[2];
NRF24L01_Init(); //調(diào)用函數(shù)初始化NRF24L01
LCD1602_Init(); //調(diào)用函數(shù)初始化LCD1602
while (1) {
temperature = MLX90614_Read_Temp(); //同個函數(shù)讀取MLX90614的溫度值并存入變量中
dat[0] = (unsigned int)(temperature * 100) >> 8;
dat[1] = (unsigned int)(temperature * 100);
NRF24L01_Send_Data(dat, 2);
LCD1602_Display_Number(0, 0, temperature);
delay_ms(1000);
}
}
|
|