Giao tiếp máy tính - Vi điều khiển 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.

pdf84 trang | Chia sẻ: lvcdongnoi | Lượt xem: 4803 | Lượt tải: 1download
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:

  • pdfGiao tiếp máy tính - Vi điều khiển sử dụng C# và VB.pdf