Цифровой манометр, МК Atmega8 – LED 2х3 часть2

Рассказать в:

Настройка и управление (назначение кнопок , светодиодов) аналогично описаному в   базовой схеме.

Работать будет и с другими автомобильными датчиками серии ММ3ххх , вот примерные характеристики таких датчиков

Датчик ММ358 при отсутствии давления должен иметь сопротивление 160...175 Ом, при давлении в 2 кг/см2 — 110...114 Ом, при давлении в 4 кг/см2 — 58...65 Ом, при давлении в 6кг/см2  — 0...5 Ом
Датчик 23.3839 при отсутствии давления должен иметь сопротивление 305...330 Ом, при давлении в 1,5 кг/см2  — 180...200 Ом, при давлении в 4,5 кг/см2  — 70...80 Ом, при давлении в 6кг/см2 — 0...8 Ом
Датчик ММ393А при отсутствии давления должен иметь сопротивление 310...320 Ом, при давлении в 4 кг/см2 — 115...130 Ом, при давлении в 6 кг/см2  — 55...65 Ом, при давлении в 8   кг/см2 — 0...15 Ом.

Как видим принцип тут один и тот же.


Экслюзивное фото , что у датчика давления, внутри.


Цифровой манометр, МК atmega8 – led 2х3 часть2

Анимированая картинка работы датчика давления  размер 1.86mb


===================================================================================================================


 Вольтметр от 0.0 до 50.0 вольт, давление от 0.0 до 8.0 кг/см , канал давления с использованием корректировки экспонентой. 

Для измерительной схемы с применением аналогово автомобильного датчика   , автор этой программы mactepok сделал небольшую редакцию кода  в этой программе.

Так как аналоговые датчики  ММ3хх  имеют некоторую нелинейность изменения сопротивления при увеличении давления.

Для программной корректировки, в программу внесена експонента.

any_var = chvar_1 / 2000     2000 - можно задавать изгиб линии
any_var = negativ * any_var   Если закоментировать, изменим направление изгиба экспоненты
any_var = exp(any_var)
chvar_1 = 1023 - chvar_1
chvar_1 = chvar_1 / 12.786   диапазон до 80 
any_var = chvar_1 * any_var
chvar_1 = any_var 


Таким образом, получаем вот такую коректированую кривизну измерения 9955260.xls

Цифровой манометр, МК atmega8 – led 2х3 часть2

Схема;

Цифровой манометр, МК atmega8 – led 2х3 часть2

 Исходный код программы;

code
* filename : Универсальный 2х-канальный индикатор *
* revision : 5.0 *
* controller : atmega8 *
* compiler : bascom-avr 2.0.6.1 *
* author : mactepok *
*******************************************************************************
$regfile = "m8def.dat" определяем контроллер
$crystal = 8000000 внутренний генератор
$sim
$lib "mcsbyte.lbx" подключаем библиотеку функций
$hwstack = 40
$swstack = 16
$framesize = 32


config pinc.0 = input : portc.0 = 1 кнопка Выбор
config pinc.1 = input : portc.1 = 1 кнопка Вверх
config pinc.2 = input : portc.2 = 1 кнопка Вниз

config portd = output : config portb = output порты на выход к которым подключен индикатор

load1 alias portb.3 нагрузка №1
load2 alias portb.4 нагрузка №2
vibor alias pinc.0 кнопка Выбор
up alias pinc.1 кнопка Вверх
down alias pinc.2 кнопка Вниз

config adc = single , prescaler = auto , reference = avcc настраиваем АЦП
dim w as byte , y as byte , x as byte , i as byte , z as byte , chislo(6) as integer , channel_1 as integer , on1 as word , off1 as word , channel_2 as integer , on2 as word , off2 as word , sostoyanie as byte , sostoyanie_2 as byte , copy_print as integer , copy_print_sec as integer , copy_var as integer , _print as integer , _print_sec as integer , pokazaniya as integer , view_menu as byte , booton_flag as bit , booton_flag_2 as bit , count as word , error_flag as bit
dim razryad_1 as byte , razryad_2 as byte , temp_najatiya as byte , indicator as byte
dim menu_punkt as byte , any_var as single пункт меню
dim set_flag as bit флаг режима настройки уставок
dim podskaz_flag as bit , podskaz_flag_sec as bit флаги режима отображения подсказок на соответствующих каналах
dim default as eram byte at &h14 переменная eeprom для записи начальных уставок для первого включения прибора
dim adc_ready as bit Флаг готовности АЦП
dim chvar_1 as single , chvar_2 as single промежуточные переменные для расчетов
dim ch1 as integer , ch2 as integer,

const negativ = -1


a alias portd.2 : b alias portd.6 : c alias portb.7 : d alias portb.2 порты, к которым подключены сегменты индикатора
e alias portd.0 : f alias portb.6 : g alias portd.7 : h alias portb.5
dig1 alias portd.3 : dig2 alias portd.4 : dig3 alias portd.1 порты, к которым подключены общие аноды 1го индикатора
dig1_sec alias portd.5 : dig2_sec alias portb.0 : dig3_sec alias portb.1 порты, к которым подключены общие аноды 2го индикатора



for x = 1 to 6 присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались нули
chislo(x) = 11
next
*********** ___ Переключение типа индикаторов (ОК/ОА) ___ *********************
readeeprom indicator , 26
if vibor = 0 then Удерживая кнопку УСТ, подаем питание.
for x = 1 to 200
if x = 150 then При длительном нажатии
set booton_flag
toggle indicator.3 Переключаем младший (четвертый) бит переменной. Номер бита выбрал произвольно
writeeeprom indicator , 26
if indicator = &b00000000 then Если переключили на ОА, зажжем все сегменты идикатора для подтверждения
reset a : reset b : reset c : reset d : reset e : reset f : reset g : reset h
set dig1 : set dig2 : set dig3 : set dig1_sec : set dig2_sec : set dig3_sec
end if
if indicator = &b00001000 then Если переключили на Оk, зажжем все сегменты идикатора для подтверждения
set a : set b : set c : set d : set e : set f : set g : set h
reset dig1 : reset dig2 : reset dig3 : reset dig1_sec : reset dig2_sec : reset dig3_sec
end if
waitms 1500
exit for
end if
if vibor = 1 then exit for
waitms 10
next
end if
*******************************************************************************
if default = 255 then при первом запуске, когда default=255
off1 = 70 присваиваем начальный уставки
on1 = 50
off2 = 140
on2 = 120
indicator = &b00001000 для ОА. indicator = &b00001000 для ОК
razryad_1 = &b10111011
razryad_2 = &b10111011
writeeeprom on1 , 0 Записываем в eeprom уставку on1
writeeeprom off1 , 5 Записываем в eeprom уставку off1
writeeeprom on2 , 10 Записываем в eeprom уставку on2
writeeeprom off2 , 14 Записываем в eeprom уставку off2
writeeeprom razryad_1 , 16
writeeeprom razryad_2 , 17
writeeeprom indicator , 26
default = 100 присваиваем значение 100(произвольное, отличное от 255) и больше этот кусок кода выполняться не будет
end if
readeeprom on1 , 0 Считываем из eeprom уставку on1
readeeprom off1 , 5 Считываем из eeprom уставку off1
readeeprom on2 , 10 Считываем из eeprom уставку on2
readeeprom off2 , 14 Считываем из eeprom уставку off2
readeeprom razryad_1 , 16
readeeprom razryad_2 , 17

