Mục tiêu:
- Viết được đoạn chương trình cơ sở dùng cho giao diện đa năng nối tiếp
Hình 6.1 chỉ ra sơ đồ khối của một giao diện với tám lối ra số, tám lối vào số, một lối vào analog và một lối và đếm. Tồn bộ ba thanh ghi dịch dùng để nhập vào và xuất ra cĩ thể được điều khiển bằng một đường dẫn giữ nhịp và đồng bộ (strobe) chung.
Hình 6.1: Một giao diện nối tiếp đa năng
Việc nhập vào và xuất ra cĩ thể được thực hiện đồng thời, bởi vì một đường dẫn giữ nhịp chung được sử dụng cho tất cả các vi mạch. Thủ tục “Trao đổi” trong đoạn chương trình 6.1 đảm nhận việc truyền dữ liệu theo hai hướng. Mỗi lời gọi lại phục hồi trạng thái lối ra của vi mạch 4094 và đồng thời đọc ra
các trạng thái của các lối vào số và bộ biến đổi A/D. Tất cả dữ liệu sắp xếp trong các biến tồn cục Dout (lối ra sơ), Din (lối vào số) và Ain (lối vào analog)
Ngồi ra, lối vào tự do CTS được sử dụng để đo tần số. Ở đây thời gian mở cổng được thiết lập cố định là 100 ms, vì vậy cĩ thể nhận được độ phân giải về tần số bằng 10 Hz. Khi ta đấu vào trước đĩ một bộ biến đổi điện áp/ Tần số, thì giao diện cĩ thể được sử dụng với hai lối vào analog.
Đoạn chương trình 8-1: Chương trình cơ sở dùng cho giao diện đa năng nối tiếp Unit Unil
Interface
Uses PORTINC
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
Type
Tform1 = class (TForm)
CheckBox1 : TcheckBox; CheckBox2 : TcheckBox; CheckBox3 : TcheckBox; CheckBox4 : TcheckBox; CheckBox5 : TcheckBox; CheckBox6 : TcheckBox; CheckBox7 : TcheckBox; CheckBox8 : TcheckBox; Labell : TLabel; Label2 : TLabel; Label3: TLabel; Label4 : TLabel; Label5 : TLabel; Label6 : TLabel; Label7 : TLabel; Label8 : TLabel; Timer1 : TTimer; Label9 : TLabel; CheckBox10 : TCheckBox; CheckBox11 : TCheckBox; CheckBox12 : TCheckBox; CheckBox13 : TCheckBox; CheckBox14 : TCheckBox; CheckBox15 : TCheckBox; CheckBox16 : TCheckBox; Label10 : TLabel; Edit1 : TEdit; Label11 : TLabel; Edit2 : TEdit;
Label12 : TLabel;
Procedure FromCreate(Sender : TObject); Procedure Timer1TTimer(Sender : TObject); End;
Var
Form1: TForm1; Dout, Din, Ain: Byte; Implementation
{$R *.DFM}
Procedure Trao_doi;
Var Vi_tri, Vi_triAD, r, m : Integer; Begin RTS(1); Delayus(20); RTS(0); Vi_tri := 1; Vi_triAD := 128; Din := 0; Alin := 0; For n:=1 to 8 do begin
If ((Dout AND Vi_tri) > 0) then TXD (1) {xuất ra dữ liệu} Else TXD (0);
If DCD = 1 { đọc dữ liệu} Then Din := Din + Vi_tri; If DSR = 1 then {đọc A/D}
Alin := Alin + Vi_triAD; DTR (1); {Clock tới} Delayus (20); {Gây trễ} DTR (0); {Clock tắt} Vi_tri := Vi_tri *2;
Vi_triAD :=Vi_triAD div 2; End; RTS(1); {Strobe tới} Delayus(20) {Gây trễ} RTS(0); {Strobe} End; Function Tan_so:Integer;
Var Bo_dem, Cu, Nhap_vao:Integer; Cu:Cũ Begin
Bo_dem:=0;
ReCuime (true); TimeInitus;
While TimeReadus<(100000) do begin Nhap_vao:=CTS;
If Nhap_vao>Cu then Bo_dem:=Bo_dem +1; Cu:=Nhap_vao;
End;
Tan_so:=Bo_dem; ReCuime (false); End;
Procedure TForm1.FormCreate (Sender: TObject); Begin
OpenCom (pchar (‘com2:9600, N, 8, 1’)) Timer1.Interval :=100;
Timer1.Enabled :=true; End;
Procedure TForm1.Timer1Timer(Sender: TObject); Var Gia_tri: Word;
Dien_ap: Real; Begin
Dout :=0;
If CheckBox1.Checked Then Dout := Dout +1; If CheckBox2.Checked Then Dout := Dout +2; If CheckBox3.Checked Then Dout := Dout +4; If CheckBox4.Checked Then Dout := Dout +8;
If CheckBox5.Checked Then Dout := Dout +16; If CheckBox6.Checked Then Dout := Dout +32; If CheckBox7.Checked Then Dout := Dout +64; If CheckBox8.Checked Then Dout := Dout +128; Trao_doi;
CheckBox9.Checked := ((Din And 1)>0); CheckBox10.Checked := ((Din And 2)>0); CheckBox11.Checked := ((Din And 4)>0); CheckBox12.Checked := ((Din And 8)>0); CheckBox13.Checked := ((Din And 16)>0); CheckBox14.Checked := ((Din And 32)>0); CheckBox15.Checked := ((Din And 64)>0); CheckBox16.Checked := ((Din And 128)>0); Dien_ap :=Alin/255*5;
Edit1.Text :=FloatToStrF (Dien_ap, ffGeneral,3,2) +’ V’; Edit2.Text :=FloatToStrF (Tan_so*10, ffGeneral,4,0) +’ Hz’; End;