[PortCoding] Шаг3. Пишем FM тюнер

Автор: | 20.01.2014

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

Ниже приводится описание исходного кода простого примера FM_TUNER демонстрирующего процесс управления настройкой радиоприёмника согласно изменяемому цифровому коду 0..256 с выхода 888 ($379) LPT порта компьютера.
Программа позволяет изменять частоту настройки тюнера с помощью ползунка на панели или стрелок влево-вправо на клавиатуре, производить автоматическое сканирование диапазона, изменять скорость сканирования, вести плавную пошаговую настройку кнопками “+” или “-“. Имеется возможность включения – выключения приёмника кнопкой “Power”, выключения звука кнопкой “MUTE”(порт 890 бит 0 и бит 3 переводятся в высокое 5в/низкое 0в состояние). Предусмотрена возможность выдачи инвертированного кода 255..0 для удобства сопряжения с цифро аналоговым (АЦП) преобразователем. Также показано как вести LOG радиостанций и отслеживать изменения данных в виде текстового лога. Предусмотрен вариант фиксированных настроек с помощью ComboBox и таймер автоматического выключения в минутах.
К сожалению, я имею мало времени, чтобы подробно всё расписывать, поэтому приводится код и краткие комментарии. Код очень простой и не представляет чего-либо сложного или нестандартного, просмотрите его, а если Вас заинтересует – скачайте данный пример и разберитесь, наращивая дальнейшие возможности программы самостоятельно.(Например добавьте процедуру остановки сканирования при обнарудении определённого числа на входе (889 порт)). Выбрать число удобно предварительно запустив программу PortControl V3+ .

tuner.jpg

[pas]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;[/pas]

Скачайте этот пример (исходник 13 kb) – Primer3cod.zip