我这有一段基于MSP430单片机和DS18B20的程序,但是我还想加入一个显示功能,用LCD1602显示。
可是我不知道怎么写这程序。用的是MSP430F4xx,下面是我的程序,我希望懂的人能加入数据显示的程序,用LCD1602显示。谢谢了。#include"common.h"...
可是我不知道怎么写这程序。用的是MSP430F4xx,下面是我的程序,我希望懂的人能加入数据显示的程序,用LCD1602显示。谢谢了。
#include "common.h"
#include "ds18b20.h"
// ROM Operation
#define CMD_READ_ROM 0x33
#define CMD_MATCH_ROM 0x55
#define CMD_SKIP_ROM 0xCC
#define CMD_SEARCH_ROM 0xF0
#define CMD_ALARM_SEARCH_ROM 0xEC
// RAM Operation
#define CMD_WRITE_RAM 0x4E
#define CMD_READ_RAM 0xBE
#define CMD_COPY_RAM 0x48
#define CMD_CONVERT_TEMP 0x44
#define CMD_EECALL_EEPROM 0xB8
#define CMD_READ_POWER_SUPPLY 0xB4
#define DQ_SET_1() P4OUT |= DS18B20_DQ
#define DQ_SET_0() P4OUT &= ~DS18B20_DQ
#define DQ_READ_BEGIN() P4DIR &= ~DS18B20_DQ
#define DQ_READ_END() P4DIR |= DS18B20_DQ
#define DQ_READ() (P4IN & DS18B20_DQ)
static unsigned char ds18b20_reset(void) {
unsigned char rc = 1;
DQ_SET_1(); // DQ 复位
delay_us(50);
DQ_SET_0(); // 拉低 DQ
delay_us(600); // 保持 480us
DQ_SET_1(); // 释放 DQ
delay_us(80); // 等待 60us
DQ_READ_BEGIN();
rc = DQ_READ(); // 0 == success, 1 == error
DQ_READ_END();
DQ_SET_1(); // 释放 DQ
delay_us(100);
return rc;
}
static unsigned char ds18b20_read_byte(void) {
unsigned char i = 0;
unsigned char dat = 0;
for (i = 0; i < 8; i++) {
DQ_SET_0();
delay_us(2);
DQ_SET_1();
delay_us(2);
DQ_READ_BEGIN();
dat >>= 1;
if (DQ_READ()) {
dat |= 0x80;
}
DQ_READ_END();
delay_us(60);
}
DQ_SET_1(); // 释放 DQ
return dat;
}
static void ds18b20_write_byte(unsigned char dat) {
unsigned char i = 0;
for (i = 0; i < 8; i++) {
DQ_SET_0();
delay_us(2);
if (dat & 0x01) {
DQ_SET_1();
} else {
DQ_SET_0();
}
dat >>= 1;
delay_us(60);
DQ_SET_1();
delay_us(2);
}
}
float ds18b20_read_temp(void) {
int temp = 0;
P4DIR |= DS18B20_DQ;
ds18b20_reset();
ds18b20_write_byte(CMD_SKIP_ROM); // 跳过读序号列号的操作
ds18b20_write_byte(CMD_CONVERT_TEMP); // 启动温度转换
ds18b20_reset();
ds18b20_write_byte(CMD_SKIP_ROM); // 跳过读序号列号的操作
ds18b20_write_byte(CMD_READ_RAM); // 读取温度寄存器
temp |= ds18b20_read_byte(); // 温度低8位
temp |= ds18b20_read_byte() << 8; // 温度高8位
return (temp * 0.0625f);
} 展开
#include "common.h"
#include "ds18b20.h"
// ROM Operation
#define CMD_READ_ROM 0x33
#define CMD_MATCH_ROM 0x55
#define CMD_SKIP_ROM 0xCC
#define CMD_SEARCH_ROM 0xF0
#define CMD_ALARM_SEARCH_ROM 0xEC
// RAM Operation
#define CMD_WRITE_RAM 0x4E
#define CMD_READ_RAM 0xBE
#define CMD_COPY_RAM 0x48
#define CMD_CONVERT_TEMP 0x44
#define CMD_EECALL_EEPROM 0xB8
#define CMD_READ_POWER_SUPPLY 0xB4
#define DQ_SET_1() P4OUT |= DS18B20_DQ
#define DQ_SET_0() P4OUT &= ~DS18B20_DQ
#define DQ_READ_BEGIN() P4DIR &= ~DS18B20_DQ
#define DQ_READ_END() P4DIR |= DS18B20_DQ
#define DQ_READ() (P4IN & DS18B20_DQ)
static unsigned char ds18b20_reset(void) {
unsigned char rc = 1;
DQ_SET_1(); // DQ 复位
delay_us(50);
DQ_SET_0(); // 拉低 DQ
delay_us(600); // 保持 480us
DQ_SET_1(); // 释放 DQ
delay_us(80); // 等待 60us
DQ_READ_BEGIN();
rc = DQ_READ(); // 0 == success, 1 == error
DQ_READ_END();
DQ_SET_1(); // 释放 DQ
delay_us(100);
return rc;
}
static unsigned char ds18b20_read_byte(void) {
unsigned char i = 0;
unsigned char dat = 0;
for (i = 0; i < 8; i++) {
DQ_SET_0();
delay_us(2);
DQ_SET_1();
delay_us(2);
DQ_READ_BEGIN();
dat >>= 1;
if (DQ_READ()) {
dat |= 0x80;
}
DQ_READ_END();
delay_us(60);
}
DQ_SET_1(); // 释放 DQ
return dat;
}
static void ds18b20_write_byte(unsigned char dat) {
unsigned char i = 0;
for (i = 0; i < 8; i++) {
DQ_SET_0();
delay_us(2);
if (dat & 0x01) {
DQ_SET_1();
} else {
DQ_SET_0();
}
dat >>= 1;
delay_us(60);
DQ_SET_1();
delay_us(2);
}
}
float ds18b20_read_temp(void) {
int temp = 0;
P4DIR |= DS18B20_DQ;
ds18b20_reset();
ds18b20_write_byte(CMD_SKIP_ROM); // 跳过读序号列号的操作
ds18b20_write_byte(CMD_CONVERT_TEMP); // 启动温度转换
ds18b20_reset();
ds18b20_write_byte(CMD_SKIP_ROM); // 跳过读序号列号的操作
ds18b20_write_byte(CMD_READ_RAM); // 读取温度寄存器
temp |= ds18b20_read_byte(); // 温度低8位
temp |= ds18b20_read_byte() << 8; // 温度高8位
return (temp * 0.0625f);
} 展开
3个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询