Исследование DHT11 и DHT22
Библиотека Bascom 2.0.7.8, написана пользователем форума "Пётр" - здесь
$map ' Получаем карту распределения памяти компилятором Bascom
$regfile = "m328pdef.dat"
$crystal = 8000000
$framesize = 32 ' Размер области используемой и необходимой для преобразований
$hwstack = 16 ' Размер аппаратного стека
$swstack = 40 ' Размер программного стека$baud = 4800 : Ucsr0a.1 = 1 ' Скорость трансляции Baud * 2 = 9600 бод
' Ubrr0 = 12 ' 4800, данные на стр. 190 документации на МК (http://www.atmel.com/Images/Atmel-8271- … mplete.pdf)
' Ucsr0a.1 = 1 ' Скорость трансляции Baud * 2 = 9600 бодPrint "Usart 9600"
'------------------- Конфигурация подключения LCD ----------------------------
Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 20 * 4
Cursor Off Noblink
ClsDeflcdchar 0 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 ' Знак градуса
Locate 1 , 1
Lcd " Tecї гaїАёєa DHT22 " ' "Тест датчика DHT22"'---------------- Конфигурация вывода МК для работы DHT22 --------------------
Ddr_dht22 Alias Ddrb.4
Pin_dht22 Alias Pinb.4
Port_dht22 Alias Portb.4Dim Цикл_dht22 As Byte
Dim Temp_dht22_byte As Byte
Dim Флаг_ошибка_dht22 As Byte
Dim Флаг_данные_dht22 As Byte
Dim Контрольная_сумма_dht22 As Byte
Dim Temp_контрольная_сумма_dht22 As ByteDim Влажность_word As Word
Dim Влажность_low_byte As Byte At Влажность_word Overlay
Dim Влажность_high_byte As Byte At Влажность_word + 1 OverlayDim Температура_integer As Integer
Dim Температура_low_byte As Byte At Температура_integer Overlay
Dim Температура_high_byte As Byte At Температура_integer + 1 OverlayDim Влажность_str As String * 8
Dim Температура_str As String * 8'===============================================================================
Главный_цикл:
'===============================================================================
If Флаг_данные_dht22 <> 0 Then
If Флаг_ошибка_dht22 = 0 Then
Locate 3 , 1
Lcd "B»a¶ЅocїД: " ; Влажность_str ; " %" ' "Влажность: "Locate 4 , 1
Lcd "Teјѕepaїypa: " ; Температура_str ; Chr(0) ; "C" ' "Температура: "Print "Влажность " ; Влажность_str ; "%"
Print "Температура " ; Температура_str ; "°C"Else
Locate 3 , 1
Lcd "OБёІєa АїeЅёЗ DHT22 " ; Флаг_ошибка_dht22 ' "Ошибка чтения DHT22"
Locate 4 , 1
Lcd "OБёІєa АїeЅёЗ DHT22 " ; Флаг_ошибка_dht22 ' "Ошибка чтения DHT22"Print "Ошибка чтения DHT22 " ; Флаг_ошибка_dht22
Флаг_ошибка_dht22 = 0
End If
Флаг_данные_dht22 = 0
Goto Главный_цикл
End IfWaitms 500
Gosub Чтение_dht22
'===============================================================================
Goto Главный_цикл
End
'==============================================================================='===============================================================================
Чтение_dht22:
'-------------------------------------------------------------------------------Ddr_dht22 = 1 ' Делаем вывод МК выходом
Port_dht22 = 0 ' Прижимаем вывод МК к землеWaitms 20 ' Ждем не менее 18 ms
Ddr_dht22 = 0 ' Делаем вывод МК входом
Waitus 40 ' Ждем 40 мкс
If Pin_dht22 = 1 Then ' Если на нем по прежнему "1"
Флаг_ошибка_dht22 = 1 ' Значит датчик не ответил
Goto Выход_чтение_dht22 ' Выходим из подпрограммы
End If'Если датчик ответил и прижал вывод МК к земле продолжаем работу
Waitus 80 ' Ждем еще 80 мксIf Pin_dht22 = 0 Then ' Если на линии по прежнему "0"
Флаг_ошибка_dht22 = 2 ' Значит с датчиком что-то не так
Goto Выход_чтение_dht22 ' Выходим из подпрограммы
End If'Если все нормально и датчик ответил правильно, тогда продолжаем
Gosub Ждём_0
Gosub Прием_dht22
Влажность_high_byte = Temp_dht22_byte
Gosub Прием_dht22
Влажность_low_byte = Temp_dht22_byte
Gosub Прием_dht22
Температура_high_byte = Temp_dht22_byte
Gosub Прием_dht22
Температура_low_byte = Temp_dht22_byte
Gosub Прием_dht22
Temp_контрольная_сумма_dht22 = Temp_dht22_byte
Контрольная_сумма_dht22 = Влажность_high_byte + Влажность_low_byte
Контрольная_сумма_dht22 = Контрольная_сумма_dht22 + Температура_high_byte
Контрольная_сумма_dht22 = Контрольная_сумма_dht22 + Температура_low_byteIf Контрольная_сумма_dht22 = Temp_контрольная_сумма_dht22 Then
If Температура_high_byte.7 = 1 Then
Температура_integer = 32767 - Температура_integer
End IfВлажность_str = Str(влажность_word)
Влажность_str = Format(влажность_str , " 0.0")Температура_str = Str(температура_integer)
Температура_str = Format(температура_str , " 0.0")End If ' If Контрольная_сумма_dht22 = Temp_контрольная_сумма_dht22 And Temp_контрольная_сумма_dht22 <> 0 Then
Выход_чтение_dht22:
Флаг_данные_dht22 = 1
'-------------------------------------------------------------------------------
Return
'===============================================================================
Прием_dht22:
'================================
Temp_dht22_byte = 0 ' Сбрасываем переменную
For Цикл_dht22 = 7 To 0 Step -1
Gosub Ждём_1
Waitus 30 ' После появления "1" ждем 30 мкс
If Pin_dht22 = 1 Then ' Если на выводе МК "1"
Temp_dht22_byte.цикл_dht22 = 1
Gosub Ждём_0
Else ' Иначе, если появился "0"
Temp_dht22_byte.цикл_dht22 = 0
End If
Next Цикл_dht22
Return
'================================
Ждём_0:
If Pin_dht22 <> 0 Then
Goto Ждём_0
End If
Return
'================================
Ждём_1:
If Pin_dht22 = 0 Then
Goto Ждём_1
End If
Return
'===============================================================================
Модель для Протеуса, написана пользователем форума "Пётр" - здесь
Симуляция Протеус 7.10 + исходник Bascom 2.0.7.1 + русский HD44780 - скачать