config timer0 = timer , prescale = 64 : on timer0 pulse конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
config timer1 = timer , prescale = 1 : on timer1 bootons конфигурируем таймер 1 и назначаем подпрограмму которая выполняется при переполнении таймера
enable interrupts : enable timer0 : enable timer1 разрешаем прерывания, таймер 0, таймер 1
start timer0 : start timer1
start adc начало преобразования

x = 50 чтобы опрос АЦП произошел в первом круге
do
if x > 50 and timer0 < 50 then
stop timer0 : stop timer1 на время преобразования останавливаем таймеры
ch1 = getadc(5) Давление
ch2 = getadc(4) Напряжение
chvar_1 = ch1
chvar_2 = ch2
start timer0 : start timer1
any_var = chvar_1 / 2000 2000 - можно задавать изгиб линии
any_var = negativ * any_var Если закоментировать, изменим направление изгиба экспоненты
any_var = exp(any_var)
chvar_1 = 1023 - chvar_1
chvar_1 = chvar_1 / 12.786 пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============
any_var = chvar_1 * any_var
chvar_1 = any_var

chvar_2 = chvar_2 / 2.046 пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============
if chvar_2 > 500 then chvar_2 = 500 верхний предел показаний


stop timer0 : stop timer1
if ch1 < 1023 then
if chvar_1 > 0 then channel_1 = chvar_1 присваиваем значения переменных для индикации
if chvar_1 > 80 then channel_1 = 80 верхний предел показаний
else
channel_1 = 0
end if
channel_2 = chvar_2
start timer0 : start timer1
x = 0
end if


if on1 < off1 then если уставка on1 < off1 то режим нагревателя
if channel_1 <= on1 then sostoyanie = 1 если значение первого канала АЦП ниже уставки on1, то включаем нагрузку №1
if channel_1 >= off1 then sostoyanie = 0 если значение первого канала АЦП выше уставки off1, то выключаем нагрузку №1
else если уставка on1 > off1 то режим охладителя
if channel_1 >= on1 then sostoyanie = 1 если значение первого канала АЦП выше уставки on1, то включаем нагрузку №1
if channel_1 <= off1 then sostoyanie = 0 если значение первого канала АЦП ниже уставки off1, то выключаем нагрузку №1
end if

if sostoyanie = 1 then set load1 else reset load1 управление 1м каналом нагрузки

if on2 < off2 then если уставка on2 < off2 то режим нагревателя
if channel_2 <= on2 then sostoyanie_2 = 1 если давление ниже уставки on2, то включаем нагрузку №2
if channel_2 >= off2 then sostoyanie_2 = 0 если давление выше уставки off2, то выключаем нагрузку №2
else если уставка on2 > off2 то режим охладителя
if channel_2 >= on2 then sostoyanie_2 = 1 если давление выше уставки on2, то включаем нагрузку №2
if channel_2 <= off2 then sostoyanie_2 = 0 если давление ниже уставки off2, то выключаем нагрузку №2
end if

if sostoyanie_2 = 1 then set load2 else reset load2 управление 2м каналом нагрузки

loop

*******************************************************************************
Индикация

pulse:
if view_menu <> 0 and error_flag = 0 then incr count если находимся в меню и нет ошибки ввода уставок,то инкриментируем счетчик, который отвечает за автоматический выход из меню (~ через 5 сек)
if count > 7000 then задается время автоматического выхода из меню
count = 0 сброс счетчика
view_menu = 0 выход из меню в основной режим
end if
h = 1 выключаем точку на индикаторе
stop timer0 останавливаем таймер 0
select case view_menu в зависимости от пункта меню, записываем в переменные расчета следующие данные
case 0 :
_print = channel_1 основной режим. 1й индикатор показывает значение АЦП 1го канала
_print_sec = channel_2 основной режим. 2й индикатор показывает значение АЦП 2го канала
case 1 :
_print = on1 1й индикатор показывает значение уставки on1
_print_sec = channel_2 2й индикатор показывает значение АЦП 2го канала
case 2 :
_print = off1 1й индикатор показывает значение уставки off1
_print_sec = channel_2 2й индикатор показывает значение АЦП 2го канала
case 3 :
_print = channel_1 1й индикатор показывает значение АЦП 1го канала
_print_sec = on2 2й индикатор показывает значение уставки on2
case 4 :
_print = channel_1 1й индикатор показывает значение АЦП 1го канала
_print_sec = off2 2й индикатор показывает значение уставки off2
end select

if podskaz_flag = 0 then если не выводим на 1й индикатор подсказки, то работаем с числами
copy_print = _print
copy_var = copy_print
for i = 3 to 1 step -1 цикл в котором разбивается переменная на 3 числа
chislo(i) = copy_print mod 10 заносим в масив последнюю цифру от числа copy_print(123 mod 10 = 3)
copy_print = copy_print / 10 отсекаем последнюю цифру от числа copy_print (123/10=12)
next убираем незначимые нули
if copy_var < 100 then chislo(1) = 11 для 2х значного числа
if copy_var < 10 then chislo(2) = 11 для однозначного числа
end if
if podskaz_flag_sec = 0 then если не выводим на 2й индикатор подсказки, то работаем с числами
copy_print_sec = _print_sec
copy_var = copy_print_sec
for i = 6 to 4 step -1 цикл в котором разбивается переменная на 3 числа
chislo(i) = copy_print_sec mod 10 заносим в масив последнюю цифру от числа _print(123 mod 10 = 3)
copy_print_sec = copy_print_sec / 10 отсекаем последнюю цифру от числа copy_print_sec (123/10=12)
next убираем незначимые нули
if copy_var < 100 then chislo(4) = 11 для 2х значного числа
if copy_var < 10 then chislo(5) = 11 для однозначного числа
end if


