Jump to content

Александр Бушков

16F877a-I/P термометр на DS1820S с чтением собственного номера

Recommended Posts

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

' Термометр на DS1820S, 9 битное преобразование

' Точность 0.5 градуса

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

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

 

'16F877А-I/P  

 

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

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

 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       'Численное значение температуры на дисплей

 dg var byte         ' десятые доли градуса при выводе на дисплей: 0 или 5

 

 

 

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 для  DS1820S

 

gl=0

gh=0

  

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

 

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

x=x-80

x=x/10

x=x*30 

 

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

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

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

pause 900

 

 

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

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

TrisC.3=1 

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

 

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

 

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

pause 900

TrisC.3=1 

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

 

 

temp=0

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

if gh.0=0 then

 zn="+"

 else

 zn="-"

endif

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

if gh.0=0 then

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

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

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

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

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

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

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

    

    if gl.0=1 then

     dg="5" 

    else

    dg="0"

    endif

endif

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

if gh.0=1 then

    gl=~gl+1

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

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

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

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

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

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

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

    

    if gl.0=1 then

     dg="5" 

    else

    dg="0"

    endif

endif   

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

    lcdout $fe, 1

    lcdout $fe, 2 

    

    lcdout "DS1820S Temperat" 

    lcdout $fe, 192

    lcdout zn,dec temp,".",dg   

    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 ser2                

    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

Share this post


Link to post
Share on other sites
 

Если вы имели ввиду ID датчика, то ...

@@VitalForce алгоритм довольно замороченый. Проще всего написать программульку для этого же термометра, которая будет считывать 64 бита из датчика. Для этого цепляем первый датчик, отсылает в него код 33h, после чего считываем 64 бита и выводом их на индикатор. Потом тоже самое со вторым датчиком. После чего у нас будет два идентификатора.

В основной программе вместо команды  CCh используем команду 55h и следом передаёт 64 бита нужного датчика. Датчик с указанными 64 битами останется активным, второй отключился. После считывания температуры обязательно отсылает команду сброса, для того, чтобы отключившийся датчик проснулся. Это самый простой вариант.

 
ID нужно, только если используется 2 и более датчиков на одном порту. Если в схеме один датчик, (или датчики находятся на разных портах МК) то поиск ID упраздняется, он не нужен.

Share this post


Link to post
Share on other sites
 

С точки зрения математики здесь совершенно ясный алгоритм пересчета двух байт температуры из DS1820S в числовое значение для вывода на дисплей.

Ограничиваемся только первыми двумя байтами преобразования температуры в DS1820S и не учитываем байты 7,8 остатка счета при преобразовании, т.к. это уже обеспечивает точность 0.5 градуса.

Share this post


Link to post
Share on other sites
 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
  • Create New...