BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC VĂN HIẾN
KHOA ĐIỆN TỬ - VIỄN THÔNG
Bài Tập Lớn: Môn Truyền Số Liệu
GIAO TIẾP MÁY TÍNH - VĐK
SỬ DỤNG C# VÀ VB
GVHD
:
Nguyễn Văn Khải
SVTH
:
Nguyễn Phước
TP.HCM, ngày 08 tháng 07 năm 2011
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
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.
Trang 3
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
Đâ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
Trang 4
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
Tiếp theo, ta click đúp vào cổng com (COMPIM) để đổi tên cổng com
Trang 5
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
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…
Trang 6
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
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
Trang 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
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.
Trang 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
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.
Trang 9
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
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.
Trang 10
BT Lớn Môn Tru tượng này sẽ chứa danh sách cổng com chúng ta sẽ kết nối
Trang 62
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
- 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ị
Trang 63
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
- 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 ý.
Trang 64
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
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
Trang 65
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
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
Trang 66
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
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
}
Trang 67
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
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
Trang 68
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 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 <REGX51.H>
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
Trang 69
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
}
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;
Trang 70
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
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
Trang 71
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
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 <REGX51.H>
sbit role1
= P2^0;
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;
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;
// Dinh nghia cac chan dieu khien
// Dinh nghia cac chan phim nhan
Trang 72
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
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);
Trang 73
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
}
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;
RI = 0;
// Cho Timer1 chay
// 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;
}
}
Trang 74
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
}
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;
while(!TI);
TI = 0;
// Cho timer chay
// Cho den khi co truyen len muc 1
// 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
Trang 75
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
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 <REGX51.H>
#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){
Trang 76