if indicator = 0 then Гасим индикаторы перед выводом информации
reset dig1 : reset dig2 : reset dig3 : reset dig1_sec : reset dig2_sec : reset dig3_sec Для индикатора с ОА
else
set dig1 : set dig2 : set dig3 : set dig1_sec : set dig2_sec : set dig3_sec Для индикатора с Оk
end if

incr w : if w > 6 then w = 1 выбираем какую цифру сейчас включать
y = 0
gosub look : a = z переходим к подпрограмме look, которая определяет нужно ли сейчас загорется сегменту А
gosub look : b = z
gosub look : c = z
gosub look : d = z
gosub look : e = z
gosub look : f = z
gosub look : g = z

select case w включаем цифру(разряд) которую выбрали (w). Подаем плюс на общий провод конкретной цифры (разряда)
case 1 :
if indicator = 0 then
set dig3
if podskaz_flag = 0 then h = razryad_1.3 else h = 1
else
reset dig3
if podskaz_flag = 0 then
h = razryad_1.3
toggle h
else
h = 0
end if
end if
case 2 :
if indicator = 0 then
set dig2
if podskaz_flag = 0 then h = razryad_1.2 else h = 1
else
reset dig2
if podskaz_flag = 0 then
h = razryad_1.2
toggle h
else
h = 0
end if
end if
case 3 :
if indicator = 0 then
set dig1
if podskaz_flag = 0 then h = razryad_1.1 else h = 1
else
reset dig1
if podskaz_flag = 0 then
h = razryad_1.1
toggle h
else
h = 0
end if
end if
case 4 :
if indicator = 0 then
set dig3_sec
if podskaz_flag_sec = 0 then h = razryad_2.3 else h = 1
else
reset dig3_sec
if podskaz_flag_sec = 0 then
h = razryad_2.3
toggle h
else
h = 0
end if
end if
case 5 :
if indicator = 0 then
set dig2_sec
if podskaz_flag_sec = 0 then h = razryad_2.2 else h = 1
else
reset dig2_sec
if podskaz_flag_sec = 0 then
h = razryad_2.2
toggle h
else
h = 0
end if
end if
case 6 :
if indicator = 0 then
set dig1_sec
if podskaz_flag_sec = 0 then h = razryad_2.1 else h = 1
else
reset dig1_sec
if podskaz_flag_sec = 0 then
h = razryad_2.1
toggle h
else
h = 0
end if
end if
end select


start timer0
return

look: подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
z = chislo(w) * 7 : z = y + z определяем порядковый номер числа из таблици data. w - это цифра которую будем выводить 1..2..3, y это номер сегмента (a=0 b=1 c=2...g=7)
if indicator = 0 then
z = lookup(z , cifri_oa) выбираем из таблици включить или выключить нужный сегмент -oa
else
z = lookup(z , cifri_ok) -ok
end if
incr y y это номер сегмента (a=0 b=1 c=2...). chislo(w) * 7 - переход на начало нужной строки data.z = y + z - по очереди перебираем сегменты в строке.
return

cifri_oa:
таблица сегментом для индикаторов с общим плюсом |chislo(i)| Символ |
data 0 , 0 , 0 , 0 , 0 , 0 , 1 0
data 1 , 0 , 0 , 1 , 1 , 1 , 1 1
data 0 , 0 , 1 , 0 , 0 , 1 , 0 2
data 0 , 0 , 0 , 0 , 1 , 1 , 0 3
data 1 , 0 , 0 , 1 , 1 , 0 , 0 4
data 0 , 1 , 0 , 0 , 1 , 0 , 0 5
data 0 , 1 , 0 , 0 , 0 , 0 , 0 6
data 0 , 0 , 0 , 1 , 1 , 1 , 1 7
data 0 , 0 , 0 , 0 , 0 , 0 , 0 8
data 0 , 0 , 0 , 0 , 1 , 0 , 0 9
data 1 , 1 , 1 , 1 , 1 , 1 , 0 10 "-"
data 1 , 1 , 1 , 1 , 1 , 1 , 1 11 ""
data 1 , 1 , 1 , 0 , 0 , 0 , 1 12 "l"
data 1 , 1 , 0 , 1 , 0 , 1 , 0 13 "n"
data 0 , 1 , 1 , 1 , 0 , 0 , 0 14 "f"
data 0 , 1 , 1 , 0 , 0 , 0 , 0 15 "e"
data 1 , 1 , 1 , 1 , 0 , 1 , 0 16 "r"

*******************************************************************************
cifri_ok:
таблица сегментом для индикаторов с общим минусом |chislo(i)| Символ |
data 1 , 1 , 1 , 1 , 1 , 1 , 0 0
data 0 , 1 , 1 , 0 , 0 , 0 , 0 1
data 1 , 1 , 0 , 1 , 1 , 0 , 1 2
data 1 , 1 , 1 , 1 , 0 , 0 , 1 3
data 0 , 1 , 1 , 0 , 0 , 1 , 1 4
data 1 , 0 , 1 , 1 , 0 , 1 , 1 5
data 1 , 0 , 1 , 1 , 1 , 1 , 1 6
data 1 , 1 , 1 , 0 , 0 , 0 , 0 7
data 1 , 1 , 1 , 1 , 1 , 1 , 1 8
data 1 , 1 , 1 , 1 , 0 , 1 , 1 9
data 0 , 0 , 0 , 0 , 0 , 0 , 1 10 "-"
data 0 , 0 , 0 , 0 , 0 , 0 , 0 11 "" пусто
data 0 , 0 , 0 , 1 , 1 , 1 , 0 12 "l"
data 0 , 0 , 1 , 0 , 1 , 0 , 1 13 "n"
data 1 , 0 , 0 , 0 , 1 , 1 , 1 14 "f"
data 1 , 0 , 0 , 1 , 1 , 1 , 1 15 "e"
data 0 , 0 , 0 , 0 , 1 , 0 , 1 16 "r"

*******************************************************************************

*******************************************************************************
Опрос кнопок
bootons:
incr x
stop timer1
if vibor = 0 and booton_flag = 0 and up = 1 and down = 1 then gosub set_mode Нажатие кнопки УСТ
if set_flag = 1 and vibor = 1 then Кнопки Вверх и Вниз активны только после входа в меню
if up = 0 then gosub up_const
if down = 0 then gosub down_const
end if
if vibor = 0 and up = 0 and view_menu = 0 and booton_flag_2 = 0 then gosub set_h_led1
if vibor = 0 and down = 0 and view_menu = 0 and booton_flag_2 = 0 then gosub set_h_led2

