Vấn đề với sht11 và pic 18f8720

A

amitumi1003

Guest
Prob là nó alwayes hiển thị cùng một giá trị ngay cả khi tôi thay đổi dữ liệu hoặc mã sck không.
kết quả là alwayes 37,22 4,25 64,13 0,1.

pls giúp tôi .........

ở đây là mã

Mã số:# Include <18F8720.h>

# Bao gồm <math.h>

# Bao gồm <stdlib.h>typedef công đoàn

(

unsigned int i;

float f;

) Giá trị;# PORT_G byte = 0x00FD

# PORT_f byte = 0x0000

# Byte PORT_c = 0x00BF

# PORT_D byte = 0x0000

# PORT_E byte = 0x0002

# Fuses HS, NOLVP, NOWDT, NOPROTECT

# Sử dụng chậm (đồng hồ = 20.000.000)

# Sử dụng RS232 (baud = 9.600, rcv = PIN_G2, xmit = PIN_G1, STREAM = COMM_B)enum (TEMP, HUMI);

# Define PIN_F2 sht11_data

# Define sht11_sck PIN_F3

# Define sht_noACK 0

# Define sht_ACK 1/ / ADR lệnh r / w

# Define 0x06 sht_STATUS_REG_W / / 000 0.011 0

# Define sht_STATUS_REG_R 0x07 / / 000 0.011 1

# Define sht_MEASURE_TEMP 0x03 / / 000 0.001 1

# Define sht_MEASURE_HUMI 0x05 / / 000 0.010 1

# Define sht_RESET 0x1e / / 000 1111 0

/************************************************* *******************************/

/************************************************* *******************************// / Gửi dữ liệu tính đến pc/************************************************* *******************************/

/************************************************* *******************************/void sendDataToPC (dữ liệu * char, int len)

(

int i;

output_high (PIN_G0);

delay_ms (10); / / chờ đợicho (i = 0; i <len; i )

(

fprintf (COMM_B, "% c", dữ liệu *); / / ghi trong tập tin

dữ liệu ;

)

delay_ms (10); / / chờ đợi

output_low (PIN_G0);

delay_ms (10);

)checkLength int (int giá trị)

(

int len = 0;

trong khi (có giá trị! = 0)

(

giá trị = value/10;

len ;

)

trở lại len;

)void floatToInt (gấp đôi giá trị)

(

, Int một rem, len = 0, cho vay;

char arr [5];

char * dữ liệu, nhiệt độ;

double d = 100,0;

a = abs (giá trị);

len = checkLength (a);

cho vay = len;

trong khi (a = 0)!

(

rem = 10%;

arr [len-1] = rem 48;

a = a/10;

len -;

)

dữ liệu = arr;

sendDataToPC (dữ liệu, cho vay);temp ='.';

sendDataToPC (& temp, 1);a = abs (giá trị);

giá trị = giá trị-a;

giá trị = giá trị * d;

a = abs (giá trị) 1;

len = checkLength (a);

cho vay = len;

trong khi (a = 0)!

(

rem = 10%;

arr [len-1] = rem 48;

a = a/10;

len -;

)

dữ liệu = arr;

sendDataToPC (dữ liệu, cho vay);

temp = '';

sendDataToPC (& temp, 2);

)

/************************************************* ******************************/

/************************************************* ******************************// / Ghi một byte trên Sensibus và kiểm tra xác nhận/************************************************* ******************************/

/************************************************* ******************************/

char sht11_write_byte (unsigned char giá trị)

(

unsigned char i, lỗi = 0;

cho (i = 0x80; i> 0; i / = 2) / bit ca / cho mặt nạ

(

if (i & giá trị)

output_high (sht11_data); / / mặt nạ giá trị với tôi, viết thư cho SENSI-BUS

khác

output_low (sht11_data);output_high (sht11_sck); / / CLK cho SENSI-BUS

delay_us (5); / / pulswith approx.
5 chúng tôi

output_low (sht11_sck);

)

output_high (sht11_data); / / phát hành dữ liệu trực tuyến

output_high (sht11_sck); / / CLK # 9 cho ack

lỗi = đầu vào (sht11_data); / / kiểm tra ack (DATA sẽ được kéo xuống bởi SHT11)

output_low (sht11_sck);

trả lại lỗi; / / lỗi = 1 trong trường hợp không có xác nhận

)
/************************************************* *******************************/

