Александр Бушков 4 Report post Posted May 31, 2016 ' Программа работает! ' Термометр на 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 2 VitalForce and Evgeniy reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted June 1, 2016 А чего дорогой контроллер используете? Или планируется совместить несколько проектов в одном камне? Share this post Link to post Share on other sites
Александр Бушков 4 Report post Posted June 2, 2016 А чего дорогой контроллер используете? Или планируется совместить несколько проектов в одном камне? Да, так и собираюсь сделать. Проект довольно большой и там нужно будет задействовать все эти наработкти. Проект - Управление поливом в теплице. Температура на улице и внутри нужны. Отсчет времени нужен. Вкратце так: есть два бака по 120л, нужно их пополнять из внешней трубы. От них будут 4 направления полива. Каждый полив имеет три режима-отключение полива, полив типа 1 и типа 2. Полив 1 - наполнение некоторой небольшой емкости до срабатывания датчика воды. Полив типа 2- наполнение небольшой емкости по литрам. Будет задаваться частота поливов, и другие опции... Share this post Link to post Share on other sites