Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 332

DS18b20 stm 32(AVR) измерение отрицательной температуры

13.06.2022, 20:00. Показов 1314. Ответов 9
Метки c#, c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая проблема. Как измерить температуру от нуля до -55грд.Цельсия и вывести на LCD?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "DS18B20.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#define NOID 0xCC //Пропустить идентификацию
#define T_CONVERT  0x44 //Код измерения температуры
#define READ_DATA 0xBE //Передача байтов ведущему
 
 
 
#define PORTTEMP PORTD
#define DDRTEMP DDRD
#define PINTEMP PIND
#define BITTEMP 1
 
//функция определения датчика на шине
char dt_testdevice(void) //dt - digital termomether | определим, есть ли устройство на шине
{
    //char stektemp=SREG;// сохраним значение стека
    cli(); //запрещаем прерывание
    char dt;
    DDRTEMP |= 1<<BITTEMP; //притягиваем шину
    _delay_us(485); //задержка как минимум на 480 микросекунд
    DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину
    _delay_us(65); //задержка как максимум на 60 микросекунд
    if ((PINTEMP & (1<<BITTEMP))==0)//проверяем, ответит ли устройство
    {
        dt=1;//устройство есть
    } 
    else dt=0;//устройства нет
    //SREG = stektemp;// вернем значение стека
    _delay_us(420); //задержка как минимум на 480 микросекунд, но хватит и 420, тк это с учетом времени прошедших команд
    return dt; //вернем результат
}
 
 
//функция записи бита на устройство
void dt_sendbit(char bt)
{
    //char stektemp=SREG;// сохраним значение стека
    cli(); //запрещаем прерывание
    DDRTEMP |= 1<<BITTEMP; //притягиваем шину
    _delay_us(2); //задержка как минимум на 2 микросекунды
    if(bt)
        DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину
    _delay_us(65); //задержка как минимум на 60 микросекунд
    DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину
    //SREG = stektemp;// вернем значение стека
}
//функция записи байта на устройство
void dt_sendbyte(unsigned char bt)
{
    char i;     
    for(i=0;i<8;i++)//посылаем отдельно каждый бит на устройство
    {
        if((bt & (1<<i)) == 1<<i)//посылаем 1
            dt_sendbit(1);
        else //посылаем 0
            dt_sendbit(0);
    }   
}
 
//функция чтения бита с устройства
char dt_readbit(void)
{
    //char stektemp=SREG;// сохраним значение стека
    cli(); //запрещаем прерывание
    char bt; //переменная хранения бита
    DDRTEMP |= 1<<BITTEMP; //притягиваем шину
    _delay_us(2); //задержка как минимум на 2 микросекунды
    DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину
    _delay_us(13);
    bt = (PINTEMP & (1<<BITTEMP))>>BITTEMP; //читаем бит
    _delay_us(45);
//  SREG = stektemp;// вернем значение стека
    return bt; //вернем результат
}
 
//функция чтения байта с устройства
unsigned char dt_readbyte(void)
{
    char c=0;
    char i;
    for(i=0;i<8;i++)
        c|=dt_readbit()<<i; //читаем бит
    return c;
}
 