if vibor = 1 and up = 1 and down = 1 then reset booton_flag сброс флага удержания кнопки
if vibor = 1 then reset booton_flag_2
start timer1 : start timer0
return
*******************************************************************************


set_mode:
enable interrupts : enable timer0 : start timer0

set set_flag поднимаем флаг режима настройки уставок (находимся в меню)
set booton_flag поднимаем флаг удержания кнопки (пока не сбросится, в следующий пункт меню не попадаем)
count = 0 сброс счетчика автоматического выхода из меню
if on1 = off1 or on2 = off2 then gosub errors Блокировка ввода уставок. Переходим в подпрограмму индикации ошибки
incr view_menu следующий пункт меню
if view_menu > 4 then view_menu = 0 всего 4 пункта меню, 0й - основной режим

select case view_menu индикация подсказок пунктов меню
case 0 : ---
set podskaz_flag
set podskaz_flag_sec
chislo(1) = 10
chislo(2) = 10
chislo(3) = 10
chislo(4) = 10
chislo(5) = 10
chislo(6) = 10
reset set_flag
waitms 500
stop timer1 : stop timer0
writeeeprom off2 , 14 запись уставки off2 в eeprom

case 1 : on1
set podskaz_flag Поднимаем флаг вывода подсказок (буквы) на 1й индикатор
chislo(3) = 1
chislo(2) = 13
chislo(1) = 0
waitms 500

case 2 : of1
set podskaz_flag Поднимаем флаг вывода подсказок (буквы) на 1й индикатор
chislo(3) = 1
chislo(2) = 14
chislo(1) = 0
waitms 500
stop timer1 : stop timer0
writeeeprom on1 , 0 запись уставки on1 в eeprom

case 3 : on2
set podskaz_flag_sec Поднимаем флаг вывода подсказок (буквы) на 2й индикатор
chislo(6) = 2
chislo(5) = 13
chislo(4) = 0
waitms 500
stop timer1 : stop timer0
writeeeprom off1 , 5 запись уставки off1 в eeprom

case 4 : off2
set podskaz_flag_sec Поднимаем флаг вывода подсказок (буквы) на 2й индикатор
chislo(6) = 2
chislo(5) = 14
chislo(4) = 0
waitms 500
stop timer1 : stop timer0
writeeeprom on2 , 10 запись уставки on2 в eeprom

end select

reset podskaz_flag
reset podskaz_flag_sec
return

errors:
set error_flag поднимаем флаг ошибки
if on1 = off1 then
set podskaz_flag
chislo(1) = 15
chislo(2) = 16 Выводим подсказку err и мигаем на 1м индикаторе
chislo(3) = 16
waitms 500
chislo(1) = 11
chislo(2) = 11
chislo(3) = 11
waitms 500
chislo(1) = 15
chislo(2) = 16
chislo(3) = 16
waitms 500
chislo(1) = 11
chislo(2) = 11
chislo(3) = 11
waitms 500
end if
if on2 = off2 then
set podskaz_flag_sec
chislo(4) = 15
chislo(5) = 16 Выводим подсказку err и мигаем на 2м индикаторе
chislo(6) = 16
waitms 500
chislo(4) = 11
chislo(5) = 11
chislo(6) = 11
waitms 500
chislo(4) = 15
chislo(5) = 16
chislo(6) = 16
waitms 500
chislo(4) = 11
chislo(5) = 11
chislo(6) = 11
waitms 500
end if
select case view_menu взависимости от того, в каком пункте меню ввели неверное значение
case 0 : возвращаем из eeprom предыдущие значения
case 1 :
readeeprom on1 , 0
case 2 :
readeeprom off1 , 5
case 3 :
readeeprom on2 , 10
case 4 :
readeeprom off2 , 14
end select
decr view_menu возвращаемся в предыдущий пункт меню (в ошибочный)
count = 0 : reset error_flag
return

up_const:
enable interrupts : enable timer0 : start timer0
count = 0
select case view_menu
case 1 :
if on1 < 80 then incr on1
case 2 :
if off1 < 80 then incr off1
case 3 :
if on2 < 500 then incr on2
case 4 :
if off2 < 500 then incr off2
end select время задержки установки кн.+ значений уставок
waitms 100
return


down_const:
enable interrupts : enable timer0 : start timer0
count = 0
select case view_menu
case 1 :
if on1 > 0 then decr on1 добавляется второе условие при работе с отрицательными числами
case 2 :
if off1 > 0 then decr off1
case 3 :
if on2 > 0 then decr on2
case 4 :
if off2 > 0 then decr off2
end select
waitms 100 время задержки установки кн.- значений уставок
return


set_h_led1:
set booton_flag_2
rotate razryad_1 , left
stop timer1 : stop timer0
writeeeprom razryad_1 , 16
return


set_h_led2:
set booton_flag_2
rotate razryad_2 , left
stop timer1 : stop timer0
writeeeprom razryad_2 , 17
return
 

Файлы; исходник , нех, proteus.


==================================================================================================


Схема  с  применением температурного датчика ds18b20 и второй канал для измерения давления. 

Цифровой манометр, МК atmega8 – led 2х3 часть2

 Исходный код программы;

code
* filename : Универсальный 2х-канальный индикатор *
* revision : 5.0 *
* controller : atmega8 *
* compiler : bascom-avr 2.0.6.1 *
* author : mactepok *
*******************************************************************************
$regfile = "m8def.dat" определяем контроллер
$crystal = 8000000 внутренний генератор
$sim
$lib "mcsbyte.lbx" подключаем библиотеку функций
$hwstack = 40
$swstack = 16
$framesize = 32


config pinc.0 = input : portc.0 = 1 кнопка Выбор
config pinc.1 = input : portc.1 = 1 кнопка Вверх
config pinc.2 = input : portc.2 = 1 кнопка Вниз

config portd = output : config portb = output порты на выход к которым подключен индикатор

config 1wire = portc.4 Порт для подключения датчика ds18b20

load1 alias portb.3 нагрузка №1
load2 alias portb.4 нагрузка №2
vibor alias pinc.0 кнопка Выбор
up alias pinc.1 кнопка Вверх
down alias pinc.2 кнопка Вниз

