Mục lục
CHƯƠNG 1: MÔ PHỎNG GIAO TIẾP MÁY TÍNH SỬ DỤNG PROTEUS VÀ KEIL C 3
1.1 Chương trình hỗ trợ tạo cổng Com ảo . . 3
1.2 Mạch mô phỏng vi điều khiển giao tiếp máy tính . . 3
1.3 Lập trình cho VĐK sử dụng Keil C . . 6
1.3.1 Các bước xây dựng dự án Keil C . . 6
1.3.2 Cấu trúc cơ bản một chương trình C cho VĐK trong Keil C . 18
CHƯƠNG 2: SỬ DỤNG VISUAL BASIC 6.0 GIAO TIẾP VI ĐIỀU KHIỂN . 34
2.1 Thiết kế giao diện . 34
2.2 Viết chương trình thực thi . 44
CHƯƠNG 3: SỬ DỤNG VISUAL C# GIAO TIẾP VĐK . 48
CHƯƠNG 4: CÁC VÍ DỤ GIAO TIẾP MÁY TÍNH VÀ VĐK . 69
4.1 Giao tiếp máy tính điều khiển động cơ bước bằng C# . 69
4.1.1 Mô phỏng Proteus . 69
4.1.2 Viết chương trình Keil C cho VĐK . 69
4.1.3 Giao diện điều khiển từ máy tính . 71
4.2 Giao tiếp máy tính điều khiển động cơ DC bằng C# . 72
4.2.1 Mô phỏng Proteus . 72
4.2.2 Viết chương trình Keil C cho VĐK . 72
4.2.3 Giao diện C# điều khiển trên máy tính . 75
4.3 Giao tiếp máy tính điều khiển LCD 4 dòng bằng VB . 76
4.3.1 Mô phỏng Proteus . 76
4.3.2 Chương trình Keil C cho VĐK . 76
4.3.3 Giao diện VB điều khiển trên máy tính . 79
4.4 Giao tiếp máy tính điều khiển 8 LED đơn bằng VB . 79
4.4.1 Mô phỏng Proteus . 79
4.4.2 Viết chương trình Keil C cho VĐK . 79
4.4.3 Giao diện VB điều khiển trên máy tính . 80
4.5 Giao tiếp máy tính điều khiển LED ma trận DC bằng C# . 81
4.5.1 Mô phỏng Proteus . 81
4.5.2 Viết chương trình Keil C cho VĐK . 81
4.5.3 Giao diện C# điều khiển trên máy tính . 84
Trang 2
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
CHƯƠNG 1: MÔ PHỎNG GIAO TIẾP MÁY TÍNH SỬ DỤNG
PROTEUS VÀ KEIL C
1.1 Chương trình hỗ trợ tạo cổng Com ảo
Virtual Serial Port Driver là chương trình giúp bạn tạo ra những cặp cổng com ảo,
vào nối chúng với nhau tạo một kết nối ảo để thực hiện truyền dữ liệu.
Sau khi cài đặt chương trình, bạn khởi động chương trình vào tạo một hoặc nhiều cổng
com ảo cho việc mô phỏng giao tiếp máy tính và vi điều khiển.
Chọn 2 cổng com mà bạn muốn kết nối và Click nút Add pair. Bạn sẽ có những cặp
cổng com được nối với nhau, như COM1 COM2, COM4 COM5
1.2 Mạch mô phỏng vi điều khiển giao tiếp máy tính
Khởi động chương trình mô phỏng mạch Proteus, lấy các linh kiện cần thiết và vẽ
mạch như hình dưới đây.
84 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 4947 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Giao tiếp máy tính - Vi điều khiển sử dụng C# và VB, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ính - VĐK sử dụng C# và VB
Trang 3
CHƯƠNG 1: MÔ PHỎNG GIAO TIẾP MÁY TÍNH SỬ DỤNG
PROTEUS VÀ KEIL C
1.1 Chương trình hỗ trợ tạo cổng Com ảo
Virtual Serial Port Driver là chương trình giúp bạn tạo ra những cặp cổng com ảo,
vào nối chúng với nhau tạo một kết nối ảo để thực hiện truyền dữ liệu.
Sau khi cài đặt chương trình, bạn khởi động chương trình vào tạo một hoặc nhiều cổng
com ảo cho việc mô phỏng giao tiếp máy tính và vi điều khiển.
Chọn 2 cổng com mà bạn muốn kết nối và Click nút Add pair. Bạn sẽ có những cặp
cổng com được nối với nhau, như COM1 COM2, COM4 COM5
1.2 Mạch mô phỏng vi điều khiển giao tiếp máy tính
Khởi động chương trình mô phỏng mạch Proteus, lấy các linh kiện cần thiết và vẽ
mạch như hình dưới đây.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 4
Đây là mạch mô phỏng giao tiếp máy tính và vi điều khiển cơ bản nhất, tương
tác điều khiển led đơn, từ đây bạn có thể thay led thành các role để điều khiển động cơ
DC, động cơ bước (đảo chiều), …
Để thực hiện gửi và nhận dữ liệu giữa máy tính và vi điều khiển, bạn cần thiết
lập tần số thạch anh cho vi điều khiển, tùy chọn tên cổng com cho cổng com ảo. Các
bước thực hiện như sau.
Click đúp vào vi điều khiển bạn sẽ thấy hộp thoại Edit Component, ở dòng thông số
Clock Frequency, bạn nhập vào 11.0592MHz như hình dưới đây, và click OK
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 5
Tiếp theo, ta click đúp vào cổng com (COMPIM) để đổi tên cổng com
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 6
Tại dòng Physical port, ta chọn tên cổng com phù hợp. Việc chọn tên cổng com
tùy thuộc vào chương trình tạo cổng com ảo. Ở đây ta chọn COM2, vì trước đó ta có
kết nối đã được thiết lập giữa COM1 và COM2 bằng Virtual Serial Port Driver. Tương
ứng để gửi nhận dữ liệu giữa vi điều khiển và Máy tính, trong giao chương trình Giao
tiếp bằng C# hay VB ta phải chọn cổng com còn lại của cặp này là COM1
1.3 Lập trình cho VĐK sử dụng Keil C
1.3.1 Các bước xây dựng dự án Keil C
Sau khi khởi động Keil C, giao diện chương trình sẽ như hình sau
Để tạo dự án mới, ta vào menu Project > New Project…
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 7
Hộp thoại Create New Project hiện ra, bạn chọn thư mục để lưu dự án của mình và đặt
tên cho dự án mới. Sau đó click vào nút Save
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 8
Sau đó hộp thoại Select Device for Target hiện ra yêu cầu bạn phải chọn phần cứng –
loại IC mà bạn viết chương trình cho nó. Ở đây mình chọn IC AT89C51 của hàng
Atmel, họ MSC-51 (8051). Và click OK.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 9
Các bước khởi tạo dự án mới đã xong, bây giờ bạn bắt đầu thêm file vào dự án
của mình để có thể viết chương trình và biên dịch file hex nạp cho VĐK.
Vào menu File > New, một file mới đã được tạo. Tiếp theo bạn vào menu File > Save
để lưu file mới này.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 10
File mới có tên mặc định là Text1 được tạo ra như ta thấy trong cửa sổ làm việc ở trên.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 11
Bạn lưu ý phải lưu tên file và phần mở rộng phải là .c ví dụ như hình bên dưới
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 12
Tiếp theo sau khi lưu file mới, bạn click phải chuột vào cây thư mục của dự án, chọn
Add Files to Group ‘Source Group 1’ để thêm file mới vào dự án.
Chọn file và click vào nút Add và đóng của hộp thoại Add file lại
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 13
Sau khi hoàn tất thao tác trên bạn sẽ được như hình dưới này
Bước tiếp theo, ta sẽ tùy chọn cho dự án khi biên dịch sẽ tạo file hex nạp cho vi điều
khiển.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 14
Hộp thoại Option for Target 1 hiện ra bạn thiết lập như hình bên dưới.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 15
Bây giờ ta sẽ tiến hành biên dịch dự án của mình, sau khi thực hiện tất cả bước trên và
lưu ý là bạn đã viết chương trình vào file dự án của mình.
Kết quả biên dịch được Keil C báo cáo như hình bên dưới. File hex tương ứng đã được
tạo ra trong thư mục của dự án.
Để xem mức logic của các chân vi điều ta có thể thực hiện như hình dưới đây
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 16
Vào menu Peripherals > I/O-Ports và đánh dấu vào các port của vi điều khiển mà bạn
muốn xem mức logic khi thực thi chương trình của bạn.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 17
Click vào đoạn chương trình bất kì, Bấm phím F11 để chạy từng dòng lệnh mà ta đã
viết, xem kết quả xuất ra Port của vi điều khiển.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 18
1.3.2 Cấu trúc cơ bản một chương trình C cho VĐK trong Keil C
a. Phần đầu tiên là liệt kê các header file mà các bạn dùng bằng từ khóa
Code:
#include"tên header file"
hoặc
Code:
#include
Khi bạn viết theo cách thứ nhất thì trình biên dịch sẽ tìm kiếm file .h hoặc .c này trong
thư mục hiện tại chứa dự án của bạn, nếu không có thì sẽ tìm kiếm trong thư mục Inc
trong thư mục cài đặt KeilC.
Viết theo cách thứ hai thì trình biên dịch sẽ tìm luôn trong thư mục /INC luôn.
Để có thể sử dụng đúng các file .h cho các vi điều khiển của mình thì bạn nên mở thư
mục /inc trong thư mục này có các thư mục con như tên của hãng sản xuất. Ví dụ như
của Atmel thì bạn tìm trong thư mục /Atmel thì sẽ thấy được file reg51.h ,.. Bạn mở
từng file nên mà khám phá sẽ có nhiều điều hay đấy.
b. Định nghĩa các macro cho chương trình sáng sủa. Việc định nghĩa này được dùng
bằng từ khóa #define
Ví dụ: bạn định nghĩa led1 là P1_0 tức là led1 được nối với chân 0 của Port 1.
Code:
#define led1 P1_0
c. Các hàm ngắt như ngắt timer0, timer1, ngắt nối tiếp, ngắt ngoài.
Ví dụ bạn dùng ngắt nối tiếp là ngắt 4 trong bảng vector ngắt thì hàm sẽ có dạng như
sau:
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 19
Code:
void inter_4(void) interrupt 4 using 2{
// làm gì thì làm ở đây
}
Cú pháp các ngắt khác cũng tương tự chỉ thay số 4 bằng số thứ tự của ngắt trong bảng
vector ngắt.
d. Các hàm con như Delay, khởi tạo,.. như:
Code:
void delay( unsigned char time){
//code viết ở đây
}
e. Chương trình chính:
Code:
void main(void){
// viết mã ở đây
}
đối tượng của chương trình là vi điều khiển nên hàm main không có giá trị trả về và
không có tham số đưa vào. Và thực chất cũng chẳng cần biến toàn cục vì ta chỉ cần viết
1 file thôi, nên không đưa biến toàn cục vào đây.
Kết luận, chương trình của chúng ta sẽ có dạng như sau:
Code:
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 20
// liệt kê header file
#inlucde"tên header file"
....................
// các marco
#define led1 P1_0
...........
// các hàm ngắt
void inter_1 interrupt 1 using 3{
}
..........
// các hàm bình thường
void delay( unsigned char time){
///
}
..............
// chương trình chính
void main(void){
}
Hàm trễ delay()
Có lẽ việc lập trình cho vi điều khiển một hàm không thể thiếu đó là trễ: như trễ khi
nháy led chẳng hạn (ví dụ đơn giản nhất), ...
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 21
Việc gây trễ trong Keil C có thể có nhiều cách khác nhau:
Hàm delay có tham số là thời gian cần gây trễ tính theo ms
1. Dùng vòng lặp while, for
Dùng kiểu nào thì cũng đơn giản chỉ là vòng lặp mà thôi. Trong vòng lặp này ta sẽ
chẳng làm gì cả nên vi điều khiển sẽ bị mất thời gian trong các vòng lặp này.
Với tần số thạch anh 11.0582 MHz thì mỗi vòng lặp khi các bạn debug sẽ thấy là
chúng ta mất thời gian thực khoảng 8.28 us. Do đó để có thể gây trễ 1ms thì các bạn
cần dùng xấp xỉ 121 vòng lặp kiểu này.
Do đó hàm sẽ như sau:
Code:
void delay(usigned char time){
while(time--){
unsigned char temp = 121;
while(temp--); // chẳng làm gì cả
};
}
Việc chuyển đổi giữa vòng for với while trong trường hợp này rất đơn giản. Nhưng khi
đó bạn lại phải khai báo thêm một biến đếm như thế sẽ tốn bộ nhớ. Chương trình trên
là tối ưu nhất rồi.
2. Dùng timer0, timer1,..
Tiếp tục với hàm delay() theo cách dùng bộ định thời.
Các bạn đọc bài ở trên cũng thấy được là ta lập trình với các thanh ghi tương tự như
trong ASM.
TMOD là thanh ghi 8 bít dùng để thiết lập bộ định thời , các bạn xem lại thanh ghi này.
Dùng bộ định thời có 3 chế độ: chế độ 0, chế độ 1, chế độ 2. Chúng ta sẽ sử dụng chế
độ khởi động bộ định thời bằng phần mềm tức TMOD.3 và TMOD.7 = 0
Việc xác định chế độ nào phụ thuộc vào giá trị của 2 bit TM1 và TM0 của từng timer
(xem định nghĩa từng bít trong thanh ghi TMOD)
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 22
TM1=0 , TM0 =0 chế độ 0
TM1=0, TM0 =1 chế độ 1
TM1=1, TM0 =1 chế độ 2
Chế độ 1 là chế độ 16 bít không tự nạp lại, cách sử dụng bằng cách nạp giá trị cho các
thanh ghi TH1, TL1 (với Timer1), hoặc TL0, TH0 (với Timer0). Khi khởi động timer
bằng cách setb TR1 hoặc TR0 thì nó sẽ đếm từTHTL 0xFFFF khi từ 0xFFFF
0x0000 thì cờ TF1 hoặc TF0 sẽ bật lên sau đó chúng bị xóa thành 0. Chúng ta dùng cờ
này để biết khi nào chuyển qua 0x0000.
Chế độ 0 là chế độ 13 bít tương tự như chế độ 1 nhưng giá trị chỉ tăng đến 0x1FFF.
Chế độ 2, chế độ 8 bít tự nạp lại.
Tiếp theo là ta tính thời gian của mỗi lần tăng bộ định thời. Tấn số của bộ định thời
bằng 1/12 tần số của thạch anh, do đó với tần số 11,0592MHz thì chu kì máy bằng
1.085us.
Do vậy với chế độ 1 tối đa chúng ta sẽ gây trễ được là 65536*1.085 = 71106.56 us =
71.10656 ms.
Chế độ 2 max = 256 *1.085 =277.76 us
Chỉ cần gây trễ 1ms = 1000 us>277.76 nên dùng timer0( 16 bit) ở chế độ 0 thì ta tính
toán giá trị nạp cho timer0 như sau:
thời gian trễ = (65536 - giá trị nạp vào TH,TL+ 1) * 1.085.
Sau đó đổi giá trị ra số hex. Dùng Calculator của windows để đổi.
TH0 = FC, TL0 = 67
Vậy chương trình sẽ như sau:
Code:
void delay(unsigned char time){
while(time--){
TMOD = 0x01; // dùng timer0 ở chế ñộ 1( 16 bit)
TH0 = 0xFC;// nạp giá trị cho timer
TL0 = 0x67;
TR0 = 1; // khởi ñộng bộ ñịnh thời
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 23
while( TF0); // chờ khi nào cờ TF1 =1
TF0 = 0 ; // xóa cờ tràn
TR0 = 0; // dừng bộ ñịnh thời
};
}
Có lẽ người dùng Keil C lần đầu tiên gặp trở ngại khi dùng #include đó là không biết
liệt kê các header file nào cần thiết cho ứng dụng của mình.
Để có thể biết được header file nào dùng cho vi điều khiển của mình thì các bạn mở
thư mục cài Keil C ra, tìm đến thư mục C51/INC bạn sẽ thấy một loạt các thư mục của
các hãng như Atmel,Dalas,.. Tôi xin lấy ví dụ một file regx51.h trong thư mục /Atmel.
Bạn mở file đó lên sẽ thấy đầu đề của nó như sau:
Code:
*--------------------------------------------------------------------
AT89X51.H
Header file for the low voltage Flash Atmel AT89C51 and AT89LV51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
-------------------------------------------------------------------*/
Chứng tỏ file này dùng cho con AT89C51 và AT89LV51 rồi. Khi đó bạn sẽ thêm
header file này vào chương trình của mình.
Còn làm thế nào để mình làm việc với các thành ghi, các port như trong ASM bây giờ.
Câu trả lời ở trong file này:
Code:
#ifndef __AT89X51_H__
#define __AT89X51_H__
/*------------------------------------------------
Byte Registers ; ðịnh nghĩa các thành ghi ở các ñịa chỉ trong RAM
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 24
------------------------------------------------*/
sfr P0 = 0x80;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr P1 = 0x90;
sfr SCON = 0x98;
sfr SBUF = 0x99;
sfr P2 = 0xA0;
sfr IE = 0xA8;
sfr P3 = 0xB0;
sfr IP = 0xB8;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
/*------------------------------------------------
P0 Bit Registers ; ðịnh nghĩa các cổng của Port 0 vì port này là
thanh ghi 8 bít ñịnh ñược ñịa chỉ trực tiếp
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 25
/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_ 0x01
#define STOP_ 0x02
#define PD_ 0x02 /* Alternate definition */
#define GF0_ 0x04
#define GF1_ 0x08
#define SMOD_ 0x80
/*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0 = 0x88;
sbit IE0 = 0x89;
sbit IT1 = 0x8A;
sbit IE1 = 0x8B;
sbit TR0 = 0x8C;
sbit TF0 = 0x8D;
sbit TR1 = 0x8E;
sbit TF1 = 0x8F;
/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_ 0x01
#define T0_M1_ 0x02
#define T0_CT_ 0x04
#define T0_GATE_ 0x08
#define T1_M0_ 0x10
#define T1_M1_ 0x20
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 26
#define T1_CT_ 0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F
/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;
/*------------------------------------------------
SCON Bit Registers
------------------------------------------------*/
sbit RI = 0x98;
sbit TI = 0x99;
sbit RB8 = 0x9A;
sbit TB8 = 0x9B;
sbit REN = 0x9C;
sbit SM2 = 0x9D;
sbit SM1 = 0x9E;
sbit SM0 = 0x9F;
/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 27
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;
/*------------------------------------------------
IE Bit Registers
------------------------------------------------*/
sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */
sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */
sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */
sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */
sbit ES = 0xAC; /* 1=Enable Serial port interrupt */
sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */
sbit EA = 0xAF; /* 0=Disable all interrupts */
/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;
sbit RXD = 0xB0; /* Serial data input */
sbit TXD = 0xB1; /* Serial data output */
sbit INT0 = 0xB2; /* External interrupt 0 */
sbit INT1 = 0xB3; /* External interrupt 1 */
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 28
sbit T0 = 0xB4; /* Timer 0 external input */
sbit T1 = 0xB5; /* Timer 1 external input */
sbit WR = 0xB6; /* External data memory write strobe */
sbit RD = 0xB7; /* External data memory read strobe */
/*------------------------------------------------
IP Bit Registers
------------------------------------------------*/
sbit PX0 = 0xB8;
sbit PT0 = 0xB9;
sbit PX1 = 0xBA;
sbit PT1 = 0xBB;
sbit PS = 0xBC;
sbit PT2 = 0xBD;
/*------------------------------------------------
PSW Bit Registers
------------------------------------------------*/
sbit P = 0xD0;
sbit FL = 0xD1;
sbit OV = 0xD2;
sbit RS0 = 0xD3;
sbit RS1 = 0xD4;
sbit F0 = 0xD5;
sbit AC = 0xD6;
sbit CY = 0xD7;
/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */
#define TF0_VECTOR 1 /* 0x0B Timer 0 */
#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */
#define TF1_VECTOR 3 /* 0x1B Timer 1 */
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 29
#define SIO_VECTOR 4 /* 0x23 Serial port */
#endif
Các bạn nhìn trên thấy là các thanh ghi, các port quả là giống như với ASM phải
không. Do vậy việc lập trình các bạn sẽ làm việc trực tiếp với các các địa chỉ của Ram
mà được định nghĩa ở trên
Giới thiệu các hàm ngắt.
Trong 8051 có 5 nguyên nhân sinh ra ngắt: ngắt ngoài 0, timer0, ngắt ngoài 1, timer1,
ngắt nối tiếp.
Các bạn lại mở file regx51.h ra ở phần cuối của file như sau:
Code:
/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */
#define TF0_VECTOR 1 /* 0x0B Timer 0 */
#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */
#define TF1_VECTOR 3 /* 0x1B Timer 1 */
#define SIO_VECTOR 4 /* 0x23 Serial port */
Địa chỉ của ngắt trong bảng vector ngắt = 8 * số thứ tự ngắt + 3,
số thứ tự ngắt = 0,1,2,3,4 như kí hiệu trong file đó. Như vậy địa chỉ trong RAM từ
0x03 đến 0x30 là dành cho bảng vector ngắt.
Cú pháp của hàm thực hiện ngắt như sau, hàm này không có tham số, không có kiểu trả
về nên là dạng
Code:
Void tên hàm(void)
Cú pháp chính như sau:
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 30
Code:
void inter0(void) interrupt 0 using 1{
} // ngắt ngoài 0, dùng bank 1
Tương tự với các ngắt khác, ta thay số 0 bằng số thứ tự các ngắt tương ứng các ngắt
tương ứng.
Code:
void inter1(void) interrupt 1 using 1{
}
void inter2(void) interrupt 2 using 1{
}
Tiếp tục với 2 ngắt còn lại
Các bạn lưu ý là để vdk nhảy đến bảng vector ngắt thì bạn phải enable ngắt đó.
Ví dụ: bạn muốn ngắt nối tiếp thì phải cho như sau:
Các bạn xem lạ thanh ghi IE ở trong file regx51.h, thanh ghi này định được địa chỉ bit
Code:
EA = 1;// cho phép dùng ngắt
ES = 1;// dùng ngắt nối tiếp
Hàm ngắt trong Keil C
Cách dùng hàm ngắt và một số đoạn code mẫu.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 31
Hàm ngắt là một hàm không có tham số, không có kiểu trả về. Vì thực chất các biến
mà hàm này thao tác chính là các biến toàn cục (các thanh ghi, các port).
Cấu trúc một hàm ngắt như sau:
Code:
void tenham(void) interrupt a using b{
// code
}
Trong đó: những chữ in nghiêng là bắt buộc phải có và using b có thể có hoặc không
có.
tên hàm: tùy các bạn chọn.
a : là thứ tự của ngắt trong bảng vector ngắt
a = 0 : ngắt ngoài 0
a = 1 : ngắt timer0
a = 2 : ngắt ngoài 1
a = 3 : ngắt timer1
a = 4 : ngắt nối tiếp
b: là bank được chọn dùng để thực hiện hàm ngắt. Do 8051 có 4 bank là bank 0, 1, 2, 3.
Do đó : b có thể là một trong các giá trị 0, 1, 2, 3.
Lưu ý: nếu không viết thêm using b thì mặc định là hàm ngắt thực hiện tại bank0.
Do đó, một thí dụ về hàm ngắt nối tiếp sẽ có dạng như sau:
void inter4(void) interrupt 4 using 2{
// mã thực hiện hàm
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 32
}
Sau đây là một đoạn chương trình tạo một xung ở chân P1.0 và khi nhận được dữ liệu
nối tiếp thì chuyển sang port P2. Tần số thạch anh là 11.0592 MHz. Dùng AT89C51
Code:
# include "regx51.h"
// ham gay tre
void delay(int time){
while(time--){
unsigned char j = 122;
while(j--);
};
}
// ham thiet lap ban dau
void init(){
EA = 1; // cho phep dung ngat
ES = 1; // dung ngat noi tiep
// Thiet lap tan so bus
TMOD = 0x02; // dung timer1, che do 8 bit tu nap lai
TH1 = 253; // chon tan so bus = 9600
TR1 = 1 ; // khoi dong timer1
}
// Ham ngat
void inter4(void) interrupt 4 using 2{
if (RI){ // kiem tra co tran nhan RI.
P2 = SBUF; // lay du lieu tu SBUF
RI = 0; // xoa co ngat
};
}
// ham main
void main(){
// tao xung tren chan P1.0
init();
while(1){
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 33
P1_0 = 1;
delay(500);
P1_0 = 0;
delay(500);
}
}
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 34
CHƯƠNG 2: SỬ DỤNG VISUAL BASIC 6.0 GIAO TIẾP VI
ĐIỀU KHIỂN
2.1 Thiết kế giao diện
Khởi động VISUAL BASIC 6.0 tử màn hình Desktop hoặc từ trình đơn Start
Menu. Màn hình làm việc của VB như hình dưới đây. Bao gồm thanh menu, thanh
công cụ, cửa sổ thư mục dự án, của sổ Properties, cửa sổ Form layout và Toolbox.
Để tạo một dự án VB mới, ta vào menu File > New Project (hoặc bấm tổ hợp phím Ctrl
+ N)
Hộp thoại New Project hiện ra, ta chọn loại chương trình, thường là Standard EXE (file
thực thi chuẩn). Click OK
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 35
Dự án mới của chúng ta được tạo ra ban đầu như hình dưới. Ta sẽ dử dụng Toolbox để
thêm các đối tượng vào form.
Để thay đổi thanh tiêu đề cho form, ta click vào form, quay lại của sổ Properties, tìm
đến dòng Caption để nhập dữ liệu.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 36
Lưu ý bạn nên save lại dự án trước khi thực hiện các bước tiếp theo bằng các bấm Ctrl
+ S hay Click biểu tượng Save trên thanh công cụ.
Đặt tên cho Form và Click nút Save.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 37
Tiếp tục đặt tên cho dự án, và lưu lại.
Bước tiếp theo là thêm các đối tượng tương tác trên form.
Để thêm một đối tượng vào form, bạn click vào đối tượng trên Toolbox, sau đó đưa
chuột vào form thiết kế rê chuột từ điểm đầu đến kết thúc tương ứng với kích thước
của đối tượng.
Hình trên chúng ta đã tạo một Label cho form. Bây giờ ta sẽ thay đổi các thuộc tính
của label này cho phù hợp yêu cầu.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 38
Cick vào label, tới cửa sổ Properties, tìm dòng Caption để thay đổi văn bản hiển thị của
label này.
Kết quả như hình sau:
Để thay đổi Font chữ, màu chữ, kích thước Font ta tìm đến dòng Font và ForeColor
trong cửa sổ Properties của đối tượng label này.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 39
Tiếp theo, chúng ta thêm vào làm việc với các đối tượng button, shape, textbox
Cũng như thao tác thêm label ở trên ta tiến hành click vào đối tượng và Click vào form
tại vị trí muốn đưa đối tượng vào.
Hình trên là kết quả sau khi chúng ta thêm 8 Shape tượng trung cho 8 led đơn mà ta
điều khiển.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 40
Để đổi shape vuông thành tròn bạn tìm đến dòng Shape trong cửa sổ Properties của
mỗi Shape và chọn dòng 3 – Circle
Thực hiện tương tự cho 7 shape còn lại.
Sau đó chúng ta đổi tên cho 8 shape này. Tìm đến dòng (Name) trong của sổ Properties
của Shape. Ta sẽ đổi tên 8 shape này đều là shapLed.
Tiếp theo ta thêm 8 label tương ứng 8 led đơn, để khi ta click vào label này các shape
sẽ đổi màu.
Kết quả thực hiện sẽ như hình bên dưới.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 41
Ta tiến hành đổi tên cho 8 label này thành labelLed, lưu ý ta có thể đổi tên tùy ý nhưng
các label này phải trùng tên nhau, để cho việc viết code dễ hơn, ta chỉ cần sử dụng
index của đối tượng để gọi đối tượng ra thực thi.
Sau đó chúng ta thêm vào nút nhấn, nút Gửi dữ liệu, nút Start/Stop và nút Thoát.
Để máy tính có thể gửi và nhận dữ liệu qua cổng com, chúng ta phải thêm đối tượng
cổng nối tiếp vào form. Các bước tiến hành như sau.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 42
Vào menu Project > Components… (hoặc bấm tổ hợp phím Ctrl + T)
Hộp thoại Components hiện ra, chúng ta tìm đến dòng Microsoft Comm Control 6.0 và
đánh dấu vào dòng đó, chon OK.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 43
Khi đó trên Toolbox sẽ có thêm đối tượng như hình , click vào đối tượng này và
click vào form để thêm cổng com cho form. Kết quả như hình bên dưới.
Click vào đối tượng này để thay đổi các thuộc tính như hình bên dưới.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 44
2.2 Viết chương trình thực thi
Bước tiếp theo chúng ta se viết lệnh cho các đối tượng. Để viết code, ta click phải
chuột vào form, chọn View Code.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 45
Cửa sổ Project1 – Form (code) hiện ra trong vùng làm việc. Trong trình sổ xuống
(General) sẽ chứa tất cả đối tượng mà ta đã thêm bên ngoài giao diện. Click và chọn
một đối tượng bất kỳ, ở đây chúng ta sẽ chọn đối tượng labelLED, sẽ xuất hiện 2 dòng
code như sau:
Private Sub LabelLED_Click(Index As Integer)
// lệnh cần thực thi
End Sub
Hàm này sẽ thực thi những lệnh mà ta viết giữa hai dòng này khi click vào mỗi
labelLed.
Ta sẽ thêm dòng lệnh dưới đây vào giữa để hàm thực thi. Kết quả sẽ như sau:
Private Sub LabelLED_Click(Index As Integer)
ShapeLED(Index).FillStyle = 1 - ShapeLED(Index).FillStyle
End Sub
Bây giờ chúng ta sẽ nhấn phím F5 để chạy chương trình, kiểm tra lệnh mình vừa viết ở
trên.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 46
Kế đến chúng ta viết lệnh cho các button.
Lệnh thực thi cho nút Thoat
Private Sub cmdExit_Click()
Beep
End
End Sub
Lệnh thực thi cho nút Gui du lieu
Private Sub cmdSend_Click()
Dim t As Integer
Dim i As Integer
t = 0
For i = 0 To 7
t = t + (2 ^ i) * (1 - ShapeLED(i).FillStyle)
Next i
MSComm1.Output = Chr(t)
End Sub
Lệnh thực thi cho nút Stop
Private Sub cmdStop_Click()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
cmdStop.Caption = "Start"
Else
cmdStop.Caption = "Stop"
MSComm1.PortOpen = True
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 47
End If
End Sub
Chúng ta phải thêm một hàm bên dưới để lúc form khởi động, sẽ tự động mở cổng
COM1 và cấu hình cho cổng com truyền dữ liệu.
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End Sub
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 48
CHƯƠNG 3: SỬ DỤNG VISUAL C# GIAO TIẾP VĐK
Khởi động C#.
Tạo dự án mới: Vào menu File -> New Project … (Hoăc bấm Ctrl + Shift + N)
Hộp thoại New Project xuất hiện, chọn vào biểu tượng Window Application.
Sửa tên ứng dụng WindowsApplication1 thành tên chương trình của bạn, ví dụ như
Dkdongco, Donhietdo, .. lưu ý không nên viết có ký tự trống và tiếng việt trong tên
này!
Xong bạn Click OK
Giao diện ban đầu C# tự động tạo cho bạn như bên dưới
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 49
Các bạn có thể click chuột vào các góc của của sổ From1 và kéo cho nó thay đổi kích
thước vừa ý.
Giờ chúng ta sẽ làm việc với Form1 này.
Bạn Click vào vị trí bất kì trên form, sau đó qua cửa sổ thuộc tính, 2 thuộc tính bạn cần
quan tâm để chỉnh sửa là Name và Text
Lưu ý: Để thay đổi thuộc tính của bất cứ đối tượng nào, việc bắt buộc đầu tiên bạn
phải click chuột vào đối tượng đó.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 50
Các bạn có thể đổi sửa thuộc tính Name thành frmMain hay bất kí tên gì, có thể giữ
nguyên là Form1
Đối với thuộc tính Text, chính là dòng chữ hiển thị trên thanh tiêu đề của cửa sổ
chương trình, bạn nên đổi thành nội dung đề tài của bạn (VD: Chương trình theo dõi
nhiệt độ phòng máy, …), chương trình cho phép bạn nhập liệu tiếng việt.
Tiếp theo bạn đổi tên các file trong của sổ quản lý Project của chương trình như hình
bên dưới
Bước thứ hai là lúc bạn thêm các đối tượng lên của sổ form chính.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 51
- Đối tượng Label, để hiển thị các thông tin như là trường, lớp, tên đề tài, nhóm,
thành viên nhóm, …
Trong Cửa sổ Toolbox, bạn tìm đối tượng Label
Click chuột vào đối tượng label sau đó đưa chuột qua của sổ form, Click vào form tại
ví trí mà bạn muốn đặt label này
Bây giờ ta tiến hành thay đổi các thuộc tính của label này.
Click chuột vào label trên form, chứng ta chuyển qua của sổ Thuộc tính. Lúc này cửa
sổ thuộc tính sẽ chứa các thuộc tính của label này.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 52
Tương tự như form chính lúc nãy 2 thuộc tính bạn cần thay đổi đầu tiên là Name và
Text
Thuộc tính Name bạn thay đổi để khi viết chương trình bạn dễ nhớ khi gọi đối tượng
này ra xử lý, ở đây label này hiển thị tên trường nên mình đặt tên cho nó là
labelTruong.
Lưu ý:
+ Để hạn chế không bị nhầm lẫn giữa các đối tượng bạn nên thêm tiền tố label trước
tên của nó, để biết đối tượng này là loại label, label này để hiển thị Trường. Để dễ nhớ
thôi, chứ chương trình sẽ không cho 2 đối tượng trùng tên nhau.
+ Tên đối tượng bạn không được nhập khoảng trắng và không nên nhập tiếng
việt
Kết quả như hình dưới.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 53
Giờ bạn thay đổi Font chữ, màu chữ, kích thước chữ.
Vẫn Click chuột vào đối tượng label này.
Chuyển qua Cửa sổ Thuộc tính
Click vào nút … ở dòng Font, cửa sổ Font hiện ra, bạn chọn các thuộc tính font cho
vừa ý
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 54
Mình chọn Font Tahoma, In đậm, Size 18
Chọn màu chữ Blue. Kết quả thay đổi như sau
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 55
Tương tự để bạn thêm các label hiển thị lớp, nhóm, tên để tài, …
Bạn có thể Click chuột kéo rê các label đúng vị trí như ý muốn.
Bước tiếp theo, chúng ta tạo một Nút nhấn để khi bạn click vào nó, form điều khiển sẽ
hiện ra đồng thời form chính sẽ ẩn đi
- Đối tượng Button: sẽ thực hiện một công việc gì đó khi ta Click vào (theo code
ta viết)
Trong cửa sổ Toolbox, tìm dòng có đối tượng Button, Click vào dòng này. Sau đó
đưa chuột qua form, click vào vị trí muốn đặt button tren form.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 56
Ta đã có một nút nhấn trên giao diện chính. Bay giờ bạn tiến hành thay đổi các thuộc
tính cho nó. 2 thuộc tính cần thay đổi là Name và Text
Tương tự như đổi thuộc tính Name và Text của label bạn sẽ được kết quả như hình
dưới
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 57
Ngoài ra để nút nhấn của mình thêm phần sinh động, bạn có thể thay đổi font, màu
chữ, … hoặc thêm biểu tượng cho nó, bạn tự tìm hiểu thêm nhé, tất cả đều nằm trong
cửa sổ thuộc tính của button này.
Bây giờ chúng ta tạo một nút nhấn, để khi click vào, chương trình sẽ kết thúc.
Thực hiện tương tự như các bước tạo button ở trên, bạn thay đổi thuộc tính Name cho
nút nhấn này là buttonExit, màu chữ đỏ (tùy ý), Text là Exit hay Thoát, tùy ý bạn.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 58
Bước kế tiếp, tạo sự kiện đóng chương trình cho buttonExit này. Bạn click đúp vào
nút Thoát, cửa sổ viết code hiện ra, bạn gõ lệnh như sau:
private void buttonExit_Click(object sender, EventArgs e)
{
Application.Exit(); // Thoát ứng dụng
}
Để thực hiện bước tiếp theo, chúng ta cần tạo ra một form mới có tên là
frmDieuKhien. Vì nút nhấn này khi click vào thì form điều khiển được hiển thị.
Trong cửa sổ Solution Explorer, bạn click phải vào tên chương trình và click vào
Windows From…
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 59
Hộp thoại Add New Item hiện ra, bạn đặt tên form mới này theo yêu cầu của mình
(VD là frmDieuKhien)
Click Ok để tạo form mới.
Giao diện form mới hiện ra trên cửa sổ làm việc. Bước đầu tiên bạn cũng tiến hành đổi
tên form, tiêu đề form như đã thực hiện với form chính lúc đầu.
Kết quả sau khi thực hiện mình có form điều khiển như hình dưới
Mẹo nhỏ: Để kích thước 2 form này giống nhau hoàn toàn, trong cửa sổ thuộc tính của
form chính (frmMain) bạn tìm đến dòng Size và copy 2 con số (rộng, cao). Sau đó
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 60
cũng tìm đến dòng Size của form điều khiển (frmDieuKhien) dán 2 con số này vào.
Enter
Bây giờ chúng sẽ viết lệnh tạo sự kiện để nút nhấn Bảng ĐK sẽ thực hiện khi nhấn vào
nó.
Chuyển qua form chính (frmMain), Click đúp vào Button Bảng ĐK. Cửa sổ viết code
của chương trình hiện ra, bạn viết những lệnh như dưới vào hàm sự kiện của
buttonNext, bạn không cần phải quan tâm đến các đoạn code khác.
private void buttonNext_Click(object sender, EventArgs e)
{
fromDieuKhien frmDK = new fromDieuKhien(); // Khởi tạo biến
"ñại diện" form ñiều khiển
frmDK.Show(); // Hiện thị form ñiều khiển
this.Hide(); // Ẩn form chính
}
Bây giờ bạn có thế Bấm phím F5 để chạy kiểm tra những gì mình vừa làm.
Như vậy chúng ta đã tương tác xong với form chính (frmMain) rồi giờ chúng ta sẽ
chuyển sang form điều khiển (frmDieuKhien) tạo các đối tượng, viết code cho nó.
Bước đầu tiên bạn tạo một button Thoát như ở form chính để khi click vào chương
trình sẽ thoát.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 61
Click đúp vào nút Thoát để viết code tạo sự kiện cho nó.
private void buttonExit_Click(object sender, EventArgs e)
{
Application.Exit(); // Thoát chương trình
}
Xong, giờ ta sẽ thêm các đối tượng như cổng nối tiếp, các nút nhấn, listbox chứa tên
cổng com, …
- SerialPort: đối tượng để truyền nhận dữ liệu qua công nối tiếp với VĐK
Để thêm một serial port, tương tự như đã thực hiện với các đối tượng trên.
Ta tiến hành đổi thuộc tính Name cho serialport này như hình bên dưới.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 62
Lưu ý: Mình đổi tên cổng nối tiếp này thành port. Các thuộc tín còn lại bạn hãy để như
mặc định.
- Listbox: đối tượng này sẽ chứa danh sách cổng com chúng ta sẽ kết nối
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 63
- Bây giờ chúng ta sẽ thay đổi thuộc tính Name và Item cho ListBox này.
+ Bạn đổi Name listBox1 thành listBoxComport.
+ Ở dòng Item, Bạn click vào nút … để thêm danh sách cổng Com cho listBox này
hiển thị
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 64
- Click OK, kết quả bạn sẽ thấy trên form điều khiển, một danh sách cổng com ta
vừa thêm. Lưu ý là tên cổng com không có khoảng trắng, không nhập tiếng việt. Trên
mỗi dòng chỉ nhập tên 1 cổng com
- Tiếp theo bạn tạo một button để thực hiện Ngắt kết nối cổng com khi không dùng
nữa. Button này có thuộc tính Name là buttonDisConnect và thuộc tính Text là Ngắt
kết nối, font, màu chữ tùy ý.
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 65
- Tạo một label để hiển thị tình trạng kết nối cổng com (như là báo lỗi, báo kết
nối thành công). Label này có thuộc tính Name là labelTinhTrang, thuộc tính Text
bạn để một khoảng trắng vì ban đầu chưa chạy chương trình thì chưa có thông báo gì.
- Giờ ta tiến hành thêm sự kiện cho nút buttonDisConnect và listBoxComPort
Click đúp vào nút Ngắt kết nối và viết code ngắt cổng com như sau:
if (port.IsOpen) // Nếu cổng com ñang mở thì thực hiện lệnh tiếp
theo
{
port.Close(); // ðóng cổng com ñang mở
labelTinhTrang.Text = "ðã ñóng cổng COM!"; // Thông báo ngắt cổng com
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 66
labelTinhTrang.ForeColor = Color.Red; // ðổi màu chứ labelTinhTrang
thành ñỏ
}
Tiếp theo kết nối cổng com khi click chọn cổng com trong danh sách cổng com của
listBoxComPort
Click đúp vào danh sách cổng com (listBoxComPort) và viết code kết nối cổng
com như sau:
private void listBoxComPort_SelectedIndexChanged(object sender,
EventArgs e)
{
if (port.IsOpen) port.Close();
port.PortName = listBoxComPort.SelectedItem.ToString();
try {
port.Open();
labelTinhTrang.ForeColor = Color.Green;
labelTinhTrang.Text = "ðã mở cổng " +
listBoxComPort.SelectedItem.ToString() + " thành công !";
} catch {
labelTinhTrang.ForeColor = Color.Red;
labelTinhTrang.Text = "Không thể mở cổng " +
listBoxComPort.SelectedItem.ToString() + " !";
}
}
- Bấm F5 để kiểm tra công việc, thử click vào dach sách cổng com xem kết quả
thông báo và Ngắt kết nối.
- Tạo các nút nhấn gửi dữ liệu xuống VĐK điều khiển Role
Các bước thực hiện như tạo nút ở trên
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 67
- Tiếp theo ta viết một hàm gửi ký tự qua cổng nối tiếp:
private void writeChar(string Char)
{
if (port.IsOpen) // Nếu cổng com ñã ñược kết nối mới gửi ký tự
{
port.Write(Char); // Gửi một ký tự qua cổng Com
}
else // Nếu cổng com chưa kết nối thì hiển thị hộp thoại thông báo
{
MessageBox.Show("Vui lòng Kết nối với cổng COM!", "Lỗi gửi dữ liệu",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
- Sau khi viết hàm gửi ký tự bạn có thể Click đúp vào các nút ROLE 1 đến ROLE
8 để tạo sự kiện gửi dữ liệu.
private void buttonRole1_Click(object sender, EventArgs e)
{
writeChar("1"); // Gửi ñi ký tự số 1
}
…
…
private void buttonRole8_Click(object sender, EventArgs e)
{
writeChar("8"); // Gửi ñi ký tự số 8
}
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 68
- Khi VĐK nhận được những kí tự này sẽ kiểm tra và xử lý, tùy theo chương trình
của bạn.
- Bấm F5 và chạy mô phỏng Proteus và kiểm tra. Trên giao diện bạn bạn COM5,
trong mô phỏng Proteus bạn chọn COM4, vì 2 cổng này là com ảo đã được tạo ra và
kết nối ảo với nhau nhờ chương trình Virtual Serial Port Driver.
- Để chương trình của bạn luôn hiển thị trên các cửa sổ còn lại, bạn chuyển qua
cửa sổ thuộc tính của frmMain, tìm đến dòng TopMost đổi thành True, làm tương tự
đối với frmDieuKhien
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 69
CHƯƠNG 4: CÁC VÍ DỤ GIAO TIẾP MÁY TÍNH VÀ VĐK
4.1 Giao tiếp máy tính điều khiển động cơ bước bằng C#
4.1.1 Mô phỏng Proteus
4.1.2 Viết chương trình Keil C cho VĐK
#include
sbit DC1 = P2^0;
sbit DC2 = P2^1;
sbit DC1STOP = P2^2;
sbit DC2STOP = P2^3;
char x;
sbit sw1 = P1^0;
sbit sw2 = P1^1;
sbit sw3 = P1^2;
sbit sw4 = P1^3;
sbit sw5 = P1^4;
sbit sw6 = P1^5;
void uart_init(){
SCON = 0x52;
TMOD = 0x22; // Timer 1 va Timer0 Mode 2
TH1 = TL1 = -3; // Toc do Baud la 9600
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 70
}
void sendData(char c){
TR1 = 1;
while(!TI);
TI = 0;
SBUF = c + 0x30;
}
void main(){
uart_init();
DC1STOP = 0;
DC2STOP = 0;
while(1){
if(sw1 == 0) {
DC1 = 0;
DC1STOP = 1;
sendData(1);
while(!sw1);
} else if(sw2 == 0){
DC1 = 1;
DC1STOP = 1;
sendData(2);
while(!sw2);
}
if(sw3 == 0) {
DC2 = 0;
DC2STOP = 1;
sendData(3);
while(!sw3);
} else if(sw4 == 0){
DC2 = 1;
DC2STOP = 1;
sendData(4);
while(!sw4);
}
if(sw5 == 0){
DC1STOP = 0;
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 71
sendData(5);
while(!sw5);
}
if(sw6 == 0){
DC2STOP = 0;
sendData(6);
while(!sw6);
}
TR1 = 1;
RI = 0;
x = SBUF;
switch(x){
case '1': DC1 = 0; DC1STOP = 1; break;
case '2': DC1 = 1; DC1STOP = 1; break;
case '3': DC2 = 0; DC2STOP = 1; break;
case '4': DC2 = 1; DC2STOP = 1;break;
case '5': DC1STOP = 0; break;
case '6': DC2STOP = 0; break;
}
}
}
4.1.3 Giao diện điều khiển từ máy tính
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 72
4.2 Giao tiếp máy tính điều khiển động cơ DC bằng C#
4.2.1 Mô phỏng Proteus
4.2.2 Viết chương trình Keil C cho VĐK
#include
sbit role1 = P2^0; // Dinh nghia cac chan dieu khien
sbit role2 = P2^1;
sbit role3 = P2^2;
sbit role4 = P2^3;
sbit role5 = P2^4;
sbit role6 = P2^5;
sbit role7 = P2^6;
sbit role8 = P2^7;
sbit sw1 = P1^0; // Dinh nghia cac chan phim nhan
sbit sw2 = P1^1;
sbit sw3 = P1^2;
sbit sw4 = P1^3;
sbit sw5 = P1^4;
sbit sw6 = P1^5;
sbit sw7 = P1^6;
sbit sw8 = P1^7;
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 73
char x;
void delay(int t); // Khai bao ham delay
void uart_init(); // Khai bao ham uart_init
void sendData(char c); // Khai bao ham senData
void main(){
uart_init(); // Goi ham khai bao truyen thong noi tiep
while(1){ // Vong lap chinh de thuc thi chuong
trinh mai mai
if(sw1 == 0) { // kiem tra neu phim sw1 - tuc la chan P1.0
duoc nhan
role1 = 0; role2 = 1; // Dua chan P2.0 xuong 0V va
chan P2.1 len 5V
sendData(1); // Gui len may tinh ki tu
so 1 qua cong noi tiep
while(!sw1); // kiem tra nha phim sw1 chua
}
if(sw2 == 0) {
role1 = 1; role2 = 0;
sendData(2);
while(!sw2);
}
if(sw3 == 0) {
role3 = 0; role4 = 1;
sendData(3);
while(!sw3);
}
if(sw4 == 0) {
role3 = 1; role4 = 0;
sendData(4);
while(!sw4);
}
if(sw5 == 0) {
role5 = 0; role6 = 1;
sendData(5);
while(!sw5);
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 74
}
if(sw6 == 0) {
role5 = 1; role6 = 0;
sendData(6);
while(!sw6);
}
if(sw7 == 0) {
role7 = 0; role8 = 1;
sendData(7);
while(!sw7);
}
if(sw8 == 0) {
role7 = 1; role8 = 0;
sendData(8);
while(!sw8);
}
TR1 = 1; // Cho Timer1 chay
RI = 0; // Dua co bao nhan noi tiep xuong 0V de
nhan du lieu tu cong noi tiep
x = SBUF; // Copy du lieu tu bo dem noi tiep vao bien x
switch(x){ // Cau truc chon du lieu trong bien x
case '1': role1 = 0; role2 = 1; break; // Neu bien x
= 1 (may tinh gui xuong ki tu 1) thi Set role1 = 0V va role2 = 1V;
case '2': role1 = 1; role2 = 0; break;
case '3': role3 = 0; role4 = 1; break;
case '4': role3 = 1; role4 = 0; break;
case '5': role5 = 0; role6 = 1; break;
case '6': role5 = 1; role6 = 0; break;
case '7': role7 = 0; role8 = 1; break;
case '8': role7 = 1; role8 = 0; break;
case 'a': role1 = 0; role2 = 0; break;
case 'b': role3 = 0; role4 = 0; break;
case 'c': role5 = 0; role6 = 0; break;
case 'd': role7 = 0; role8 = 0; break;
}
}
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 75
}
void uart_init(){ // Ham khoi tao gui nhan qua cong noi tiep
SCON = 0x52; //UART 8 bit; SM2/1/0=010, REN=1: cho phép thu;
TMOD = 0x22; // Timer 1 va Timer0 Mode 2
TH1 = TL1 = -3; // Toc do Baud la 9600
}
void sendData(char c){
TR1 = 1; // Cho timer chay
while(!TI); // Cho den khi co truyen len muc 1
TI = 0; // Dua co truyen xuong 0V
SBUF = c + 0x30; // Cong 0x30 vao bien x va Copy du lieu tu bien
x vao bo dem noi tiep (SBUF)
}
4.2.3 Giao diện C# điều khiển trên máy tính
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 76
4.3 Giao tiếp máy tính điều khiển LCD 4 dòng bằng VB
4.3.1 Mô phỏng Proteus
4.3.2 Chương trình Keil C cho VĐK
#include
#define LCD_PORT P0 //Dinh nghia Port da lieu cho LCD
#define LCD_RS P1_0
#define LCD_RW P1_1
#define LCD_EN P1_2
#define lcdLine1() lcd_write(0, 0x80) // Dong 1 LCD
#define lcdLine2() lcd_write(0, 0xc0) // Dong 2 LCD
#define lcdLine3() lcd_write(0, 0x94) // Dong 3 LCD
#define lcdLine4() lcd_write(0, 0xd4) // Dong 4 LCD
void uart_init();
void lcd_init();
void delay(unsigned int i){
while(i--);
}
void lcd_write(unsigned char mode, unsigned char d){
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 77
LCD_PORT = d;
LCD_RW = 0;
if(mode == 1) LCD_RS = 1;
else LCD_RS = 0;
LCD_EN = 1;
delay(4);
LCD_EN = 0;
delay(40);
}
void lcd_PutStr(char const *str){
char const *sPtr;
sPtr = str;
while(*sPtr != '\0'){
lcd_write(1, *sPtr);
sPtr++;
}
}
void main(void){
unsigned char kt, pos, line, str[16];
uart_init();
lcd_init();
while(1){
TR1 = 1;
RI = 0;
kt = 0;
line = 0;
while(!RI);
str[kt++] = SBUF;
pos++;
if(str[0] == '~') line = 1;
if(str[0] == '!') line = 2;
if(str[0] == '`') line = 3;
if(str[0] == '^') line = 4;
if(line == 1) {
pos = 0;
lcdLine1();
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 78
}
if(line == 2) {
pos = 0;
lcdLine2();
}
if(line == 3) {
pos = 0;
lcdLine3();
}
if(line == 4) {
pos = 0;
lcdLine4();
}
if(pos > 0) lcd_PutStr(str);
}
}
void uart_init(){
SCON = 0x52;
TMOD = 0x22;
TH1 = TL1 = -3;
}
void lcd_init(){
lcd_write(0, 0x38); // Khoi tao LCD 4 dong, ma tran 5x7
lcd_write(0, 0x0C); // Bat LCD, Bat con tro
lcd_write(0, 0x01); // Xoa LCD
delay(500);
}
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 79
4.3.3 Giao diện VB điều khiển trên máy tính
4.4 Giao tiếp máy tính điều khiển 8 LED đơn bằng VB
4.4.1 Mô phỏng Proteus
4.4.2 Viết chương trình Keil C cho VĐK
#include
void uart_init();
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 80
void main(){
P2 = 0;
uart_init();
while(1){
TR1 = 1;
while(!RI);
RI = 0;
P2 = SBUF;
}
}
void uart_init(){
SCON = 0x52;
TMOD = 0x22;
TH1 = TL1 = -3;
}
4.4.3 Giao diện VB điều khiển trên máy tính
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 81
4.5 Giao tiếp máy tính điều khiển LED ma trận DC bằng C#
4.5.1 Mô phỏng Proteus
4.5.2 Viết chương trình Keil C cho VĐK
#include
#include
unsigned char Mem[80];
unsigned char k,tg,sokt;
char j;
char n=0;
unsigned int x,d;
unsigned char code MaLed[] = { /// Quet cot
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //Dau cach
0xFF,0x07,0x03,0xB9,0x03,0x07,0xFF,0xFF, //A
0xFF,0x01,0x01,0x6D,0x01,0x93,0xFF,0xFF, //B
0xFF,0x83,0x01,0x7D,0x19,0x9B,0xFF,0xFF, //C
0xFF,0x01,0x01,0x7D,0x01,0x83,0xFF,0xFF, //D
0xFF,0x01,0x01,0x6D,0x6D,0xFF,0xFF,0xFF, //E
0xFF,0x01,0x01,0xed,0xED,0xFF,0xFF,0xFF, //F
0xFF,0x83,0x01,0x7D,0xAD,0x09,0x0B,0xFF, //G
0xFF,0x01,0x01,0xEF,0x01,0x01,0xFF,0xFF, //H
0xFF,0xFF,0x7D,0x01,0x01,0x7D,0xFF,0xFF, //I
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 82
0xFF,0xBF,0x3F,0x7D,0x01,0x81,0xFD,0xFF, //J
0xFF,0x01,0x01,0x83,0x19,0x7D,0xFF,0xFF, //K
0xFF,0xFF,0x01,0x01,0x3F,0x3F,0xFF,0xFF, //L
0x01,0x01,0xC7,0x0F,0xC7,0x01,0x01,0xFF, //M
0xFF,0x01,0x01,0xE3,0x8F,0x01,0x01,0xFF, //N
0xFF,0x83,0x01,0x7D,0x01,0x83,0xFF,0xFF, //O
0xFF,0x01,0x01,0xDD,0xC1,0xE3,0xFF,0xFF, //P
0xFF,0x83,0x01,0x7D,0x5D,0x01,0x83,0x7F, //Q
0xFF,0x01,0x01,0xCD,0x01,0x23,0xFF,0xFF, //R
0xFF,0xB3,0x21,0x6D,0x09,0x9B,0xFF,0xFF, //S
0xFF,0xF9,0xF9,0x01,0x01,0xF9,0xF9,0xFF, //T
0xFF,0x81,0x01,0x7F,0x01,0x81,0xFF,0xFF, //U
0xFF,0xE1,0x81,0x3F,0x81,0xE1,0xFF,0xFF, //V
0xE1,0x81,0x3F,0x87,0x87,0x3F,0x81,0xE1, //W
0xFF,0x39,0x11,0xC7,0xC7,0x11,0x39,0xFF, //X
0xFF,0xF9,0xE1,0x07,0x07,0xE1,0xF9,0xFF, //Y
0xFF,0x3D,0x1D,0x4D,0x65,0x71,0x79,0xFF //Z
};
void convert(unsigned char kytu) { // Ham chuyen ky tu sang ma Matrix
LED
// Va dua vao mot mang
unsigned int temp,i;
if (kytu > 64) temp = (kytu-64)*8;
else temp = 0;
for(i=temp; i<temp+8; i++)
Mem[k++] = MaLed[i];
}
void convert_str(unsigned char *str){
k=0;
//for(i=0;i<sokt*8;i++)
sokt=0;
while(*str){
convert(*str);
str++;
sokt++;
}
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 83
}
void dichtrai(void){
unsigned char temp,i;
temp = Mem[0];
for(i=0;i<(sokt*8-1);i++) Mem[i] = Mem[i+1];
Mem[sokt*8-1] = temp;
}
void main(void){
unsigned char kt=0,temp,ch,chuoi[8];
SCON = 0x52;
TMOD = 0x22; // Timer 1 va Timer0 Mode 2
TH1 = TL1 = -3; // Toc do Baud la 9600
IE = 0x82;
TH0 = TL0 = -100;
convert_str("08E1");
TR0 = 1;
TR1 = 1;
while(1){
//temp = _getkey();
//P1 = ~temp;
do {
temp = _getkey();
} while(temp != '@');
kt=0;
TR0 = 0;
do {
temp = _getkey();
ch = temp;
if (ch!='@') chuoi[kt++]=ch;
} while(ch != '@');
convert_str(chuoi);
TR0 = 1;
}
}
void NgatTimer0(void) interrupt 1 {
TR0 = TF0 = 0; // Dung Timer 0 va Xoa co tran
BT Lớn Môn Truyền Số Liệu Giao tiếp máy tính - VĐK sử dụng C# và VB
Trang 84
d++;
if(tg++>10) {
if(x==0x0000) x=0x0001;
P1 = 0xFF; // xoa du lieu tren cot
P0 = x%256;
P2 = x/256;
P1 = Mem[n];
x<<=1;
if(n++>=15) n=0;
tg=0;
}
if(d==2500) {
dichtrai();
d = 0;
}
TR0 = 1;
}
4.5.3 Giao diện C# điều khiển trên máy tính
Các file đính kèm theo tài liệu này:
- Giao tiếp máy tính - Vi điều khiển sử dụng C# và VB.pdf