//функция преобразования показаний датчика в температуру
int dt_check(void)
{
    unsigned char bt;//переменная для считывания байта
    unsigned int tt=0;
    if(dt_testdevice()==1) //если устройство нашлось
    {
        dt_sendbyte(NOID); //пропустить идентификацию, тк у нас только одно устройство на шине
        dt_sendbyte(T_CONVERT); //измеряем температуру
        _delay_ms(750); //в 12битном режиме преобразования - 750 милисекунд
        dt_testdevice(); //снова используем  те же манипуляции с шиной что и при проверке ее присутствия
        dt_sendbyte(NOID); //пропустить идентификацию, тк у нас только одно устройство на шине
        dt_sendbyte(READ_DATA); //даем команду на чтение данных с устройства
        bt = dt_readbyte(); //читаем младший бит
        tt = dt_readbyte(); //читаем старший бит MS
        tt = (tt<<8)|bt;//сдвигаем старший влево, младший пишем на его место, тем самым получаем общий результат
    }
    return tt;
}
uint8_t ds18b20_GetSign(uint16_t dt)
{
  //Проверим 11-й бит
  if (dt&(1<<11)) return 1;
  else return 0;
}
//преобразование температуры в единицы
char converttemp (unsigned int tt)
{
    char t = tt>>4;//сдвиг и отсечение части старшего байта
    return t;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * 1-wire(mega32a).c
 *
 * Created: 13.03.2018 5:40:10
 * Author : User
 */ 
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <stdio.h>
 
#include "DS18B20.h"
 
 
//#include "adc.h"
#include "lcd.h"
 
    unsigned int tt=0;
    unsigned char S=0;
    
 
void inits_ports(void)
{
    
    
    DDRB=0xFF;
    PORTB=0x00;
    DDRC|=(1<<2);
    PORTC|=(0<<2);
    DDRA=0x00;
    PORTA=0x00;
   DDRD=0xFF;
    PORTD=0x00;
    
}
 
 
int main(void)
{
    
    //unsigned int tt=0;
    
    inits_ports();
    //init_ADC();
    lcd_init(LCD_DISP_ON);
    lcd_clrscr();
   
    while (1) 
    {
        tt = converttemp(dt_check());
        if (tt<0)
        {
            tt=(0-tt)/16;
            //tt=-tt;
          lcd_gotoxy(0,1);
           lcd_data('-');
          lcd_data(tt/10+0x30);
          lcd_data(tt%10+0x30);
           lcd_data('*');
          lcd_data('C');
            
        } 
        else
        {
          lcd_gotoxy(0,1);
           lcd_data(' ');
          
          lcd_data(tt/10+0x30);
          lcd_data(tt%10+0x30);
           lcd_data('*');
          lcd_data('C');
            
        }
        
      
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2022, 20:00
Ответы с готовыми решениями:

Ds18b20 AVR конверсия вещественой температуры
/* * 1-wire(mega32a).c * * Created: 13.03.2018 5:40:10 * Author : User */ #define F_CPU 8000000UL//устанавливаем частоту...

Датчик температуры DS18B20
Здравствуйте, не могли бы Вы мне помочь? Я посмотрел обучающее видео про датчик температуры DS18B20...

Программирование микроконтроллеров AVR, STM под ОС Linux?
Существует ли IDE для программирования микроконтроллеров под ОС Linux?

9
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.06.2022, 20:24
тип то процессора какой?
AVR? ARM?
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 332
13.06.2022, 21:51  [ТС]
Вот это AVR.Но я думаю что принцып распространяется и на ARM(Stm32)
0
Эксперт по электронике
6500 / 3130 / 331
Регистрация: 28.10.2011
Сообщений: 12,304
Записей в блоге: 7
13.06.2022, 22:06
Цитата Сообщение от ivan rusev Посмотреть сообщение
Как измерить температуру от нуля до -55грд.
В чем сложность?
Нормально меряет температуру меньше нуля https://www.cyberforum.ru/blog... g5226.html
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.06.2022, 22:10
Цитата Сообщение от ivan rusev Посмотреть сообщение
Вот это AVR.
так почему код на AVR написан в ветке ARM?
Цитата Сообщение от ivan rusev Посмотреть сообщение
принцып распространяется и на ARM
что между ними общего?
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 332
13.06.2022, 22:11  [ТС]
Вы мне картинку решили показать.А C код?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.06.2022, 22:14
Цитата Сообщение от ivan rusev Посмотреть сообщение
Есть такая проблема. Как измерить температуру от нуля до -55грд.Цельсия
почитай описание
DS18B20 измеряет температуру в градусах по шкале Цельсия. Результат измерения представляется как 16-разрядное, знаковое число в дополнительном коде (рис. 2.) . Бит знака (S) равен 0 для положительных чисел и равен 1 для отрицательных. При разрешении 12 бит, у регистра температуры все биты значащие, т.е. имеют достоверные значения. Для разрешения 11 бит, не определен бит 0. Для 10-битного разрешения не определены биты 0, 1. При разрешении 9 бит, не достоверное значение имеют биты 0, 1 и 2.
отсюда
http://mypractic.ru/ds18b20-da... azyke.html
0
Эксперт по электронике
6500 / 3130 / 331
Регистрация: 28.10.2011
Сообщений: 12,304
Записей в блоге: 7
14.06.2022, 11:58
Цитата Сообщение от ivan rusev Посмотреть сообщение
Вы мне картинку решили показать.А C код?
Под картинкой вложение не заметили?
Или нужно было огромными буквами написать Здесь вложение (там Си код)!
0
0 / 0 / 0
Регистрация: 15.12.2019
Сообщений: 332
15.06.2022, 16:38  [ТС]
Да код есть. А в отрицательной составляющей не увидел.
0
Эксперт по электронике
6500 / 3130 / 331
Регистрация: 28.10.2011
Сообщений: 12,304
Записей в блоге: 7
15.06.2022, 22:06
Цитата Сообщение от ivan rusev Посмотреть сообщение
А в отрицательной составляющей не увидел.
Что именно не увидели и как смотрели?
Нет МК для теста и нет компа для установки протеуса?
Скрин протеуса.



Нет никаких проблем с отрицательной температурой. Они могут быть только из-за кривого кода и незнания матчасти!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2022, 22:06
Помогаю со студенческими работами здесь

AVR + DS18b20 Параметры сети.
Привет коллеги. Опросить один два датчика при помощи контроллера тема очень часто обсуждаемая на разных форумах. Я хочу поднять вопрос...

avr gcc, ds18b20, lcd3310
Добрый день. Есть у меня программа, которая выводит на дисплей от нокии 3310 показания температуры с датчика 18В20. Целая часть...

Столбики отрицательной температуры рисовать синим, а положительной - красным
Program Temper; Uses GraphABC; Const MinT = -25; MaxT = 10; Days = 40; Var T : Array Of Integer; WW, WH, X,...

Датчик температуры DS18B20: на выходе неверные данные
Вечер добрый. Подскажите как решить проблему с датчиком температуры. В общем если не углубляться, то msByte приходит 11111111. И вот я не...

Нужно заказать Pb2+avr+stm официально, хелп ми плз.
Ребята, такая проблема: хочу заказать пинборд(ы) на предприятие, начальство все одобрило, но поставка должна быть не от частного лица, а от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru