Traduire DS18B20 de sortie ...

H

hawk1943

Guest
Salut à tous,

Comme certains d'entre vous savent que je suis en utilisant un 16F636 pour traiter les données à partir d'un DS18B20 et la sortie des données de température à hyperterminal ...

Mais la façon dont je suis la conversion des données est évidemment faux que je reçois des données inexactes ...

Quelqu'un pourrait-il nous aider à traduire les données ...

Seulement, je voudrais si possible ajouter une virgule au code de séparer les deux valeurs ...

Fondamentalement c'est ce que je reçois ...

DONNEES brouillons = E4 10 C FF 7F 0 0 5 50
DONNEES brouillons = B1 10 5 FF 7F 0 0 1 6B
DATA = Bloc-notes A5 10 4 FF 7F 0 0 1 6C

La température à la fois les données ont été enregistrées a été de degré à 23,3

C'est ainsi que je traduis les données manuellement

550 = 1360 x 0,0625 = 85 - vous obtenez toujours cette valeur à la mise sous tension ...
16C = 364 x 0,0625 = 22,75
16B = 363 x 0,0625 = 22,6875

La résolution est de 16 bits si je ne peux donc aussi faire 363/16 = 22,6875

7F sont les données de configuration octets ...il est donc en cours d'exécution à 12 bits ...

Mais comment pourrais-je faire cela dans le code C?

J'ai quelques code tiré de la note d'application DS18B20 162 mais comme je l'ai trouvé la note d'application est plutôt contradictoires Je préfère ne pas l'utiliser ...

En fait, j'ai essayé la sortie du code, et constaté qu'il ne produit pas la bonne température sur la valeur ...

Mais au fond, c'est la façon dont ils vous montrer comment faire ...

Code:if (<temp_msb = 0x80)

(

temp_lsb = (temp_lsb / 2); / / passage à recevoir un diplôme de l'ensemble

)temp_msb temp_msb = & 0x80; / / masquer tous, mais le bit de signeif (> = 0x80 temp_msb)

(

temp_lsb = (~ temp_lsb) 1; / / complément de deux

)if (> = 0x80 temp_msb)

(

temp_lsb = (temp_lsb / 2); / / passage à recevoir un diplôme de l'ensemble

)if (> = 0x80 temp_msb)

(

temp_lsb = ((-1) temp_lsb *); / / ajouter le bit de signe

)printf ("\ n \ r tempc =% d degrés C \ r \ n", (int) temp_lsb); / temp / impression.
C

 
J'utilise cela dans un projet inachevé, il semble fonctionner mais je n'ai pas l'ensemble du programme de débogage et pourtant si je ne peux pas confirmer que c'est OK.

Code:TSHex = (WORD) Température [1] <<12; / / combiner en un seul mot

TSHex = (WORD) de température [2] <<8;

TSHex = (WORD) température [3] <<4;

TSHex = (WORD) la température [4];Inscrivez = ' ';

if ((TSHex & 0xF800) == 0xF800) / / si MSB ensemble, changement de signe et de prendre 2s compliment

(

Inscrivez = '-';

TSHex = ~ TSHex 1;

)sprintf (entier, 03d% ", (TSHex & 0x7F0)>> 4);

sprintf (Fraction, 04d% ", (TSHex & 0x0F) * 625);

fnprintf (AddTx, "% c% s.% s,%", Ecrire, plénier, Fraction);

Wait (2);

 
Hawk Salut,
Essayez d'utiliser cela, je pense que ça va vous aider à:
Code:

/ / Définit TEMP_RESOLUTION à la résolution correspondante du DS18x20 utilisé capteur:

/ / 18S20: 9 (réglage par défaut, peut être 9,10,11 ou 12)

/ / 18B20: 12const unsigned short TEMP_RESOLUTION = 9;void Display_Temperature (temp2write unsigned int) (

const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;

temp_whole char;

temp_fraction unsigned int;/ / Vérifier si la température est négative

if (temp2write & 0x8000) (

texte [0] = '-';

temp2write = ~ temp2write 1;

)/ / Extrait temp_whole

temp_whole = temp2write>> RES_SHIFT;/ / Convertit les caractères temp_whole

if (temp_whole/100)

texte [0] = temp_whole/100 48;

d'autre

texte [0] = '0 ';texte [1] = (temp_whole/10) 10% 48; / / Extrait des dizaines chiffres

texte [2] =% temp_whole 10 48; / celles Extrait / chiffres/ / Extrait temp_fraction et la convertir en unsigned int

temp_fraction = temp2write <<(4-RES_SHIFT);

temp_fraction & = 0x000f;

temp_fraction *= 625;/ / Convertit les caractères temp_fraction

texte [4] = temp_fraction/1000 48; / milliers Extrait / chiffres

texte [5] = (temp_fraction/100) 10% 48; / centaines Extrait / chiffres

texte [6] = (temp_fraction/10) 10% 48; / / Extrait des dizaines chiffres

texte [7] =% temp_fraction 10 48; / celles Extrait / chiffres/ Température / imprimante sur l'écran LCD

Lcd_Out (2, 5, texte);

)

 
il est très facile: Prenez votre MSB et LSB, forment une valeur de 16 bits et il a attribué à un 16-bit signé type (signé court dans la plupart des C).qui vous donne lecture de la température maternelle, avec des signes déjà mis en œuvre.

Code:signé à court temp = (temp_msb <<8) | temp_lsb;

 

Welcome to EDABoard.com

Sponsor

Back
Top