Шаг3. Пишем FM тюнер
____________________________________


Ниже приводится описание исходного кода простого примера FM_TUNER демонстрирующего процесс управления настройкой радиоприёмника согласно изменяемому цифровому коду 0..255 с выхода 888 ($378) LPT порта компьютера.

Программа позволяет изменять частоту настройки тюнера с помощью ползунка на панели или стрелок влево-вправо на клавиатуре, производить автоматическое сканирование диапазона, изменять скорость сканирования, вести плавную пошаговую настройку кнопками "+" или "-". Имеется возможность включения - выключения приёмника кнопкой "Power", выключения звука кнопкой "MUTE"(порт 890 бит 0 и бит 3 переводятся в высокое 5в/низкое 0в состояние). Предусмотрена возможность выдачи инвертированного кода 255..0 для удобства сопряжения с цифроаналоговым (АЦП) преобразователем. Также показано как вести LOG радиостанций и отслеживать изменения данных в виде текстового лога. Предусмотрен вариант фиксированных настроек с помощью ComboBox и таймер автоматического выключения в минутах.

К сожалению, я имею мало времени, чтобы подробно всё расписывать, поэтому приводится код и краткие коментарии. Код очень простой и не представляет чего-либо сложного или нестандартного, просмотрите его, а если Вас заинтересует - скачайте данный пример и разберитесь, наращивая дальнейшие возможности программы самостоятельно.(Например добавте процедуру остановки сканирования при обнарудении определённого числа на входе (889 порт)). Выбрать число удобно предварительно запустив программу PortControl V3+ .

< FM тюнер .

procedure TForm1.TrackBar1Change(Sender: TObject); //--настройка на радиост.(0..256)

Var

b : byte;

begin

b := TrackBar1.Position ; //--задаём число записи в порт (0..256)

if CheckBox2.Checked = true then b := Not b; //--если галочка, тогда инвертируем (256..0)

PortWriteByte(888,(b)); //--собственно пишем

Gauge1.Progress := b; //--синхронизируем с индикатором настройки

end;


procedure TForm1.Timer1Timer(Sender: TObject); //--читаем данные выбранного порта

Var

pa : integer;

b : byte;

begin

pa:= StrToInt(ComboBox1.Text); //--выбираем порт

b :=( PortReadByte(pa) ) ; //--читаем

Edit1.text := IntToStr(b); //--выводим на индикатор

end;


procedure TForm1.Edit1Change(Sender: TObject); //--ведём LOG данных

begin

if CheckBox1.Checked = true then

begin

RichEdit1.Lines.Add //--добавляем в лог время + данные

( FormatDateTime('hh:mm:ss', time()) + ' data '+ (Edit1.Text) );

end;

end;


procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

TrackBar1.Position := TrackBar1.Position +1; //-- +1

end;


procedure TForm1.SpeedButton2Click(Sender: TObject);

begin

TrackBar1.Position := TrackBar1.Position -1; //-- -1

end;


procedure TForm1.ComboBox2Click(Sender: TObject); //--демонстрирует выбор предопр. значений

Var

ind : integer;

begin

RichEdit1.Lines.Add

( FormatDateTime('hh:mm:ss', time()) + ' радио '+ (ComboBox2.Text) ); //--время + название

ind := ComboBox2.ItemIndex;

if ind = 0 then TrackBar1.Position := 10 ; //--значению 1 (Хит FM) соотв. число 10

if ind = 1 then TrackBar1.Position := 23 ; //--аналогично

if ind = 2 then TrackBar1.Position := 58 ;

if ind = 3 then TrackBar1.Position := 94 ;

if ind = 4 then TrackBar1.Position := 204 ;

end;


procedure TForm1.SpeedButton6Click(Sender: TObject); //--кнопка Power

begin

if SpeedButton6.Tag = 0 then //--чтобы определить состояние

begin

SpeedButton6.Font.Color := clRed;

Gauge1.BackColor := clLime;

PortWriteByte(890,58); //--устанавливаем 5в бит 0 порта 890

SpeedButton6.Tag :=1;

end else

begin

SpeedButton6.Font.Color := clWindowText;

Gauge1.BackColor := clWindow;

PortWriteByte(890,59); //--устанавливаем 0в бит 0-3 порта 890 (Power OFF)

SpeedButton6.Tag := 0;

end ;

 

end;


procedure TForm1.SpinEdit1Change(Sender: TObject);

begin

Timer2.Interval := SpinEdit1.Value * 60000; //-- интервал таймера выключения

end;


procedure TForm1.FormActivate(Sender: TObject);

begin

Timer2.Interval := SpinEdit1.Value * 60000; //-- аналогично

end;


procedure TForm1.SpeedButton3Click(Sender: TObject); //--ВКЛ таймер отключения

begin

Timer2.Enabled := true;

SpinEdit1.Color := cllime;

end;


procedure TForm1.SpeedButton4Click(Sender: TObject); //--ОТКЛ таймер отключения

begin

Timer2.Enabled := false;

SpinEdit1.Color := clWindow;

end;


procedure TForm1.Timer2Timer(Sender: TObject); //--таймер отключения

begin

PortWriteByte(890,59);

close;

end;


procedure TForm1.SpeedButton5Click(Sender: TObject); //--кнопка MUTE

Var

b : byte;

begin

if SpeedButton5.Tag = 0 then

begin

b:=(PortReadByte(890)); //--читаем значения данных в 890 порт

b := b - 8; //--из прочитанного числа вычитаем 8 (бит 3 =5вPin 17) 8 -это 2* в степени N

PortWriteByte(890,b); //--пишем нужное число

SpeedButton5.Font.Color := clRed;

SpeedButton5.Tag := 1;

end else

begin

b:=(PortReadByte(890));

b := b + 8; //--устанавливаем в 0вольт

PortWriteByte(890,b);

SpeedButton5.Font.Color := clWindowText;

SpeedButton5.Tag := 0;

end ;

end;


procedure TForm1.TrackBar2Change(Sender: TObject);

begin

Timer3.Interval := TrackBar2.Position; //--скорость сканирования

end;


procedure TForm1.Timer3Timer(Sender: TObject);

begin

TrackBar1.Position := TrackBar1.Position +1; //--сканируем

if TrackBar1.Position = 255 then TrackBar1.Position := 1 ; //--ограничитель

end;


procedure TForm1.SpeedButton8Click(Sender: TObject);

begin

Timer3.Enabled := false; //--отключ сканирование

end;


procedure TForm1.SpeedButton7Click(Sender: TObject);

begin

Timer3.Enabled := true; //--включить сканирование

end;

---------------------------------------------25.04.04-----------------------------------------------------------------------



Скачайте этот пример (исходник 13 kb) - Primer3cod.zip , созданный на основе шаблона.

Назад на Шаг1. Поля ввода номера порта и данных
Назад на Шаг2. Взаимодействие органов управления - пример PortDemoControl.


О проекте

Скачать шаблон - Shablon.zip (6 kb)
Скачать исходник FM_TUNER + EXE файл - Primer3.zip (203 kb)

******

Валерий Ковтун US4LEH
..

О сайте

Вернуться на главную страницу
Программа PortControl V3+
Программа PinRegistrator D1+


Гостевая книга
Обратная связь