Перейти к содержанию

Авторизация  
Александр Бушков

16F877A-I/P Термометр на DS18b20

Рекомендуемые сообщения

' Программа работает!

' Термометр на DS18b20, 12 битное преобразование

' Точность и шаг хода температуры 0.0625 градуса

' Вывод на дисплей целого чила полных градусов и целого числа десятитысячных долей градуса 

' Вывод на дисплей признака изделия, 6 байт собственного номера, байта Ц.К.

' Программа. версия от 31 мая 2016

 

'16F877А-I/P  

 

 gl var byte         'градусы  младший байт температуры из DS18b20

 gh var byte         'градусы  старший байт температуры из DS18b20

 zn var byte         'Знак температуры

 x var byte

 fam var byte

 ser0 var byte

 ser1 var byte

 ser2 var byte

 ser3 var byte

 ser4 var byte

 ser5 var byte

 crc var byte 

 

 temp var byte       'Целочисло полных градусов

 temp0001 var word   'Целое число десятитысячных долей градуса при выводе на дисплей.

 

 

 

DEFINE LCD_DREG   PORTB

DEFINE LCD_DBIT   4

DEFINE LCD_RSREG  PORTB

DEFINE LCD_RSBIT  3

DEFINE LCD_EREG   PORTB

DEFINE LCD_EBIT   0

DEFINE LCD_BITS   4

DEFINE LCD_LINES  2

DEFINE LCD_COMMANDUS 2000

DEFINE LCD_DATUS  50

define ADC_BITS   10

define ADC_CLOCK 3

define ADC_SAMPLEUS 100

 

pause 100

 

'Конфигурируем порты

PortB=%00000000

PortC=%00000000

PortD=%00000000

PortE=%00000000

 

TrisB=%00000000 ' 0- Выход, 1 - Вход    !!!!

TrisD=%11111111 ' 0- Выход, 1 - Вход    !!!!

TrisA=%11111111 ' 0- Выход, 1 - Вход    !!!!

TrisE=%11111101 ' 0- Выход, 1 - Вход    !!!!

TrisC=%00000000 ' 0- Выход, 1 - Вход    !!!! 

ADCON1=%10000010 

 

 

x=0

 

PortE.1=1      ' Берем питание  VDD для  DS18b20

 

gl=0

gh=0

  

sto: 'НАЧАЛО ЦИКЛА 

 

x=120   ' Промежуточные вычмсления

x=x-80

x=x/10

x=x*30 

 

TrisC.3=0 ' Порт ввода-вывода информации в  DS18b20

OWout PortC.3,1,[$CC]   ' Инициализация  DS18b20 (1)  и команда пропуска серийного номера (СС)

OWout PortC.3,0,[$44]   ' Команда запуска преобразования температуры в DS18b20

pause 900

 

 

OWout PortC.3,1,[$CC]   '  Инициализация  DS18b20 (1)  и команда пропуска серийного номера (СС)

OWout PortC.3,0,[$BE]   '  Запускаем команду чтения двух байт температуры из DS18b20

TrisC.3=1 

owin PortC.3,0,[gl,gh]  '  Прием двух байт температуры из DS18b20

 

TrisC.3=0               '  Порт ввода-вывода информации в  DS18b20

 

OWout PortC.3,1,[$33]   '  Запускаем команду чтения восьми байт признак изделия, серийный номер 6 байт, байт ц.к. из DS18b20

pause 900

TrisC.3=1 

owin PortC.3,0,[fam,ser0,ser1,ser2,ser3,ser4,ser5, crc] 'Прием 8 байт из DS18b20  признак изделия, серийный номер 6 байт, байт ц.к.

 

 

temp=0

temp0001=0

'  Преобразование байтов температуры из DS18b20  в числовое значение для вывода на дисплей

if gh.7=0 then

 zn="+"

 else

 zn="-"

endif

 '  Преобразование для положительной температуры

