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

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

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

' Термометр на двух DS18b20 на одной шине, 12 битное преобразование

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

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

 

' Программа. версия от 2 июня 2016

 

'16F877А-I/P 

 zn var byte          'Знак температуры в подпрограмме 

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

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

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

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

 

 gl1 var byte         'градусы  младший байт температуры для первого DS18b20

 gh1 var byte         'градусы  старший байт температуры для первого DS18b20

 gl2 var byte         'градусы  младший байт температуры для второго DS18b20

 gh2 var byte         'градусы  старший байт температуры для второго DS18b20

 zn1 var byte         'Знак температуры при выводе на дисплей для первого DS18b20

 zn2 var byte         'Знак температуры при выводе на дисплей для второго DS18b20

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

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

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

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

 

 a2 var byte

 a3 var byte

 a4 var byte

 a5 var byte

 a6 var byte   

 a7 var byte   

 a8 var byte  

 x var byte

 

 fam1 var byte

 s1er0 var byte      '6 байтов собственного номера первого DS18b20

 s1er1 var byte

 s1er2 var byte

 s1er3 var byte

 s1er4 var byte

 s1er5 var byte

 crc1 var byte 

 

  fam2 var byte

 s2er0 var byte      '6 байтов собственного номера второго DS18b20

 s2er1 var byte

 s2er2 var byte

 s2er3 var byte

 s2er4 var byte

 s2er5 var byte

 crc2 var byte 

  

 

 

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

 

 fam1=40

 s1er0=255

 s1er1=33

 s1er2=203

 s1er3=102

 s1er4=20

 s1er5=3

 crc1=145

 

 fam2=40

 s2er0=151

 s2er1=148

 s2er2=82

 s2er3=7

 s2er4=0

 s2er5=0

 crc2=39

 

  

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

 

gl=0

gh=0

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

x=x-80

x=x/10

x=x*30 

gl1=0

gh1=0

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

OWout PortC.3,1,[$55]   ' Инициализация первого DS18b20 (1)  и посылка собственного номера (55)

OWout PortC.3,0,[fam1,s1er0,s1er1,s1er2,s1er3,s1er4,s1er5,crc1]

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

 

pause 900

 

OWout PortC.3,1,[$55]   ' Инициализация первого DS18b20 (1)  и посылка собственного номера (55)

OWout PortC.3,0,[fam1,s1er0,s1er1,s1er2,s1er3,s1er4,s1er5,crc1]

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

 

TrisC.3=1 

owin PortC.3,0,[gl1,gh1,a2,a3,a4,a5,a6,a7,a8]  '  Прием двух байт температуры из первого DS18b20

gl=gl1

gh=gh1

gosub Convert

zn1=zn

temp1=temp

temp10001=temp0001 

gl2=2

gh2=2

TrisC.3=0

OWout PortC.3,1,[$55]   ' Инициализация второго DS18b20 (1)  и посылка собственного номера (55)

OWout PortC.3,0,[fam2,s2er0,s2er1,s2er2,s2er3,s2er4,s2er5,crc2]

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

 

pause 900

 

OWout PortC.3,1,[$55]   ' Инициализация второго DS18b20 (1)  и посылка собственного номера (55)

OWout PortC.3,0,[fam2,s2er0,s2er1,s2er2,s2er3,s2er4,s2er5,crc2]

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

 

TrisC.3=1 

owin PortC.3,0,[gl2,gh2,a2,a3,a4,a5,a6,a7,a8]  '  Прием двух байт температуры из второго DS18b20

gl=gl2

gh=gh2

gosub Convert

zn2=zn

temp2=temp

temp20001=temp0001

 

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

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

    lcdout $fe, 1

    lcdout $fe, 2

     

    if temp10001=625 then

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

    else    

    lcdout zn1,dec temp1,".",dec temp10001, " DS18b20"

    endif

     

    lcdout $fe, 192

    if temp20001=625 then

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

    else

    lcdout zn2,dec temp2,".",dec temp20001

    endif  

       

    pause 200 

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

 

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

 

Convert:

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 

return  

 

 

End

 

DS18b20_3.jpg

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


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

В программе не заложено считывание и запоминание номеров датчиков. А если датчик крякнет, потребуется считывание кода на стороннем устройстве и перепрошивка камня.

Код небольшой, рекомендую добавить в проект. Тут на форуме есть наработка.

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


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

В программе не заложено считывание и запоминание номеров датчиков. А если датчик крякнет, потребуется считывание кода на стороннем устройстве и перепрошивка камня.

Код небольшой, рекомендую добавить в проект. Тут на форуме есть наработка.

Да, не заложено. Это есть в другой программе здесь же. Мне важно было, чтобы просто работали два датчика на одной шине. 

Учту этот момент, спасибо.

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


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

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

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

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

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

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

Войти

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

Войти



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