/************************************************* *******************************// / Đọc một hình thức byte Sensibus và đưa ra một nhận trong trường hợp "ack = 1"/************************************************* *******************************/

/************************************************* *******************************/

char sht11_read_byte (unsigned char ack)

(

unsigned char i, val = 0;

output_high (sht11_data); / / phát hành dữ liệu trực tuyến

cho (i = 0x80; i> 0; i / = 2) / bit ca / cho mặt nạ

(

output_high (sht11_sck); / / CLK cho SENSI-BUS

if (input (sht11_data) == 1)

val = (val | i); / / đọc bit

output_low (sht11_sck);

)

output_bit (sht11_data, ack); / / trong trường hợp "ack == 1" kéo xuống DATA-Line

output_high (sht11_sck); / / CLK # 9 cho ack

delay_us (5); / / pulswith approx.
5 chúng tôi

output_low (sht11_sck);

output_high (sht11_data); / / phát hành dữ liệu trực tuyến

trở lại val;

)
/************************************************* *******************************/

/************************************************* *******************************// / Tạo ra một sự khởi đầu truyền

/ / _____ ________

/ / DATA: |_______|

/ / ___ ___

/ / SCK: ___ | |___| |______/************************************************* *******************************/

/************************************************* *******************************/

sht11_transstart void (void)

(

output_high (sht11_data);

output_low (sht11_sck); / / ban đầu nhà nước

delay_us (1);

output_high (sht11_sck);

delay_us (1);

output_low (sht11_data);

delay_us (1);

output_low (sht11_sck);

delay_us (3);

output_high (sht11_sck);

delay_us (1);

output_high (sht11_data);

delay_us (1);

output_low (sht11_sck);

)

/************************************************* *******************************/

/************************************************* *******************************// / Thiết lập lại giao tiếp: DATA line-= 1 và ít nhất 9 chu kỳ SCK

/ / Theo sau transstart

/ / _____________________________________________________ ________

/ / DATA: |_______|

/ / _ _ _ _ _ _ _ _ _ ___ ___

/ / SCK: __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | |______| |___| |______/************************************************* *******************************/

/************************************************* *******************************/sht11_connectionreset void (void)

(

unsigned char i;

output_high (sht11_data);

output_low (sht11_sck); / / ban đầu nhà nước

cho (i = 0; i <9; i ) / / 9 SCK chu kỳ

(

output_high (sht11_sck);

output_low (sht11_sck);

)

sht11_transstart (); / / truyền tải bắt đầu

)

/************************************************* *******************************/

/************************************************* *******************************// / Reset các cảm biến của một softreset/************************************************* *******************************/

/************************************************* *******************************/

char sht11_softreset (void)

(

unsigned char lỗi = 0;

sht11_connectionreset (); / / thiết lập lại truyền thông

lỗi = sht11_write_byte (sht_RESET); / / gửi RESET-lệnh để cảm biến

trả lại lỗi; / / lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến

)/************************************************* *******************************/

/************************************************* *******************************// / Đọc đăng ký hộ với tổng kiểm tra (8-bit)/************************************************* *******************************/

/************************************************* *******************************/

sht11_read_statusreg char ()

(

unsigned char lỗi = 0;

unsigned char p_value, p_checksum;

sht11_transstart (); / / truyền tải bắt đầu

lỗi = sht11_write_byte (sht_STATUS_REG_R); / / gửi lệnh để cảm biến

p_value = sht11_read_byte (sht_ACK); / / đọc đăng ký hộ (8-bit)

p_checksum = sht11_read_byte (sht_noACK); / / đọc checksum (8-bit)

trả lại lỗi; / / lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến

)

