
Александр Бушков
-
Content Count
22 -
Joined
-
Last visited
-
Days Won
4
Reputation Activity
-
Александр Бушков got a reaction from Ростислав Михайлов in Датчик воды на триггере Шмидта
В качестве зонда используется любой провод, например ВВГ 2х1,5 мм2
-
Александр Бушков got a reaction from VitalForce in 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
-
Александр Бушков got a reaction from Evgeniy in 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
-
Александр Бушков got a reaction from VitalForce in 16F877a-I/P термометр на DS1820S с чтением собственного номера
' Программа работает!
' Термометр на 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