config adc = single , prescaler = auto , reference = avcc настраиваем АЦП
dim w as byte , y as byte , x as byte , i as byte , z as byte , chislo(6) as integer , channel_1 as integer , channel_1word as word , on1 as word , off1 as word , channel_2 as integer , on2 as word , off2 as word , sostoyanie as byte , sostoyanie_2 as byte , copy_print as integer , copy_print_sec as integer , copy_var as integer , _print as integer , _print_sec as integer , pokazaniya as integer , view_menu as byte , booton_flag as bit , booton_flag_2 as bit , count as word , error_flag as bit , error_temp_flag as bit
dim razryad_1 as byte , razryad_2 as byte , temp_najatiya as byte , indicator as byte
dim menu_punkt as byte , any_var as single пункт меню
dim set_flag as bit флаг режима настройки уставок
dim podskaz_flag as bit , podskaz_flag_sec as bit флаги режима отображения подсказок на соответствующих каналах
dim default as eram byte at &h14 переменная eeprom для записи начальных уставок для первого включения прибора
dim adc_ready as bit Флаг готовности АЦП
dim chvar_1 as single , chvar_2 as integer промежуточные переменные для расчетов
dim ch1 as integer , ch2 as integer,
dim numb as word , dsid1(8) as byte , bd1 as byte , bd2 as byte , bd(9) as byte , Переменные для работы с ds18b20
dim t1 as single , t2 as integer , minus_flag as bit , read_flag as bit , conv_flag as bit , ds_count as byte
const negativ = -1


a alias portd.2 : b alias portd.6 : c alias portb.7 : d alias portb.2 порты, к которым подключены сегменты индикатора
e alias portd.0 : f alias portb.6 : g alias portd.7 : h alias portb.5
dig1 alias portd.3 : dig2 alias portd.4 : dig3 alias portd.1 порты, к которым подключены общие аноды 1го индикатора
dig1_sec alias portd.5 : dig2_sec alias portb.0 : dig3_sec alias portb.1 порты, к которым подключены общие аноды 2го индикатора

a alias portd.5 : b alias portd.7 : c alias portd.3 : d alias portd.1 порты, к которым подключены сегменты индикатора
e alias portd.0 : f alias portd.6 : g alias portd.4 : h alias portd.2
dig1 alias portb.0 : dig2 alias portb.1 : dig3 alias portb.2 порты, к которым подключены общие аноды 1го индикатора
dig1_sec alias portb.5 : dig2_sec alias portb.6 : dig3_sec alias portb.7 порты, к которым подключены общие аноды 2го индикатора


numb = 1wirecount()
if numb > 0 then dsid1(1) = 1wsearchfirst() else set error_temp_flag
for x = 1 to 6 присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались нули
chislo(x) = 11
next
*********** ___ Переключение типа индикаторов (ОК/ОА) ___ *********************
readeeprom indicator , 26
if vibor = 0 then Удерживая кнопку УСТ, подаем питание.
for x = 1 to 200
if x = 150 then При длительном нажатии
set booton_flag
toggle indicator.3 Переключаем младший (четвертый) бит переменной. Номер бита выбрал произвольно
writeeeprom indicator , 26
if indicator = &b00000000 then Если переключили на ОА, зажжем все сегменты идикатора для подтверждения
reset a : reset b : reset c : reset d : reset e : reset f : reset g : reset h
set dig1 : set dig2 : set dig3 : set dig1_sec : set dig2_sec : set dig3_sec
end if
if indicator = &b00001000 then Если переключили на Оk, зажжем все сегменты идикатора для подтверждения
set a : set b : set c : set d : set e : set f : set g : set h
reset dig1 : reset dig2 : reset dig3 : reset dig1_sec : reset dig2_sec : reset dig3_sec
end if
waitms 1500
exit for
end if
if vibor = 1 then exit for
waitms 10
next
end if
*******************************************************************************
if default = 255 then при первом запуске, когда default=255
off1 = 70 присваиваем начальный уставки
on1 = 50
off2 = 30
on2 = 27
indicator = &b00001000
indicator = &b00000000 для ОА. indicator = &b00001000 для ОК
razryad_1 = &b10111011
razryad_2 = &b11101110
writeeeprom on1 , 0 Записываем в eeprom уставку on1
writeeeprom off1 , 5 Записываем в eeprom уставку off1
writeeeprom on2 , 10 Записываем в eeprom уставку on2
writeeeprom off2 , 14 Записываем в eeprom уставку off2
writeeeprom razryad_1 , 16
writeeeprom razryad_2 , 17
writeeeprom indicator , 26
default = 100 присваиваем значение 100(произвольное, отличное от 255) и больше этот кусок кода выполняться не будет
end if
readeeprom on1 , 0 Считываем из eeprom уставку on1
readeeprom off1 , 5 Считываем из eeprom уставку off1
readeeprom on2 , 10 Считываем из eeprom уставку on2
readeeprom off2 , 14 Считываем из eeprom уставку off2
readeeprom razryad_1 , 16
readeeprom razryad_2 , 17

config timer0 = timer , prescale = 64 : on timer0 pulse конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
config timer1 = timer , prescale = 1 : on timer1 bootons конфигурируем таймер 1 и назначаем подпрограмму которая выполняется при переполнении таймера
enable interrupts : enable timer0 : enable timer1 разрешаем прерывания, таймер 0, таймер 1
start timer0 : start timer1
start adc начало преобразования

x = 60

do
if x > 50 and timer0 < 50 then
stop timer0 : stop timer1 на время преобразования останавливаем таймеры
ch1 = getadc(5) 1 канал опрос АЦП
chvar_1 = ch1
start timer0 : start timer1
any_var = chvar_1 / 2000 2000 - можно задавать изгиб линии
any_var = negativ * any_var
any_var = exp(any_var)
chvar_1 = 1023 - chvar_1
chvar_1 = chvar_1 / 12.035 пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============
any_var = chvar_1 * any_var
chvar_1 = any_var
stop timer0 : stop timer1
if ch1 < 1023 then
if chvar_1 > 0 then channel_1 = chvar_1 присваиваем значения переменных для индикации
if chvar_1 > 85 then channel_1 = 85 верхний предел показаний
else
channel_1 = 0
end if
start timer0 : start timer1
x = 0
end if

if conv_flag = 0 and timer0 < 50 then
1wreset
1wwrite &hcc Выдаем команду чтения ПЗУ
1wwrite &h44 Запуск измерения
set conv_flag
ds_count = 0
end if