/************************************************* *******************************/

/************************************************* *******************************// / Ghi trong sổ đăng ký tư cách với checksum (8-bit)/************************************************* *******************************/

/************************************************* *******************************/char sht11_write_statusreg (unsigned char * p_value)

(

unsigned char lỗi = 0;

sht11_transstart (); / / truyền tải bắt đầu

lỗi = sht11_write_byte (sht_STATUS_REG_W); / / gửi lệnh để cảm biến

lỗi = sht11_write_byte p_value * (); / / gửi giá trị của tình trạng đăng ký

trả lại lỗi; / /> lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến

)/************************************************* *******************************/

/************************************************* *******************************// / Tạo ra một đo lường (độ ẩm / nhiệt độ) với checksum/************************************************* *******************************/

/************************************************* *******************************/

char sht11_measure (p_value * unsigned char, unsigned char * p_checksum, unsigned char chế độ)

(

unsigned lỗi = 0;

unsigned int i;

sht11_transstart (); / / truyền tải bắt đầu

chuyển đổi (chế độ)

(/ / Gửi lệnh để cảm biến

TEMP trường hợp: lỗi = sht11_write_byte (sht_MEASURE_TEMP); break;

HUMI trường hợp: lỗi = sht11_write_byte (sht_MEASURE_HUMI); break;

mặc định: break;

)cho (i = 0; i <65.535; i )

if (input (sht11_data) == 0)

break; / / đợi cho đến khi cảm biến đã hoàn thành đo lường

if (input (sht11_data) == 1)

Lỗi = 1; / / hoặc thời gian chờ (~ 2 sec.) Là đạt* (P_value 1) = sht11_read_byte (sht_ACK); / / đọc các byte đầu tiên (MSB)

* (P_value) = sht11_read_byte (sht_ACK); / / đọc các byte thứ hai (LSB)

* P_checksum = sht11_read_byte (sht_noACK); / / đọc checksum

trả lại lỗi;

)

char sht11_measure_temp (p_value * unsigned char, unsigned char * p_checksum)

(

sht11_measure trở lại (p_value, p_checksum, TEMP);

)char sht11_measure_humi (unsigned char * p_value, unsigned char * p_checksum)

(

sht11_measure trở lại (p_value, p_checksum, HUMI);

)
/************************************************* *******************************/

/************************************************* *******************************// / Tính toán nhiệt độ [° C] và% [độ ẩm RH]

/ / Nhập vào: humi [Bọ ve] (12 bit)

/ / Temp [Bọ ve] (14 bit)

/ / Đầu ra: humi [% RH]

/ / Temp [° C]/************************************************* *******************************/

/************************************************* *******************************/

void sth11_calc (float p_humidity *, float * p_temperature)

(

const float C1 =- 4,0; / / cho 12 Bit

const float C2 = 0,0405; / / cho 12 Bit

const float C3 =- 0,0000028; / / cho 12 Bit

const float T1 = 0,01; / / cho 14 Bit @ 5V

const float T2 = 0,00008; / / cho 14 Bit @ 5Vfloat rh, t, rh_lin, rh_true, t_C;

/ / Rh_lin: Độ ẩm tuyến tính

/ / Rh_true: Nhiệt độ bồi thường độ ẩm

/ / T_C: Nhiệt độ [° C]

rh =* p_humidity; / / rh: Độ ẩm [Bọ ve] 12 Bit

t =* p_temperature; / / t: Nhiệt độ [Bọ ve] 14 Bitt_C = t * 0,01-40; / / calc.
nhiệt độ từ bọ ve để [° C]

rh_lin = C3 * * rh rh C2 * rh C1; / / calc.
độ ẩm từ bọ ve để [% RH]

rh_true = (t_C-25) * (T1 T2 * rh) rh_lin; / / calc.
độ ẩm nhiệt độ bồi thường [% RH]if (rh_true> 100)

rh_true = 100; / / cắt giảm nếu giá trị là bên ngoài

if (rh_true <0,1)

rh_true = 0,1; / / các vật chất có thể có nhiều* P_temperature = t_C; / / quay trở lại nhiệt độ [° C]

* P_humidity = rh_true; / / trả lại độ ẩm [% RH]

)
/************************************************* *******************************/