if gh.7=0 then

    if gh.2 =1 then temp=temp+64 

    if gh.1 =1 then temp=temp+32 

    if gh.0 =1 then temp=temp+16

 

    if gl.7 = 1 then temp=temp+8

    if gl.6= 1 then temp=temp+4 

    if gl.5 =1 then temp=temp+2

    if gl.4 =1 then temp=temp+1 

    if gl.3 =1 then temp0001=temp0001+5000 

    if gl.2 =1 then temp0001=temp0001+2500 

    if gl.1 =1 then temp0001=temp0001+1250       

    if gl.0=1 then temp0001=temp0001+625            

    

    

endif

 '  Преобразование для отрицательной температуры

if gh.7=1 then

     gl=~gl+1  ' Делаем дополнение к отрицательной температуре:

               ' инвертиреем биты и прибавляем 1 

     gh=~gh

     

    if gl=0 then gh=gh+1 'Учитываем перенос из мл.байта при +1,если он был                      

 

    if gh.2 =1 then temp=temp+64 

    if gh.1 =1 then temp=temp+32 

    if gh.0 =1 then temp=temp+16

 

    if gl.7 = 1 then temp=temp+8

    if gl.6= 1 then temp=temp+4 

    if gl.5 =1 then temp=temp+2

    if gl.4 =1 then temp=temp+1 

    if gl.3 =1 then temp0001=temp0001+5000 

    if gl.2 =1 then temp0001=temp0001+2500 

    if gl.1 =1 then temp0001=temp0001+1250       

    if gl.0=1 then temp0001=temp0001+625            

    

    

endif 

'Вывод на дисплей целого чила полных градусов и целого числа десятитысячных долей градуса  

'Вывод на дисплей 8 байт из DS18b20  признак изделия, серийный номер 6 байт, байт ц.к.         

    lcdout $fe, 1

    lcdout $fe, 2 

    

    lcdout "DS18b20 Temperat" 

    lcdout $fe, 192

    if temp0001=625 then

    lcdout zn,dec temp,".0625" 'Добавляем ведущий 0 перед 625 когда temp0001=625. Иначе было бы 23.625 вместо 23.0625

    else

    lcdout zn,dec temp,".",dec temp0001

    endif   

    pause 3000    

    

    lcdout $fe, 1

    lcdout $fe, 2    

    lcdout "Fam = ",dec fam

    lcdout $fe, 192

    lcdout "Ser0= ",dec ser0                

    pause 3000

    

    lcdout $fe, 1

    lcdout $fe, 2    

    lcdout "Ser1= ",dec ser1

    lcdout $fe, 192

    lcdout "Ser2= ",dec ser3                

    pause 3000

    

    lcdout $fe, 1

    lcdout $fe, 2    

    lcdout "Ser3= ",dec ser3

    lcdout $fe, 192

    lcdout "Ser4= ",dec ser4            

    pause 3000

    

    lcdout $fe, 1

    lcdout $fe, 2    

    lcdout "Ser5= ",dec ser5

    lcdout $fe, 192

    lcdout "CRC = ",dec crc              

    pause 3000 

    

    

    

'Конец вывода информации на дисплей 

 

goto sto ' КОНЕЦ ЦИКЛА 

 

End

DS18b20_1.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

А чего дорогой контроллер используете? Или планируется совместить несколько проектов в одном камне?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

А чего дорогой контроллер используете? Или планируется совместить несколько проектов в одном камне?

Да, так и собираюсь сделать. Проект довольно большой и там нужно будет задействовать все эти наработкти.

Проект - Управление поливом в теплице. Температура на улице и внутри нужны. Отсчет времени нужен.

Вкратце так: есть два бака по 120л, нужно их пополнять из внешней трубы. От них будут 4 направления полива. Каждый полив имеет три режима-отключение полива, полив типа 1 и типа 2. Полив 1 - наполнение некоторой небольшой емкости до срабатывания датчика воды. Полив типа 2- наполнение небольшой емкости по литрам. Будет задаваться частота поливов,  и другие опции...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  



×
  • Создать...