Александр Бушков 4 Report post Posted May 26, 2016 ' Программа работает! ' Термометр на 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 1 VitalForce reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted May 26, 2016 Если вы имели ввиду ID датчика, то ... @@VitalForce алгоритм довольно замороченый. Проще всего написать программульку для этого же термометра, которая будет считывать 64 бита из датчика. Для этого цепляем первый датчик, отсылает в него код 33h, после чего считываем 64 бита и выводом их на индикатор. Потом тоже самое со вторым датчиком. После чего у нас будет два идентификатора. В основной программе вместо команды CCh используем команду 55h и следом передаёт 64 бита нужного датчика. Датчик с указанными 64 битами останется активным, второй отключился. После считывания температуры обязательно отсылает команду сброса, для того, чтобы отключившийся датчик проснулся. Это самый простой вариант. Продолжение... ID нужно, только если используется 2 и более датчиков на одном порту. Если в схеме один датчик, (или датчики находятся на разных портах МК) то поиск ID упраздняется, он не нужен. Share this post Link to post Share on other sites
Александр Бушков 4 Report post Posted May 26, 2016 С точки зрения математики здесь совершенно ясный алгоритм пересчета двух байт температуры из DS1820S в числовое значение для вывода на дисплей. Ограничиваемся только первыми двумя байтами преобразования температуры в DS1820S и не учитываем байты 7,8 остатка счета при преобразовании, т.к. это уже обеспечивает точность 0.5 градуса. Share this post Link to post Share on other sites