Bài 8: Giao tiếp qua cổng nối tiếp (COM)
4. Lập trình cho vi điều khiển 8051 giao tiếp với PC điều khiển thiết bị ngoại vi sử dụng phần mềm Visual hoặc Delphi tạo ứng dụng và Pinnacle 52 lập trình cho 8051
4.3. Các ví dụ cơ bản lập trình cho PC giao tiếp với thiết bị ngoại thông qua 8051
- Ví dụ 1: Viết chương trình trên Delphi tạo một ứng dụng để truyền các ký tự gõ vào từ bàn phím ra led đơn thông qua vi điều khiển 89c51 để điều khiển các LED đơn gắn ở Port 0 sáng tắt theo mã ASSCII của phím được nhấn.
* Tạo ứng dụng trên Delphi. ( có thể sử dụng VB để tạo ứng dụng ) + Khởi động phần mềm Delphi và tạo ra giao diện như sau:
Hình 8.7 Tạo giao diện trên DELPHI
Để tạo được giao diện như trên ta cần lấy trong thư viện Delphi gồm:
+ 1 textbox để hiển thị có ký hiệu Memo1 như trên hình đồng thời ta có thể dán nhãn cho textbox đó bằng cách lấy label trong thư viện và gán tên cho chúng là
“dữ liệu cần truyền”
+ 2 nút bấm lấy được bằng cách vào Commandbutton trong thư viện và gán tên lần lượt là “truyền”và “thoát”
+Ta cần lấy biểu tượng chiếc điện thoại bàn như trên hình vẽ để thiết lập cổng COM.Trước khi lấy được biểu tượng này ta phải chọn Component trên menu của chương trình sau đó chọn Import Actix X lúc này chương trình hiện ra một hộp thoại cho phép ta lựa chọn các đối tượng cần nhập vào. Ta tiến hàn kéo thanh cuốn dọc và lựa chọn Microsoft Comm Control 6.0 sau đó chọn Install.
Sau bước này ta sẽ thấy xuất hiện biểu tượng chiếc điện thoại trong thư viện và chỉ việc lấy ra sử dụng.
Sau khi tạo được giao diện như trên ta sẽ phải thiết lập cho các sự kiện( viết chương trình cho các sự kiện) để chúng hoạt động đáp ứng theo yêu cầu bằng
cách khi viết cho sự kiện nào ta sẽ nháy đúp chuột vào sự kiện đó rồi viết chương tr×nh cho chóng.
Thiết lập thông số cho Mscomm1 như sau:
MSComm1.CommPort:= 1; // chọn cổng Com 1 MSComm1.PortOpen:= True; // mở cổng
MSComm1.Settings:= '9600,n,8,1'; // chọn tốc đọ truyền là 9600, không kiểm tra chẵn lẻ, 8 bit dữ liệu, 1 bit stop.
+ Viết mã nguồn cho các sự kiện như sau:
//CHUONG TRINH TRUYEN DU LIEU QUA CONG COM1 //THONG QUA 89C51 DIEU KHIEN LED DON
interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
MSComm1: TMSComm;
MEMO1: TMemo;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var
Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
MSComm1.PortOpen:= false; // CHON DONG CONG close; // DONG UNG DUNG
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// THIET LAP THUOC TINH CHO CONG COM MSComm1.CommPort:= 1; // CONG COM1
MSComm1.PortOpen:= True; // CHON MO CONG MSComm1.Settings:= '9600,n,8,1';
MEMO1.Text:=''; // XOA CAC KY TU TRONG MEMO1 end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// DAP UNG SU KIEN KHI NHAN NUT TRUYEN mscomm1.output:=memo1.Text; //TRUYEN DI end;
end.
+ Sau khi thiết kế và viết mã nguồn xong ta hợp dịch và tạo ra được ứng dụng chạy trên Windows có giao diện như sau:
Hình 8.8 ứng dụng chạy trên WINDOW
* Viết chương trình cho VĐK 89C51. ( Chương trình viết trên Pinnacle 52).
+ Khởi động phần mềm lập trình Pinnacle 52và soạn thảo chương trình như sau:
;Chuong trinh nhan du lieu tu PC
;Tan so thanh anh su dung la 11.0592Mhz
;************************
mov scon,#50h ;
MOV TMOD,#20h ;Timer 1 tu dong nap lai MOV TH1,#0FDh ;toc do truyen la 9600 SETB TR1 ;khoi dong timer1
;************************
MOV P0,#00H ;tat het cac led port0 loop:
jnb ri,$ ;kiem tra co nhan
clr ri ;xoa co nhan de nhan ki tu ke tiep mov p0,sbuf ;dua du lieu tai bo dem noi tiep ra port0 jmp loop ;cho nhan
end ;ket thuc chuong trinh
+ Hợp dịch nội dung chương trình vừa soạn thảo và nạp vào vi điều khiển.
+Kết nối phần cứng để chạy ứng dụng và quan sát kết quả.
- Kết nối Com1 với hệ Kit thực tập
- Chọn truyền thông nối tiếp với khối VĐK
- Dùng bus để nối đầu ra của Port 0 với Led đơn.
- Chạy ứng dụng và nhập ký tự cần truyền từ bàn phím và nhấn truyền sau đó quan sát Led đơn.
- Ví dụ 2: Viết chương trình trên Delphi tạo một ứng dụng để truyền các ký tự gõ vào từ bàn phím ra led đơn thông qua vi điều khiển 89c51 để điều khiển các LED đơn gắn ở Port 0 sáng tắt theo mã ASSCII của phím được nhấn đồng thời
hiển thị ký tự được nhấn từ bên ngoài trên ứng dụng.
* Tạo ứng dụng trên Delphi.
+ Khởi động phần mềm Delphi và tạo ra giao diện như sau:
Để tạo được giao diện như trên ta cần lấy trong thư viện Delphi gồm:
+ 2 textbox để hiển thị có ký hiệu Memo1 và Memo2 như trên hình đồng thời để phân biệt rõ 2 textbox đó ta có thể dán nhãn cho chúng bằng cách lấy 2 label trong thư viện và gán tên cho chúng lần lượt là “dữ liệu cần truyền” và “dữ liệu nhận được”
+ 3 nút bấm lấy được bằng cách vào Commandbutton trong thư viện và gán tên lần lượt là “truyền”, “nhận” và “thoát”
+ Viết mã nguồn cho các sự kiện như sau:
unit TRUYENNHAN;
//CHUONG TRINH TRUYEN NHAN DU LIEU NOI TIEP TU PC THONG QUA VDK VOI THIET BI NGOAI VI
// SU DUNG CONG COM1, TOC DO TRUYEN 9600B/S interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB;
type
TForm1 = class(TForm) Memo1: TMemo;
Memo2: TMemo;
Label1: TLabel;
Label2: TLabel;
MSComm1: TMSComm;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
begin
MSComm1.PortOpen:= false; //DONG CONG close //DONG UNG DUNG
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//TRHIET LAP THUOC TINH CONG COM
MSComm1.CommPort:= 1; //CHONG CONG COM1 MSComm1.PortOpen:= True; //MO CONG
MSComm1.Settings:= '9600,n,8,1';
MEMO1.Text:=''; //XOA CAC MEMO MEMO2.Text:='';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//SU KIEN KHI NHAN NUT TRUYEN
mscomm1.output:=memo1.Text; //TRUYEN DI end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//SU KIEN KHI NHAN NUT NHAN
memo2.Text:=memo2.Text+mscomm1.Input; // NHAN VAO end;
end.
+ Sau khi thiết kế và viết mã nguồn xong ta hợp dịch và tạo ra được ứng dụng chạy trên Windows có giao diện như sau:
* Viết chương trình cho VĐK 89C51. ( Chương trình viết trên Pinnacle 52).
+ Khởi động phần mềm lập trình Pinnacle 52và soạn thảo chương trình như sau:
;Chuong trinh truyen va nhan du lieu tu PC
;Tan so thanh anh su dung la 11.0592Mhz
;************************
mov scon,#52h ;
MOV TMOD,#20h ;Timer 1 tu dong nap lai MOV TH1,#0FDh ;toc do truyen la 9600 SETB TR1 ;khoi dong timer1
;************************
mov p2,#0ffh ;dat p2 lam dau vao MOV P1,#00H ;tat het cac led port0
loop:
jnb ti,$
clr ti mov a,p2 mov sbuf,a jnb ti,$
jnb ri,loop clr ri
mov p1,sbuf jmp loop
end ;ket thuc chuong trinh
+ Hợp dịch nội dung chương trình vừa soạn thảo và nạp vào vi điều khiển.
+Kết nối phần cứng để chạy ứng dụng và quan sát kết quả.
- Kết nối Com1 với hệ Kit thực tập
- Chọn truyền thông nối tiếp với khối VĐK - Dùng bus để nối đầu ra của Port 1 với Led đơn.
- Nối Port 2 với bàn phím hexa
- Chạy ứng dụng và nhập ký tự cần truyền từ bàn phím và nhấn truyền sau đó quan sát Led đơn và trên ứng dụng .
- Ví dụ 3: Viết chương trình trên Visual tạo một ứng dụng để nhận dữ liệu là các số
đếm từ vi điều khiển 89c51 hiển thị số đếm trên giao diện Visual và Led 7 đoạn
* Tạo ứng dụng trên Visual.
+ Khởi động phần mềm Visual và tạo ra giao diện như sau:
Thiết lập thông số cho Mscomm1 như sau:
MSComm1.CommPort:= 1; // chọn cổng Com 1 MSComm1.PortOpen:= True; // mở cổng
MSComm1.Settings:= '9600,n,8,1'; // chọn tốc đọ truyền là 9600, không kiểm tra chẵn lẻ, 8 bit dữ liệu, 1 bit stop.
+ Viết mã nguồn cho các sự kiện như sau:
Dim x As Integer
Private Sub Command1_Click()
com.PortOpen = False ' dong cong noi tiep End 'ket thuc chuong trinh End Sub
Private Sub Command2_Click()
com.Output = Text2.Text + "@" 'gui gia tri dat ra cong com cung voi ky tu @ End Sub
Private Sub Command3_Click() Text1.Text = "0000"
End Sub
Private Sub Form_Load()
Timer1.Interval = "1" 'dat timer1 cu 100ms xay ra 1 lan Timer1.Enabled = True 'cho phep timer 1 lam viec ' Xac lap thong so cho cong cong com
com.CommPort = 1 'chon cong com 1
com.Settings = "1200,n,8,1" 'chonm toc do truyen la 1200, khong kiem tra chan le, 8 bit du lieu, 1 bit dung
com.PortOpen = True 'mo cong com 'xac lap thong so cho timer 1
Text1.Text = "0000"
Text2.Text = "9999"
End Sub
Private Sub Timer1_Timer() Text3.Text = com.Input If Text3.Text = "@" Then
Text1.Text = Text4.Text Text4.Text = ""
Else
Text4.Text = Text4.Text + Text3.Text End If
End Sub
+ Sau khi thiết kế và viết mã nguồn xong ta hợp dịch và tạo ra được ứng dụng chạy trên Windows có giao diện như sau:
* Viết chương trình cho VĐK 89C51. ( Chương trình viết trên Pinnacle 52).
+ Khởi động phần mềm lập trình Pinnacle 52và soạn thảo chương trình như sau:
;chuong trinh viet cho VDK 8051 dem xung ngoai su dung bo dem 0
;gia tri so dem lon nhat la 9999
;gia tri so dem can dem dat duoc tren may tinh
;gia tri so dem dem duoc hien thi tren led 7 doan va tren may tinh
;port 0 noi voi cac doan
;p2.0 den p2.3 quet led
;p3.4 cap xung dem
;p3.0 noi voi TXD cua may tinh qua cong com ( su dung vi mach MAX232)
;p3.1 noi voi RXD cua may tinh qua cong com
;thach anh su dung la 11.0592Mhz
;toc do truyen la 1200, 8 bit du lieu, 1 bit dung, khong kiem tra chan le
;--- org 0
jmp main
;---
;khai bao dia chi ngat noi tiep org 23h
push acc push psw
jnb ri,kt_truyen mov a,sbuf
cjne a,#'@',doc_du_lieu ;@ la ky tu danh dau vi tri ket thuc cua chuoi ky tu nhan duoc
mov r1,#50h ;50h-53h la cac vi tri cat gia tri so dem nhan duoc tu may tinh
jmp thoat_ngat doc_du_lieu:
clr c
subb a,#30h ;chuyen tu ma ASSCII thanh so bcd
mov @r1,a inc r1 thoat_ngat:
clr ri pop psw pop acc reti
kt_truyen:
jnb ti,$
clr ti pop psw pop acc reti
;--- main:
mov dptr,#ma_7doan
mov ie,#10010000b ;cho phep ngat noi tiep
;thiet lap tham so cho cong noi tiep
MOV TMOD,#20h ;timer 1 mode 2 tu dong nap lai
MOV TH1,#0E8h ;toc do truyen 1200
SETB TR1 ;khoi dong timer1
mov scon,#50h ;cho phep nhan du lieu noi tiep' mov a,#00000101b ;timer0 mode1 che do bo dem
orl tmod,a mov tl0,#0 mov th0,#0 mov r0,#0
mov r1,#50h ;vi tri cat du lieu doc duoc tu may tinh mov 50h,#9
mov 51h,#10 mov 52h,#9
mov 53h,#9 ;mac dinh khi chay chuong trinh se so sanh voi 9999
setb tr0 loop0:
call xu_ly_so_so_sanh ;chuong trinh chuyen so dem nhan duoc tu may tinh sang so thap phan
call tach_giai_ma ;tach va chuyen sang ma 7 doan de hien thi tren ;led 7 doan
call hien_thi ;goi chuong trinh hien thi tren led 7 doan
call chuyen_ma_ascii ;chuyen tu so bcd sang ma ASSCII de truyen len ;may tinh
call truyen_noi_tiep ;truyen gia tri dem duoc len may tinh mov a,tl0
cjne a,61h,ss100 ;so sanh gia tri dem duoc voi so can so nhan ;duoc tu may tinh
sjmp ssr0 ss100:
cjne a,#100,$+3 jc loop0
mov tl0,#0 inc r0 ssr0:
mov a,r0
cjne a,60h,loop0 mov r0,#0
mov tl0,#0 jmp loop0
;--- xu_ly_so_so_sanh:
mov a,50h mov b,#10 mul ab add a,51h
mov 60h,a ;cat byte cao can so sanh vao o nho 60h mov a,52h
mov b,#10 mul ab add a,53h
mov 61h,a ;cat byte thap can so sanh vao o nho 61h ret ;---
tach_giai_ma:
mov a,tl0 mov b,#10 div ab mov 41h,a mov 40h,b
movc a,@a+dptr mov 30h,a
mov a,b
movc a,@a+dptr mov 31h,a
mov a,r0 mov b,#10 div ab mov 43h,a
mov 42h,b
movc a,@a+dptr mov 32h,a
mov a,b
movc a,@a+dptr mov 33h,a
ret ;--- chuyen_ma_ascii:
mov a,40h add a,#30h mov 40h,a mov a,41h add a,#30h mov 41h,a mov a,42h add a,#30h mov 42h,a mov a,43h add a,#30h mov 43h,a ret
;--- truyen_noi_tiep:
mov a,#'@' mov sbuf,a call delay mov a,43h mov sbuf,a call delay mov a,42h mov sbuf,a call delay mov a,41h
mov sbuf,a call delay mov a,40h mov sbuf,a call delay
ret ;---
;chuong trinh hien thi tren led 7 doan hien_thi:
mov p0,31h
mov p2,#11111110b call delay100us mov p2,#0ffh mov p0,30h
mov p2,#11111101b call delay100us mov p2,#0ffh mov p0,33h
mov p2,#11111011b call delay100us mov p2,#0ffh mov p0,32h
mov p2,#11110111b call delay100us mov p2,#0ffh ret
;--- delay100us:
mov r5,#50 djnz r5,$
ret
;--- delay:
mov r6,#1
dl1:
mov r7,#255 lap_hien_thi:
call hien_thi
djnz r7,lap_hien_thi djnz r6,dl1
ret ;--- ma_7doan:
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h end
+ Hợp dịch nội dung chương trình vừa soạn thảo và nạp vào vi điều khiển.
+Kết nối phần cứng để chạy ứng dụng và quan sát kết quả.
- Kết nối Com1 với hệ Kit thực tập
- Chọn truyền thông nối tiếp với khối VĐK
- Dùng bus để nối đầu ra của Port 0 với cac đoạn a,b,c,d,e,f,g.
- Nèi Port 2 víi quÐt led
Chạy ứng dụng và quan sát phần hiển thị trên Led 7 đoạn và trên máy tính . Bài tập:
Bài tập 1: Viết chương trình trên Visual tạo một ứng dụng để truyền các ký tự gõ vào từ bàn phím ra led đơn thông qua vi điều khiển 89c51 để điều khiển các LED đơn gắn ở Port 0 sáng tắt theo yêu cầu:
- Khi nhấn phím 1 thì 8 led đơn sáng dần - Khi nhấn phím A thì 8 led đơn tắt dần - Khi nhấn phím B thì 8 led đơn chớp tắt
Bài tập 2: Viết chương trình trên Visual tạo một ứng dụng để nhận dữ liệu là nhiệt độ từ cảm biến qua ADC đến vi điều khiển 89c51