if read_flag = 1 and timer0 < 50 then
1wreset
1wwrite &hcc
1wwrite &hbe Команда чтения ОЗУ датчика
bd(1) = 1wread(9)
if bd(9) = crc8(bd(1) , 8) then
bd1 = bd(1) Читаем нулевой байт
bd2 = bd(2) Читаем первый байт
if bd2 >= 248 then
bd1 = &h100 - bd1
bd2 = &hff - bd2
if err = 0 then set minus_flag znak = "-"
else
reset minus_flag znak = "+"
end if
t1 = bd1 / 16 Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
t2 = bd2 * 16 Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
t1 = t1 + t2
t1 = t1 * 10
chvar_2 = t1 отсекаем от температуры все после запятой
if err = 0 then
if chvar_2 > 120 then chvar_2 = 120
channel_2 = chvar_2
end if
reset read_flag
reset conv_flag
end if
end if
if on1 < off1 then если уставка on1 < off1 то режим нагревателя
if channel_1 <= on1 then sostoyanie = 1 если значение первого канала АЦП ниже уставки on1, то включаем нагрузку №1
if channel_1 >= off1 then sostoyanie = 0 если значение первого канала АЦП выше уставки off1, то выключаем нагрузку №1
else если уставка on1 > off1 то режим охладителя
if channel_1 >= on1 then sostoyanie = 1 если значение первого канала АЦП выше уставки on1, то включаем нагрузку №1
if channel_1 <= off1 then sostoyanie = 0 если значение первого канала АЦП ниже уставки off1, то выключаем нагрузку №1
end if

if sostoyanie = 1 then set load1 else reset load1 управление 1м каналом нагрузки

if minus_flag = 0 then
if on2 < off2 then если уставка on2 < off2 то режим нагревателя
if channel_2 <= on2 then sostoyanie_2 = 1 если давление ниже уставки on2, то включаем нагрузку №2
if channel_2 >= off2 then sostoyanie_2 = 0 если давление выше уставки off2, то выключаем нагрузку №2
else если уставка on2 > off2 то режим охладителя
if channel_2 >= on2 then sostoyanie_2 = 1 если давление выше уставки on2, то включаем нагрузку №2
if channel_2 <= off2 then sostoyanie_2 = 0 если давление ниже уставки off2, то выключаем нагрузку №2
end if
end if

if sostoyanie_2 = 1 then set load2 else reset load2 управление 2м каналом нагрузки

loop

*******************************************************************************
Индикация

pulse:
stop timer0
if view_menu <> 0 and error_flag = 0 then incr count если находимся в меню и нет ошибки ввода уставок,то инкриментируем счетчик, который отвечает за автоматический выход из меню (~ через 5 сек)
if count > 7000 then задается время автоматического выхода из меню
count = 0 сброс счетчика
view_menu = 0 выход из меню в основной режим
end if
h = 1 выключаем точку на индикаторе
останавливаем таймер 0
select case view_menu в зависимости от пункта меню, записываем в переменные расчета следующие данные
case 0 :
_print = channel_1 основной режим. 1й индикатор показывает значение АЦП 1го канала
_print_sec = channel_2 основной режим. 2й индикатор показывает значение АЦП 2го канала
case 1 :
_print = on1 1й индикатор показывает значение уставки on1
_print_sec = channel_2 2й индикатор показывает значение АЦП 2го канала
case 2 :
_print = off1 1й индикатор показывает значение уставки off1
_print_sec = channel_2 2й индикатор показывает значение АЦП 2го канала
case 3 :
_print = channel_1 1й индикатор показывает значение АЦП 1го канала
_print_sec = on2 2й индикатор показывает значение уставки on2
case 4 :
_print = channel_1 1й индикатор показывает значение АЦП 1го канала
_print_sec = off2 2й индикатор показывает значение уставки off2
end select

if podskaz_flag = 0 then если не выводим на 1й индикатор подсказки, то работаем с числами
copy_print = _print
copy_var = copy_print
for i = 3 to 1 step -1 цикл в котором разбивается переменная на 3 числа
chislo(i) = copy_print mod 10 заносим в масив последнюю цифру от числа copy_print(123 mod 10 = 3)
copy_print = copy_print / 10 отсекаем последнюю цифру от числа copy_print (123/10=12)
next убираем незначимые нули
if copy_var < 100 then chislo(1) = 11 для 2х значного числа
if copy_var < 10 then chislo(2) = 11 для однозначного числа
end if
if podskaz_flag_sec = 0 then если не выводим на 2й индикатор подсказки, то работаем с числами
copy_print_sec = _print_sec
copy_var = copy_print_sec
for i = 6 to 4 step -1 цикл в котором разбивается переменная на 3 числа
chislo(i) = copy_print_sec mod 10 заносим в масив последнюю цифру от числа _print(123 mod 10 = 3)
copy_print_sec = copy_print_sec / 10 отсекаем последнюю цифру от числа copy_print_sec (123/10=12)
next убираем незначимые нули
if copy_var < 100 then chislo(4) = 11 для 2х значного числа
if copy_var < 10 then chislo(5) = 11 для однозначного числа
if minus_flag = 1 and view_menu < 3 then chislo(4) = 10
end if


if indicator = 0 then Гасим индикаторы перед выводом информации
reset dig1 : reset dig2 : reset dig3 : reset dig1_sec : reset dig2_sec : reset dig3_sec Для индикатора с ОА
else
set dig1 : set dig2 : set dig3 : set dig1_sec : set dig2_sec : set dig3_sec Для индикатора с Оk
end if

incr w : if w > 6 then w = 1 выбираем какую цифру сейчас включать
y = 0
gosub look : a = z переходим к подпрограмме look, которая определяет нужно ли сейчас загорется сегменту А
gosub look : b = z
gosub look : c = z
gosub look : d = z
gosub look : e = z
gosub look : f = z
gosub look : g = z

select case w включаем цифру(разряд) которую выбрали (w). Подаем плюс на общий провод конкретной цифры (разряда)
case 1 :
if indicator = 0 then
set dig3
if podskaz_flag = 0 then h = razryad_1.3 else h = 1
else
reset dig3
if podskaz_flag = 0 then
h = razryad_1.3
toggle h
else
h = 0
end if
end if
case 2 :
if indicator = 0 then
set dig2
if podskaz_flag = 0 then h = razryad_1.2 else h = 1
else
reset dig2
if podskaz_flag = 0 then
h = razryad_1.2
toggle h
else
h = 0
end if
end if
case 3 :
if indicator = 0 then
set dig1
if podskaz_flag = 0 then h = razryad_1.1 else h = 1
else
reset dig1
if podskaz_flag = 0 then
h = razryad_1.1
toggle h
else
h = 0
end if
end if
case 4 :
if indicator = 0 then
set dig3_sec
if podskaz_flag_sec = 0 then h = razryad_2.3 else h = 1
else
reset dig3_sec
if podskaz_flag_sec = 0 then
h = razryad_2.3
toggle h
else
h = 0
end if
end if
case 5 :
if indicator = 0 then
set dig2_sec
if podskaz_flag_sec = 0 then h = razryad_2.2 else h = 1
else
reset dig2_sec
if podskaz_flag_sec = 0 then
h = razryad_2.2
toggle h
else
h = 0
end if
end if
case 6 :
if indicator = 0 then
set dig1_sec
if podskaz_flag_sec = 0 then h = razryad_2.1 else h = 1
else
reset dig1_sec
if podskaz_flag_sec = 0 then
h = razryad_2.1
toggle h
else
h = 0
end if
end if
end select


