Xưởng điện tử Bài 6: Lập trình Thực tập công nhân Trang 28 begin MemoEditor.Lines.LoadFromFile(editFileName.Text); isModified:=False; end; procedure TForm1.buttSaveClick(Sender: TObject); begin if isModified then MemoEditor.Lines.SaveToFile(editfilename.Text); end; procedure TForm1.MemoEditorChange(Sender: TObject); begin isModified:=true; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if ismodified then if MessageBox(handle,'Do you want to save file','Warning',MB_YESNO)=ID_YES then ButtSaveClick(Sender); end; procedure TForm1.Button3Click(Sender: TObject); begin MemoEditor.Lines.Clear; end; procedure TForm1.editFileNameChange(Sender: TObject); begin end; end. Sau khi nhấn F9 ta có Xưởng điện tử Bài 6: Lập trình Thực tập công nhân Trang 29 2.2.6. Trình đơn chính (MainMenu) Trình đơn là đối tượng đồ họa bạn thường thấy và rất hay dùng trong các chương trình ứng dụng. Trình đơn chính (main menu) là một dãy các lựa chọn nằm phía trên cửa sổ. Khi click chuột vào một lựa chọn nào đó, bạn sẽ nhận được danh sách các mục chọn khác sổ xuống. Chọn một mụ trên trình đơn, cũng đồng nghĩa với việc yêu cầu chương trình thực hiện một tác vụ nào đó. Đối tượng của trình đơn chính Delphi đặt tên là TMAINMENU Dưới đây là các bước hướng dẫn bạn cách xây dựng một thanh trình đơn chính cho cửa sổ Form. • Chọn File/ New Application, đặt lên Form đối tượng trình đơn TmainMenu. • Để xây dựng các mục chọn trình đơn, bạn hãy kích chuột vào đối tượng TmainMenu, hoặc chọn thuộc tính Items từ cửa sổ Object Inspector. Delphi sẽ hiển thị cửa sổ thiết kế trình đơn cho phép bạn nhập vào từng mục chọn. • Bạn bắt đầu nhập vào tiêu đề cho từng mục chọn bằng cách thay đổi thuộc tính caption trong cửa sổ Object Inspector. Delphi sẽ tự tạo ra một mục chọn rỗng tiếp theo để bạn có thể thêm vào mục chọn mới. Mỗi mục chọn được xem là một đối tượng có tên gọi là TMENUITEM. • Để chọn trình đơn con cho một mục chọn, bạn nhấn phím phải chuột vào mục chọn để Delphi hiện thị chương trình đơn tắt, tiếp theo hãy chọn Create Submenu để tạo trình đơn con. 2.2.7. Đối tượng Timer Có lẽ, Timer là thành phần có ít thuộc tính và phương thức xử lý nhất, trong số những thành phần VCL do Delphi cung cấp. Tuy nhiên , Timer là thành đối tượng hữu dụng và rất thú vị. Timer do Delphi đặt trên bảng công cụ System. Timer được xem là thành phần VCL không trực quan,, bởi vì bạn không nhìn thấy lúc chương trình thực thi. Thay vào đó, Timer hoạt động phía sau hậu trường. Nó được dùng để đếm gian. Nếu có khoảng thời gian nào đó trôi qua, mã lệnh đặt Xưởng điện tử Bài 6: Lập trình Thực tập công nhân Trang 30 trong phương thức xử lý tình huống OnTimer sẽ được gọi thực thi. Nếu Tiẻ vẫn còn hiệu lực thì OnTimer sẽ được thực thi đều đặn. Timer được Delphi dặt lớp đối tượng có tên TTIMER Thuộc tính thường được sử dụng nhất của Timer là Thuộc tính Ý nghĩa Interval Khoảng thời gian định kỳ của Timer được Windows cho phép hoạt động. Giá trị Interval được tính bằng 1/1000 giây. Interval =1000 tương đương với khoảng thời gian 1 giây. Enabled TRUE: Timer ở trạng thái hoạt động. FALSE: Timer đặt ở trạng thái vô hiệu lực. Vi dụ trình hiển thị thời gian. procedure TForm1.FormCreate(Sender: TObject); begin caption:=TimeTostr(now()); end; Kết quả. 2.2.8. Đối tượng Comport Đây là thành phần Delphi dùng để giao tiếp với thiết bị bên ngoài thông qua cổng Com. Comport được Delphi dặt lớp đối tượng có tên TCOMPORT Tình huống thường được sử dụng của đối tượng TCOMPORT là OnAfterClose ( đóng cổng Com), OnAfterOpen ( mở cổng Com), OnRxChar (nhận dữ liệu từ cổng Com). Ví dụ: Viết một chương trình xuất nhập dữ liệu thông qua cổng Com Chọn File/New Application từ trình đơn đặt Form1 đối tượng Tedit, 1 đối tượng Tmemo, 5 đối tượng Tbutton thiết lập tình huống và phương thức xử lý từng đối tượng như sau: Đối tượng Thuột tính Giá trị TFORM Name Caption Form1 Delphi Notepad TMEMO Name Lines(…) Memo1 Xóa trắng TEDIT Name Edit1 Xưởng điện tử Bài 6: Lập trình Thực tập công nhân Trang 31 Tex Xóa trắng TBUTTON Name Caption ButtonOpen Open TBUTTON Name Caption ButtonSetting Setting TBUTTON Name Caption ButtonSend Send TBUTTON Name Caption ButtonClear Clear TBUTTON Name Caption ButtonExit Exit TCOMPORT Name OnRxChar Comport ComportRxChar unit cong; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, CPort; type TForm1 = class(TForm) Panel1: TPanel; Memo1: TMemo; ButtonOpen: TButton; Edit1: TEdit; ButtonSend: TButton; ButtonExit: TButton; ComPort: TComPort; ButtonSettings: TButton; ButtonClear: TButton; procedure ButtonExitClick(Sender: TObject); procedure ButtonOpenClick(Sender: TObject); procedure ButtonSettingsClick(Sender: TObject); procedure ButtonSendClick(Sender: TObject); procedure ComportRxChar(Sender: TObject; Count: Integer); procedure ButtonClearClick(Sender: TObject); procedure Memo1Change(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Xưởng điện tử Bài 6: Lập trình Thực tập công nhân Trang 32 implementation {$R *.DFM} // Đóng cổng Com và exit chương trình procedure TForm1.ButtonExitClick(Sender: TObject); begin Comport.Close; Close; end; // Đóng mở Cổng Com procedure TForm1.ButtonOpenClick(Sender: TObject); begin if ComPort.Connected then // Kiểm tra cổng Com có mở không begin Comport.Close; // Nếu mở thì ta đóng cổng lại và hiển thị ‘ Close’ ButtonOpen.Caption:='Close'; end else begin Comport.Open; ButtonOpen.Caption:='Open'; end; end; // Đặt các tham số cho cổng Com procedure TForm1.ButtonSettingsClick(Sender: TObject); begin Comport.ShowSetupDialog; Comport.Open; end; // Gửi dữ liệu ra cổng Com procedure TForm1.ButtonSendClick(Sender: TObject); var i: byte; s: string; begin if edit1.Text='' then exit; s:=chr(strtoint(edit1.Text)); // s:=edit1.text; for i:=1 to length(s) do comport.WriteStr(s[i]); //Nhận dữ liệu từ Edit1 ghi ra cổng Com end; // Nhận dữ liệu từ cổng com xuất ra Memo1 procedure TForm1.ComportRxChar(Sender: TObject; Count: Integer); var str:string; begin Xưởng điện tử Bài 6: Lập trình Thực tập công nhân Trang 33 comport.ReadStr(str,count); //Memo1.Text := Memo1.Text + str; Memo1.Text := inttostr(ord(str[1])); end; // Xóa vùng Memo1 procedure TForm1.ButtonClearClick(Sender: TObject); begin Memo1.Lines.Clear; end; procedure TForm1.Memo1Change(Sender: TObject); begin end; end. Khi chạy chương trình ta được. III. PHẦN THỰC TẬP CỤ THỂ • Viết chương trình xuất nhập dữ liệu. - Giới thiệu về tổ thực tập - Thiết lập cổng com - Đóng, mở cổng - Gửi dữ liệu ra cổng COM - Nhận dữ liệu từ cổng COM và hiển thị *. Yêu cầu sinh viên thao tác nhanh, trang trí đẹp. Xưởng điện tử Bài 7:Giám sát và điều khiển Thực tập công nhân Trang 34 BÀI 7 GIÁM SÁT VÀ ĐIỀU KHIỂN THIẾT BỊ I. MỤC ĐÍCH YÊU CẦU - Hiện nay, vi xử lý và vi điều khiển đóng vai trò rất quan trọng trong lĩnh vực điều khiển tự động. Các bộ điều khiển dùng linh kiện rời dần dần được thay thế bởi các bộ điều khiển dùng vi xử lý. Mặc dù đã được học các vấn đề cơ bản như quét bàn phím, quét bảng đèn, điều khiển động cơ bước, điều rộng xung,… tuy nhiên đa số sinh viên đều gặp nhiều khó khăn khi phải phối hợp các lý thuyết cơ bản trên để được chương trình hoàn chỉnh điều khiển một đối tượng cụ thể. Mục đích của bài thực hành này giúp sinh viên làm quen với vi điều khiển thông dụng hiện nay và ứng dụng chúng để điều khiển các đối tượng cụ thể. Bài thực hành tập trung vào phương pháp thiết kế chương trình sao cho dễ sửa chữa, mở rộng. - Bài thực hành này yêu cầu sinh viên phải biết trước cấu tạo và lập trình 89C51 II. NỘI DUNG 1. Kiến trúc của vi điều khiển 8951. 2. IC vi điều khiển 8951 thuộc họ MCS51 có các đặc điểm sau : + 4 kbyte Flash. U1 AT89C51 9 18 19 29 30 31 1 2 3 4 5 6 7 8 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 39 38 37 36 35 34 33 32 RST XTAL2 XTAL1 PSEN ALE/PROG EA/VPP P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 Xưởng điện tử Bài 7:Giám sát và điều khiển Thực tập công nhân Trang 35 + 128 byte RAM + 4 port I/0 8 bit + Hai bộ định thời 16 bits + Giao tiếp nối tiếp + 64KB không gian bộ nhớ chương trình ngoài + 64 KB không gian bộ nhớ dữ liệu ngoài a.Port0: là port có 2 chức năng, ở trên chân từ 32 đến 39 của MC 8951. Trong các thiết kế cỡ nhỏ không dùng bộ nhớ ngoài, P0 được sử dụng như là những cổng I/O. Còn trong các thiết kế lớn có yêu cầu một số lượng đáng kể bộ nhớ ngoài thì P0 trở thành các đường truyền dữ liệu và 8 bit thấp của bus địa chỉ. b. Port1: là một port I/O chuyên dụng, trên các chân 1-8 của MC8951. Chúng được sử dụng với một múc đích duy nhất là giao tiếp với các thiết bị ngoài khi cần thiết. c. Port2: là một cổng có công dụng kép trên các chân 21 – 28 của MC 8951. Ngoài chức năng I/O, các chân này dùng làm 8 bit cao của bus địa chỉ cho những mô hình thiết kế có bộ nhớ chương trình ROM ngoài hoặc bộ nhớ dữ liệu RAM có dung lượng lớn hơn 256 byte. d. Port3: là một cổng có công dụng kép trên các chân 10 – 17 của MC 8951. Ngoài chức năng là cổng I/O, những chân này kiêm luôn nhiều chức năng khác nữa liên quan đến nhiều tính năng đặc biệt của MC 8951, được mô tả trong bảng sau: Bit Tên Chức năng chuyển đổi P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 RxD TxD 0INT 1INT T0 T1 ÖW R RD Ngõ vào dữ liệu nối tiếp. Ngõ xuất dữ liệu nối tiếp. Ngắt ngoài 0. Ngắt ngoài 1. Ngõ vào TIMER 0. Ngõ vào của TIMER 1. Điều khiển ghi dữ liệu lên bộ nhớ ngoài. Điều khiển đọc bộ nhớ dữ liệu ngoài. Bảng 2.1 : Chức năng của các chân trên port3 e. PSEN (Program Store Enable): 8951 có 4 tín hiệu điều khiển, PSEN là tín hiệu ra trên chân 29. Nó là tín hiệu điều khiển để cho phép truy xuất bộ nhớ chương trình mở rộng và thường được nối đến chân OE (Output Enable) của một EPROM để cho phép đọc các byte mã lệnh của chương trình. Tín hiệu PSEN ở mức thấp trong suốt phạm vi quá trình của một lệnh. Các mã nhị phân của chương trình được đọc từ EPROM qua bus và được chốt vào thanh ghi lệnh của 8951 để giải mã lệnh. Khi thi hành chương trình trong ROM nội PSEN sẽ ở mức cao. Xưởng điện tử Bài 7:Giám sát và điều khiển Thực tập công nhân Trang 36 f. ALE (Address Latch Enable ): Tín hiệu ra ALE trên chân 30 tương hợp với các thiết bị làm việc với các xử lý 8585, 8088. 8951 dùng ALE để giải đa hợp bus địa chỉ và dữ liệu, khi port 0 được dùng làm bus địa chỉ/dữ liệu đa hợp: vừa là bus dữ liệu vừa là byte thấp của địa chỉ 16 bit . ALE là tín hiệu để chốt địa chỉ vào một thanh ghi bên ngoài trong nữa đầu của chu kỳ bộ nhớ. Sau đó, các đường Port 0 dùng để xuất hoặc nhập dữ liệu trong nữa sau chu kỳ của chu kỳ bộ nhớ. Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể được dùng là nguồn xung nhịp cho các hệ thống. Nếu xung trên 8951 là 12MHz thì ALE có tần số 2MHz. Chân này cũng được làm ngõ vào cho xung lập trình cho EPROM trong 8951. g. EA (External Access): Tín hiệu vào EA trên chân 31 thường được nối lên mức cao (+5V) hoặc mức thấp (GND). Nếu ở mức cao, 8951 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp (4K). Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng. Người ta còn dùng chân EA làm chân cấp điện áp 21V khi lập trình cho EPROM trong 8951. h. RST (Reset): Ngõ vào RST trên chân 9 là ngõ reset của 8951. Khi tín hiệu này được đưa lên mức cao (trong ít nhất 2 chu kỳ máy), các thanh ghi trong 8951 được đưa vào những giá trị thích hợp để khởi động hệ thống. i.OSC: 8951 có một bộ dao động trên chip, nó thường được nối với thạch anh giữa hai chân 18 và 19. Tần số thạch anh thông thường là 12MHz. j. POWER: 8951 vận hành với nguồn đơn +5V ( 20%. Vcc được nối vào chân 40 và Vss (GND) được nối vào chân 20. 2. Tìm hiểu về tập lệnh của 89C51. Một số lệnh thường gặp. ACALL addr11 : Gọi chương trình con(gọi đến địa chỉ tuyệt đối). Mô tả: ACALL gọi không điều kiện một chương trình con đặt tại địa chỉ được chỉ ra trong lệnh. Lệnh này tăng nội dung của PC bởi 2 để PC chứa địa chỉ của lệnh kế lệnh ACALL, sau đó cất nội dung 16 bit của PC vào stack(Byte thấp cất trước) và tăng con trỏ stack SP bởi 2. Do vậy chương trình con được gọi phải được bắt đầu trong cùng khối 2K của bộ nhớ chương trình với Byte đầu tiên của lệnh theo sau lệnh ACALL. Các cờ khong bị ảnh hưởng. LCALL addr16 : Gọi chương trình con. Chương trình con được gọi phải được bắt đầu trong cùng khối 64K của bộ nhớ chương trình với Byte đầu tiên của lệnh theo sau lệnh LCALL. Các cờ khong bị ảnh hưởng. ADD A,<src-byte>: Cộng Mô tả: ADD Cộng nội dung của một byte ở địa chỉ được chỉ ra trong lệnh với nội dung thanh chứa và đặt kết quả vào thanh chứa. ADD có 4 kiểu định địa chỉ cho toán hạn nguồn: thanh ghi, trực tiếp, thanh ghi gián tiếp hoặc tức thời. AJMP addr11: Nhảy đến địa chỉ tuyệt đối. Đích nhảy đến phải trong cùng khối 2K của bộ nhớ chương trình với byte đầu tiên của lệnh theo sau lệnh AJMP. . U1 AT89C51 9 18 19 29 30 31 1 2 3 4 5 6 7 8 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 39 38 37 36 35 34 33 32 RST XTAL2 XTAL1 PSEN ALE/PROG EA/VPP P1.0 P1.1 P1.2 P1.3 P1 .4 P1.5 P1.6 P1.7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2 .4/ A12 P2.5/A13 P2.6/A 14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3 .4/ T0 P3.5/T1 P3.6/WR P3.7/RD P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0 .4/ AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 Xưởng điện tử Bài 7:Giám sát và điều khiển Thực tập công nhân Trang 35 + 128 byte RAM + 4 port I/0 8 bit + Hai bộ định thời. lệnh đặt Xưởng điện tử Bài 6: Lập trình Thực tập công nhân Trang 30 trong phương thức xử lý tình huống OnTimer sẽ được gọi thực thi. Nếu Tiẻ vẫn còn hiệu lực thì OnTimer sẽ được thực thi đều. thị *. Yêu cầu sinh viên thao tác nhanh, trang trí đẹp. Xưởng điện tử Bài 7:Giám sát và điều khiển Thực tập công nhân Trang 34 BÀI 7 GIÁM SÁT VÀ ĐIỀU KHIỂN THIẾT BỊ I. MỤC ĐÍCH YÊU CẦU