/************************************************* *******************************// / Calcul de l'humidite en Entier (sans calcul float)/************************************************* *******************************/

/************************************************* *******************************/

int sht11_calc_humid_int (int16 w_humidity)

(

int32 h1, h2;h1 = ((int32) w_humidity) * ((int32) w_humidity);

h1 = h1 / (int32) năm 1000;

h1 = h1 * (int32) 28;

h2 = ((int32) w_humidity) * (int32) 405;

h2 = h2 - h1;

h2 = h2 / (int32) năm 1000;

h2 = h2 - (int32) 40;

h2 = h2 / (int32) 10;

trở lại (h2);

)/************************************************* *******************************/

/************************************************* *******************************// / Tính toán điểm sương

/ / Nhập vào: độ ẩm [% RH], nhiệt độ [° C]

/ / Đầu ra: sương điểm [° C]/************************************************* *******************************/

/************************************************* *******************************/

sht11_calc_dewpoint nổi (float h, float t)

(

float logEx, dew_point;

logEx = 0,66077 7,5 * t / (237,3 t) (log10 (h) -2);

dew_point = (logEx - 0,66077) * 237,3 / (0,66077 7,5-logEx);

dew_point trở lại;

)/************************************************* ********************************/

/************************************************* ********************************/

//------------------------------------------------ ----------------------------------

/ / Chương trình mẫu cho thấy làm thế nào để sử dụng chức năng SHT11

/ / 1.
thiết lập lại kết nối

/ / 2.
biện pháp [ẩm bọ ve] (12 bit) và [nhiệt độ bọ ve] (14 bit)

/ / 3.
tính toán độ ẩm [% RH] và [nhiệt độ C].

/ / 4.
tính toán [điểm sương C].

/ / 5.
in nhiệt độ, độ ẩm, điểm sương

/************************************************* *********************************/

/************************************************* *********************************/void main ()

(

giá trị humi_val, temp_val;

float dew_point;

unsigned char lỗi, kiểm tra, tạm thời;

sht11_connectionreset ();

trong khi (1)

(

lỗi = 0;

Lỗi = sht11_measure ((unsigned char *) & humi_val.i, và tổng kiểm tra, HUMI); / / đo độ ẩm

Lỗi = sht11_measure ((unsigned char *) & temp_val.i, và tổng kiểm tra, TEMP); / / đo nhiệt độ

if (lỗi! = 0)

sht11_connectionreset (); / / trong trường hợp lỗi: kết nối thiết lập lại

khác

(

humi_val.f = (float) humi_val.i; / / chuyển đổi số nguyên nổi

temp_val.f = (float) temp_val.i; / / chuyển đổi số nguyên nổi

sth11_calc (& humi_val.f, & temp_val.f); / / tính toán độ ẩm, nhiệt độ

dew_point = (humi_val.f, temp_val.f); sht11_calc_dewpoint / / tính toán điểm sương

/ / Gửi dữ liệu cuối cùng để giao tiếp nối tiếp (UART)

/ / Printf (temp: 5.1fC% humi:% 5.1f%% sương điểm: 5.1fC% \ n, temp_val.f, humi_val.f, dew_point);

/ / SendDataToPC (temp_val.f, 0x04);

/ / SendDataToPC (humi_val.f, 0x04);

/ / SendDataToPC (dew_point, 0x04); * /

floatToInt (temp_val.f);

floatToInt (humi_val.f);

floatToInt (dew_point);

floatToInt (lỗi);)

//---------- Chờ khoảng.
0.8s để tránh làm nóng SHTxx ------------------------------

delay_ms (1000);

temp = '\ r';

sendDataToPC (& temp, 1);

/ / Temp = '\ n';

/ / SendDataToPC (& temp, 1);

)

)
 

Welcome to EDABoard.com

Sponsor

Back
Top