start timer0
return

look: подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
z = chislo(w) * 7 : z = y + z определяем порядковый номер числа из таблици data. w - это цифра которую будем выводить 1..2..3, y это номер сегмента (a=0 b=1 c=2...g=7)
if indicator = 0 then
z = lookup(z , cifri_oa) выбираем из таблици включить или выключить нужный сегмент -oa
else
z = lookup(z , cifri_ok) -ok
end if
incr y y это номер сегмента (a=0 b=1 c=2...). chislo(w) * 7 - переход на начало нужной строки data.z = y + z - по очереди перебираем сегменты в строке.
return

cifri_oa:
таблица сегментом для индикаторов с общим плюсом |chislo(i)| Символ |
data 0 , 0 , 0 , 0 , 0 , 0 , 1 0
data 1 , 0 , 0 , 1 , 1 , 1 , 1 1
data 0 , 0 , 1 , 0 , 0 , 1 , 0 2
data 0 , 0 , 0 , 0 , 1 , 1 , 0 3
data 1 , 0 , 0 , 1 , 1 , 0 , 0 4
data 0 , 1 , 0 , 0 , 1 , 0 , 0 5
data 0 , 1 , 0 , 0 , 0 , 0 , 0 6
data 0 , 0 , 0 , 1 , 1 , 1 , 1 7
data 0 , 0 , 0 , 0 , 0 , 0 , 0 8
data 0 , 0 , 0 , 0 , 1 , 0 , 0 9
data 1 , 1 , 1 , 1 , 1 , 1 , 0 10 "-"
data 1 , 1 , 1 , 1 , 1 , 1 , 1 11 ""
data 1 , 1 , 1 , 0 , 0 , 0 , 1 12 "l"
data 1 , 1 , 0 , 1 , 0 , 1 , 0 13 "n"
data 0 , 1 , 1 , 1 , 0 , 0 , 0 14 "f"
data 0 , 1 , 1 , 0 , 0 , 0 , 0 15 "e"
data 1 , 1 , 1 , 1 , 0 , 1 , 0 16 "r"

*******************************************************************************
cifri_ok:
таблица сегментом для индикаторов с общим минусом |chislo(i)| Символ |
data 1 , 1 , 1 , 1 , 1 , 1 , 0 0
data 0 , 1 , 1 , 0 , 0 , 0 , 0 1
data 1 , 1 , 0 , 1 , 1 , 0 , 1 2
data 1 , 1 , 1 , 1 , 0 , 0 , 1 3
data 0 , 1 , 1 , 0 , 0 , 1 , 1 4
data 1 , 0 , 1 , 1 , 0 , 1 , 1 5
data 1 , 0 , 1 , 1 , 1 , 1 , 1 6
data 1 , 1 , 1 , 0 , 0 , 0 , 0 7
data 1 , 1 , 1 , 1 , 1 , 1 , 1 8
data 1 , 1 , 1 , 1 , 0 , 1 , 1 9
data 0 , 0 , 0 , 0 , 0 , 0 , 1 10 "-"
data 0 , 0 , 0 , 0 , 0 , 0 , 0 11 "" пусто
data 0 , 0 , 0 , 1 , 1 , 1 , 0 12 "l"
data 0 , 0 , 1 , 0 , 1 , 0 , 1 13 "n"
data 1 , 0 , 0 , 0 , 1 , 1 , 1 14 "f"
data 1 , 0 , 0 , 1 , 1 , 1 , 1 15 "e"
data 0 , 0 , 0 , 0 , 1 , 0 , 1 16 "r"

*******************************************************************************

*******************************************************************************
Опрос кнопок
bootons:
incr x
if conv_flag = 1 and ds_count < 254 then incr ds_count
if ds_count > 160 then
set read_flag
end if
stop timer1
if vibor = 0 and booton_flag = 0 and up = 1 and down = 1 then gosub set_mode Нажатие кнопки УСТ
if set_flag = 1 and vibor = 1 then Кнопки Вверх и Вниз активны только после входа в меню
if up = 0 then gosub up_const
if down = 0 then gosub down_const
end if
if vibor = 0 and up = 0 and view_menu = 0 and booton_flag_2 = 0 then gosub set_h_led1
if vibor = 0 and down = 0 and view_menu = 0 and booton_flag_2 = 0 then gosub set_h_led2

if vibor = 1 and up = 1 and down = 1 then reset booton_flag сброс флага удержания кнопки
if vibor = 1 then reset booton_flag_2
start timer1 : start timer0
return
*******************************************************************************


set_mode:
enable interrupts : enable timer0 : start timer0

set set_flag поднимаем флаг режима настройки уставок (находимся в меню)
set booton_flag поднимаем флаг удержания кнопки (пока не сбросится, в следующий пункт меню не попадаем)
count = 0 сброс счетчика автоматического выхода из меню
if on1 = off1 or on2 = off2 then gosub errors Блокировка ввода уставок. Переходим в подпрограмму индикации ошибки
incr view_menu следующий пункт меню
if view_menu > 4 then view_menu = 0 всего 4 пункта меню, 0й - основной режим

select case view_menu индикация подсказок пунктов меню
case 0 : ---
set podskaz_flag
set podskaz_flag_sec
chislo(1) = 10
chislo(2) = 10
chislo(3) = 10
chislo(4) = 10
chislo(5) = 10
chislo(6) = 10
reset set_flag
waitms 500
stop timer1 : stop timer0
writeeeprom off2 , 14 запись уставки off2 в eeprom

case 1 : on1
set podskaz_flag Поднимаем флаг вывода подсказок (буквы) на 1й индикатор
chislo(3) = 1
chislo(2) = 13
chislo(1) = 0
waitms 500

case 2 : of1
set podskaz_flag Поднимаем флаг вывода подсказок (буквы) на 1й индикатор
chislo(3) = 1
chislo(2) = 14
chislo(1) = 0
waitms 500
stop timer1 : stop timer0
writeeeprom on1 , 0 запись уставки on1 в eeprom

case 3 : on2
set podskaz_flag_sec Поднимаем флаг вывода подсказок (буквы) на 2й индикатор
chislo(6) = 2
chislo(5) = 13
chislo(4) = 0
waitms 500
stop timer1 : stop timer0
writeeeprom off1 , 5 запись уставки off1 в eeprom

case 4 : off2
set podskaz_flag_sec Поднимаем флаг вывода подсказок (буквы) на 2й индикатор
chislo(6) = 2
chislo(5) = 14
chislo(4) = 0
waitms 500
stop timer1 : stop timer0
writeeeprom on2 , 10 запись уставки on2 в eeprom

end select

reset podskaz_flag
reset podskaz_flag_sec
return

errors:
set error_flag поднимаем флаг ошибки
if on1 = off1 then
set podskaz_flag
chislo(1) = 15
chislo(2) = 16 Выводим подсказку err и мигаем на 1м индикаторе
chislo(3) = 16
waitms 500
chislo(1) = 11
chislo(2) = 11
chislo(3) = 11
waitms 500
chislo(1) = 15
chislo(2) = 16
chislo(3) = 16
waitms 500
chislo(1) = 11
chislo(2) = 11
chislo(3) = 11
waitms 500
end if
if on2 = off2 then
set podskaz_flag_sec
chislo(4) = 15
chislo(5) = 16 Выводим подсказку err и мигаем на 2м индикаторе
chislo(6) = 16
waitms 500
chislo(4) = 11
chislo(5) = 11
chislo(6) = 11
waitms 500
chislo(4) = 15
chislo(5) = 16
chislo(6) = 16
waitms 500
chislo(4) = 11
chislo(5) = 11
chislo(6) = 11
waitms 500
end if
select case view_menu взависимости от того, в каком пункте меню ввели неверное значение
case 0 : возвращаем из eeprom предыдущие значения
case 1 :
readeeprom on1 , 0
case 2 :
readeeprom off1 , 5
case 3 :
readeeprom on2 , 10
case 4 :
readeeprom off2 , 14
end select
decr view_menu возвращаемся в предыдущий пункт меню (в ошибочный)
count = 0 : reset error_flag
return

up_const:
enable interrupts : enable timer0 : start timer0
count = 0
select case view_menu
case 1 :
if on1 < 85 then incr on1
case 2 :
if off1 < 85 then incr off1
case 3 :
if on2 < 120 then incr on2
case 4 :
if off2 < 120 then incr off2
end select
waitms 30
return


down_const:
enable interrupts : enable timer0 : start timer0
count = 0
select case view_menu
case 1 :
if on1 > 0 then decr on1 добавляется второе условие при работе с отрицательными числами
case 2 :
if off1 > 0 then decr off1
case 3 :
if on2 > 0 then decr on2
case 4 :
if off2 > 0 then decr off2
end select
waitms 30
return


set_h_led1:
set booton_flag_2
rotate razryad_1 , left
stop timer1 : stop timer0
writeeeprom razryad_1 , 16
return


set_h_led2:
set booton_flag_2
rotate razryad_2 , left
stop timer1 : stop timer0
writeeeprom razryad_2 , 17
return
 

Файлы; исходник , нех, proteus.

АРХИВ: Скачать с сервера
Раздел: [Устройства на микроконтроллерах]

Сохрани статью в:

Оставь свой комментарий или вопрос:


Тясячи схем в категориях:
-> Прочее
-> Измерительная техника
-> Приборы
-> Схемыэлектрооборудования
-> Источники питания (прочие полезные конструкции)
-> Теоретические материалы
-> Справочные материалы
-> Устройства на микроконтроллерах
-> Зарядные устройства (для батареек)
-> Зарядные устройства (для авто)
-> Преобразователи напряжения (инверторы)
-> Все для кулера (Вентилятора)
-> Радиомикрофоны, жучки
-> Металоискатели
-> Регуляторы мощности
-> Охрана (Сигнализация)
-> Управление освещением
-> Таймеры (влажность, давление)
-> Трансиверы и радиостанции
-> Конструкции для дома
-> Конструкции простой сложности
-> Конкурс на лучшую конструкцию на микроконтроллерах
-> Конструкции средней сложности
-> Стабилизаторы
-> Усилители мощности низкой частоты (на транзисторах)
-> Блоки питания (импульсные)
-> Усилители мощности высокой частоты
-> Приспособления для пайки и конструирования плат
-> Термометры
-> Борт. сеть
-> Измерительные приборы (тахометр, вольтметр итд)
-> Железо
-> Паяльники ипаяльные станции
-> Радиопередатчики
-> Вспомогательные устройства
-> Телевизионная техника
-> Регуляторы тембра, громкости
-> Блоки питания (лабораторные)
-> Усилители мощности низкой частоты (на микросхемах)
-> Другие устройства для усилителей
-> Cветовое оформление новогодней ёлки или праздничного зала
-> Глушилки
-> Телефонные жуки
-> Инфракрасная техника
-> Медицинская техника
-> Телефония
-> Для животного мира
-> Конструируем усилители
-> Антенны и усилители к ним
-> Звонки
-> Электронные игрушки
-> Усилители мощности низкой частоты (ламповые)
-> Управление двигателями (питание от однофазной сети)
-> Программаторы микроконтроллеров
-> Сверлилки
-> Изучаем микроконтроллеры
-> Радиоприемники
-> Сигнализации
-> Сотовая связь
-> USB-устройства
-> Блоки питания (трансформаторные)
-> Радиостанции простые в изготовлении
-> Источники питания (для усилителей)
-> Прочеее
-> защита от короткого замыкания (электронные предохранители)
-> Зарядные устройства (для радиостанций)
-> Мигалки
-> Cварочное оборудование
-> Кодовые электронные замки
-> Блоки питания (бестрансформаторные)
-> Часы
-> Управление поворотниками
-> Зажигание
-> Управление водой (насосы для скважин или колодцев, полив растений)
-> Моделирование
-> Блоки управления стеклоочистителями
-> Предварительные усилители
-> Защита от перегрузки и перегрева
-> Динамики
-> Ремонт бытовой техники
-> Дистанционное управление компьютером
-> Акустические микрофоны и преобразователи
-> Спутниковое ТВ
-> Gsm антенны, примочки, усилители, ретрансляторы.
-> Пищалки
-> Роботы
-> Ретрансляторы
-> Паяльники и паяльные станции
-> Звуковые сигнализаторы
-> Рули и джойстики
-> Схемы электрооборудования
-> Все для "кулера" (Вентилятора)
-> Работа с BGA микросхемами
-> Фильтры
-> Сабвуферы
Рейтинг@Mail.ru