1. Mạch điều khiển Led đơn
Ta sẽ thiết kế một mạch đèn nháy gồm 8 led, việc nháy như thế nào (chạy đuổi, sáng dần, tắt dần…) là hoàn toàn phụ thuộc vào chương trình trên máy tính.
Mạch sử dụng 8 led, 8 điện trở, và một đầu nối 25 chân dương. Đa số các mạch dùng máy tính điều khiển đều có ưu điểm là đơn giản nhưng lại có rất nhiều chức năng.
Yêu cầu: Lập trình điều khiển 8 Led đơn nối với cổng máy in (LPT) của máy tính để bàn với yêu cầu 8 led đơn chớp tắt lặp lại liên tục. Biết rằng địa chỉ của thanh ghi dữ liệu là 378H, đầu ra tích cực ở mức cao.
+ Sơ đồ nguyên lý. S4 D0 D1 D2 D3 D4 D5 D6 D7 C0\ C1\ C2 C3\ C4 S3 S5 S6 S7\ D0 D1 D2 D3 D4 D5 D6 D7 1 14 2 15 3 16 4 17 5 18 6 19 7 20 8 21 9 22 10 23 11 24 12 25 13 J1 CONN-D25M
SO DO DIEU KHIEN 8 LED DON QUA THANH GHI DATA
A0 2 B0 18 A1 3 B1 17 A2 4 B2 16 A3 5 B3 15 A4 6 B4 14 A5 7 B5 13 A6 8 B6 12 A7 9 B7 11 CE 19 AB/BA 1 U1 74HC245 R1 1k D1 LED-RED R2 1k D2 LED-RED R3 1k D3 LED-RED R4 1k D4 LED-RED R5 1k D5 LED-RED R6 1k D6 LED-RED R7 1k D7 LED-RED R8 1k D8 LED-RED
Bước 1: Vẽ lưu đồ giải thuật
- Lưu đồ giải thuật có thể tham khảo như sau:
Bước 2: Viết chương trình
;Chuong trinh viet dang EXE
.MODEL small ;khai báo quy mô sử dụng chương trình là nhỏ .DATA ;khai bao doan du lieu
du_lieu db "chop tat 8 led don $" .STACK 100 ;khai bao doan ;***********************
.CODE ;khai bao doan ma
Main Proc ;bắt đầu chương trình chính ;dat cac thanh ghi doan
mov ax,data ;muon AX de nap dia chi du lieu vao thanh ghi doan du lieu mov ds,ax
;viet tiep doan ma cua ban vao day
Xác lập các khai báo Nạp địa chỉ cổng LPT Nạp AL =0 Xuất ra cổng LPT Tạo trễ Nạp AL =0FFH Xuất ra cổng LPT Tạo trễ Bắt đầu
lea dx,du_lieu ;nap du lieu vao dx
mov ah,9 ;ngat xuat du lieu lam trong ds ra man hinh( du lieu bat ;buoc ;ket thuc=$)
int 21h
; ngat cho doi nhan phim lap: mov dx,378h mov al,0 out dx,al call delay mov al,0ffh out dx,al call delay jmp lap ends
mov ax, 4ch ; thoat khoi he mo int 21h
delay: mov cx,1000 loop $
ret
ends main ;ket thuc viec hop dich chuong trinh
Trên máy tính có thể có tối đa đến 4 cổng song song và mỗi cổng cần 3 địa chỉ cho ba thanh ghi: dữ liệu, trạng thái, điều khiển. Tuy nhiên ta chỉ dùng thanh ghi dữ liệu và đối với máy tính thông thường thì địa chỉ của thanh ghi này là : 378H (cổng LPT1). Chương trình ở đây minh họa dãy led sáng tắt dần viết bằng Pascal, nếu bạn đã từng viết chương trình thì có thể tùy biến thành nhiều kiểu nháy khác nhau, còn nếu không biết viết chương trình thì cũng không sao, hãy mở Pascal và gõ đoạn chương trình sau rồi cho chạy.
Program LED; Uses CRT;
Var port_address :word; I : integer;
A : array[0..15]of byte ={$FF, $7F, $3F, $0F, $07, $03, $01, $00, $80, $A0, $E0, $F0, $F8, $FA, $FE};
Loop : boolean; Begin
Port_address:=$378; {có thể thay đổi tùy theo máy} Loop :=true; {lặp vòng}
I:=0;
While (loop) do Begin
If (I>15) then I:=0;
Port{port_address}:=a[I]; I:=I+1;
End; End.
2. Tạo xung vuông ở D0 (chân 2) của thanh ghi dữ liệu:
Sử dụng lập trìnhhợp ngữ : Mov dx, 378h; địa chỉ LPT1
Mov bx, const1; số xung được xuất ra Xuat_ra: mov al,1
Out dx, al; “high” ở chân 1 Mov al,0
Out dx, al;”low” ở chân 2 Cho_doi: mov cx,const2
Loop cho_doi; thời gian chờ, ấn định bằng const.2 Dec bx Jnz xuat_ra Bằng turbo C: For(i=1;i<=const1;i++) Outportb(0x378,0); Outportb(0x378,1); Delay(const2);
Hằng số 1 xác định số xung được xuất ra, hằng số 2 xác định số mili giây giữa hai xung kế tiếp.
Một đoạn chương trình tương ứng : For(i=1;i<=const.1;i++)
Outportb(0x378,0); Delay(const2); Outportb(0x378,1); Delay(const3);
Hằng số 1 xác định số xung được xuất ra, hằng số 2 xác định độ kéo dài của xung và hằng số 3 xác định độ trống của xung, cộng lại thành chu kì xung , lấy nghịch đảo ta nhận được tần số xung .
4.1.3. Lập trình ghép nối cổng song song với bộ điều khiển động cơ một chiều.
Lập trình điều khiển động cơ một chiều nối với cổng máy in ( LPT) của máy tính để bàn với yêu cầu động cơ quay thuận. Biết rằng địa chỉ của thanh ghi dữ liệu là 378H, đầu ra tích cực ở mức cao.
Card giao tiếp PC điều khiển động cơ DC 12V quay thuận nghịch.
Card giao tiếp bao gồm IC đệm 74244 các transistor làm nhiệm vụ điều khiển đảo chiều quay cho Motor. Nguồn cấp cho mạch là + 5V và +12V.
S4 D0 D1 D2 D3 D4 D5 D6 D7 C0\ C1\ C2 C3\ C4 D0 D1 D2 D3 D4 D5 D6 D7 S3 S5 S6 S7\ 1 14 2 15 3 16 4 17 5 18 6 19 7 20 8 21 9 22 10 23 11 24 12 25 13 J1 CONN-D25M A0 2 A1 4 A2 6 A3 8 OE 1 Y0 18 Y1 16 Y2 14 Y3 12 U1:A 74ALS244 A0 11 A1 13 A2 15 A3 17 OE 19 Y0 9 Y1 7 Y2 5 Y3 3 U1:B 74ALS244 DC CONTROLLER Q3 TIP31 Q4 TIP32 Q1 BC184 R2 1k R1 1k Q7 TIP32 Q8 BC184 R3 1k R4 1k +12V Q5 TIP31 Q2 BC184 Q6 BC184 +88.8
Hình 4.2 Mạch điều khiển động cơ một chiều
Viết chương trình
;Chuong trinh viet dang EXE
.MODEL small ;khai báo quy mô sử dụng chương trình là nhỏ .DATA ;khai bao doan du lieu
du_lieu db " Dong co một chiều quay thuan $" .STACK 100 ;khai bao doan
;***********************
.CODE ;khai bao doan ma
Main Proc ;bắt đầu chương trình chính
mov ax,data ;muon AX de nap dia chi du lieu vao thanh ghi doan du lieu mov ds,ax
mov ah,9 ;ngat xuat du lieu lam trong ds ra man hinh( du lieu bat buoc ;ket thuc=$) int 21h mov dx,378h mov al,00000001b out dx,al
mov ax, 4ch ; thoat khoi he mo int 21h
ends main ;ket thuc viec hop dich chuong trinh
4.2. Lập trình giao tiếp qua cổng nối tiếp
4.2.1. Phương thức giao tiếp máy tính
1. Giao tiếp PC với PC.
Cáp Null Modem dùng để kết nối hai máy tính với nhau hay máy tính với một thiết bị ngoại vi có giao diện tuần tự và dùng biên bản Zero Modem hay X modem để truyền dữ liệu.
Tín hiệu DSR nối với tín hiệu DTR tín hiệu RTS nối với CTS, bằng cách này giao diện của máy tính luôn hoạt động, dữ liệu được trao đổi qua đường TD và TR.
Hình 4.3 Sơ đồ giao tiếp PC với PC
2. Giao tiếp PC với thiết bị ngoại vi
- Sơ đồ giao tiếp đầu ra của cổng COM với thiết bị ngoại vi tương thích TTL.
Ta phải sử dụng vi mạch chuyển đổi MAX232 để chuyển thành vào ra TTL cho các chân RD và TD.
DCD DSR RD RTS TD CTS DTR RI O T D IR D T D R D DCD IRD DSR CTS RI OTD DTR RTS COM INTERFACE TTL 1 6 2 7 3 8 4 9 5 TO PC CONN-D9F T1IN 11 R1OUT 12 T2IN 10 R2OUT 9 T1OUT 14 R1IN 13 T2OUT 7 R2IN 8 C2+ 4 C2- 5 C1+ 1 C1- 3 VS+ 2 VS- 6 U1 MAX232 C1 1uF C2 1uF C3 1uF C4 1uF 1 2 3 4 5 6 IN CONN-SIL6 1 2 3 4 OUT CONN-H4
Hình 4.4 Sơ đồ giao tiếp PC với thiết bị ngoại vi
- Sơ đồ giao tiếp đầu ra của cổng COM với vi điều khiển 8051.
Ta phải sử dụng vi mạch chuyển đổi MAX232 để chuyển thành vào ra TTL cho các chân RD và TD vì vi điều khiển tương thích mức TTL , giao tiếp với PC qua hai chân đó là RXD ( nhận ) và TXD ( phát ).
4.2.2. Ngôn ngữ lập trìnhvà giao diệnmáy tính
1. Lập trình trong DOS a. Ngôn ngữ Qbasic:
Lệnh khởi động cổng COM n:
OPEN “COM n,[Baud], [Parity], [Data], [Stop]” for RANDOM as#m N=1,2,3,4; m=1255
Thí dụ : OPEN “COM 2, 9600, E, 7, 2” FOR RANDOM AS#1 Lệnh xuất ra một chuỗi :
PRINT #,S$
Lệnh đọc vào một chuỗi: INPUT #1, R$
Ngoài ra còn có cáclệnh truy xuất thanh ghi của vi mạch UART.
b. Ngôn ngữ Pascal và C:
Dùng các lệnh truy xuất thanh ghi.
c. Trong MsDOS ở dòng lệnh đánh :
MODE COM n : 96, E, 7, 1 sẽ mở COM n.
Ngôn ngữ Visual Basic có modul phần mềm MSCOMM.OC phục vụ cho truyền thông, với Visual Basic 4.0 là MSCOMM16.OCX còn với Visual Basic 6.0 là MSCOMM32.OCX.
a. Sử dụng MSComm
MSComm l yêu cầu điều khiển cho thông tin trong cổng nối tiếp
Cài đặt:
ActiveX MsComm được bổ sung vo một Visual Basic Project thông qua menu
Project > Components
Tính chất
MSComm: có một số tính chất liên kết. Tính chất liên hệ tới cấu hình của port, truyền dữ liệu, sử dụng tín hiệu bắt tay, và nhận ra điều khiển
Cấu trúc:
CommID: tra lại việc điều khiển khi nhận ra thiết bị Commport: đặt và trả lại vị trí của port
Inbuffersize: đặt và trả lại kích thước của bộ đệm.(bằng byte)
Inputlen: đặt và trả lại những con số hoặc những ký tự ở ngõ vào sẽ đọc
Inputmode: đặt và trả lại kiểu dữ liệu.(dạng chữ hay nhị phn) trả lại bằng ngõ vào hay được đồng ý ở ngõ ra
Nulldiscard: xác định ký tự có rỗng hay không. (Chr.(0).) đã được truyền từ port tới bộ đệm nhận hoặc được bỏ qua
Outbuffersize: đặt và trả lại kích thước của bộ đệm truyền (khoảng 512 byte) Parityreplace: kiểm tra cờ chẵn lẻ
Portopen: đặt và trả lại trạng thái của port. (giá trị boolean)
Rthreshold: đặt và trả lại một số hoặc ký tự tới bộ nhận trước khi so sánh tới comEvReceive
Settings: đặt và trả lại tốc độ truyền, cờ chẵn lẻ và dữ liệu vả bit stop
Sthreshold: đặt và trả lại số hoặc ký tự nhỏ nhất trong bộ đệm truyền trước khi so sánh với comevsend
b. Phần truyền dữ liệu:
Commevent: trả lại hầu hết các sự kiện hoặc lỗi gần đây Inbuffercount: trả lại một số hay ký tự trong bộ đệm truyền Input: trả lại vả xóa dữ liệu từ bộ đệm truyền
Outbuffercount: trả lại một số hoặc một ký tự trong bộ đệm truyền Output: ghi dữ liệu ra bộ đệm truyền
c. Phần điều khiển có sự bắt tay
Break: đặt hoặc xóa đi tín hiệu bị hỏng Cdholding: trả lại trạng thi của CD
CTSHoding: trả lại trạng thi của CTS DSRHolding: trả lại trạng thi của DSR DTREnable: đặt hoặc xóa DTR
Handshaking: đặt vả trả lại chuẩn bắt tay RTSEnable: đặt và xóa RTS
Ví dụ:
Private Sub Form_Load Dim Buffer$ as string
‘Dùng COM1, 9600 baud, không parity, 8 bit data, 1 bit stop MSComm1.Comport=1
MSComm1. Settings=”9600, N, 8, 1” ‘Đọc toàn bộ bộ đệm
MSComm1. Inputlen=0
‘Mở cổng và gửi lệnh đến modem chế độ trả lời bằng chữ MSComm1.PortOpen=True
MSComm1.Output=”ATV1Q0” & Chr$(13) ‘Chờ trả lời “Ok”, nếu có Ok thì đóng cổng Do
DoEvents
Buffer$=Buffer$ & MSComm1.Input Loop Until InStr (Buffer$, “OK”&vbCrLf) MSComm1.PortOpen=False
End Sub
Chương trình trên dùng kỹ thuật hỏi vòng. Ta có thể dùng kỹ thuật sự kiện object.commevent. Khi có sự kiện xảy ra chương trình cho cổng object_oncomm() sẽ được gọi để xử lý các sự kiện hay các lỗi.
Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent
‘Xử lý sự kiện hay lỗi bằng cách đặt lệnh dưới mỗi phát biểu Case ‘Lỗi
Case ComEventBreak ‘Nhận Break Case ComEventFrame ‘Sai frame Case ComEventOverrun ‘Mấtdữ liệu Case ComEventRXOver ‘Đệm thu tràn Case ComEventRXParity ‘Sai parity Case ComEventTXFull ‘Đệm phát đầy Case ComEventDCB ‘Sai khi đọc DCB
‘Sự kiện
Case ComEvCD ‘Đường CD thay đổi Case ComEvCTS ‘CTS thay đổi
Case ComEvDSR ‘DSR thay đổi từ 1 xuống 0 Case ComEvRing ‘RI thay đổi
Case ComEvReceive ‘Số byte đệm thu đạt mức Rthreshold Case ComEvSend ‘Số byte đệm phát ít hơn Sthreshold
Case ComEvEOF ‘Nhận ký tự EOF kết thúc file (mã ASCII 26) trong chuỗi nhập End Select
End Sub
3. Lập trình dùng ngôn ngữ lậptrình DELPHI 5.0 và VISUAL C++ 6.0
Hai ngôn ngữ này dùng các hàm của Win API32.
Do tính chất phức tạp của các hàm và giới hạn của giáo trình, xin trình bày vắn tắt để áp dụng vào chương trình trong Delphi. Chi tiết có thể đọc trong Win 32 Program Reference.
Mở cổng COM dùng hàm Createfile, hàm này trả về một biến (handle). Nếu không mở cổng đuợc biến trả về -1 ,đóng cổng dùng closehandle biến trả về là khác
zero, nếu trả về zero là có lỗi.
Get Commstate lấy cấu hình hiện tại của cổng cất vào khối DCB(device control block).
Set Commstate đặt cấu hình cổng theo nội dung của DCB. Purge Comm_ xoá bộ đệm vào ra, chấm dứt đọc , viết. Writefile viết data (xuất ra cổng com).
Readfile đọc cổng.
EscapeCommFinetion đặt và xóa RTS hay DTR.
4. Lập trình truy xuất trực tiếp cổng.
- Để lập trình điều khiển thiết bị ngoại vi bằng phương pháp truy xuất trực tiếp cổng ta phải nắm được địa chỉ cổng cần truy xuất, các thanh ghi điều khiển, phương thức truyền, định dạng khung dữ liệu...
- Ngôn ngữ lập trình viết trên dos của Windows.
5. Lập trình truy xuất gián tiếp thông qua driver.
Driver ở đây chính là các thư viện liên kết động cho phép người lập trình truy xuất cổng gián tiếp. Chúng hỗ trợ cta đơn giản hoá việc lập trình.
- Sử dụng phần Mscomm
+ Để có được Mscomm sau khi cài phần mềm ta phải nhập thêm đối tượng này bằng cách sau:
Chọn Component trên menu của chương trình sau đó chọn Import Actix X lúc này chương trình hiện ra một hộp thoại cho phép ta lựa chọn các đối tượng cần nhập vào. Ta tiến hàn kéo thanh cuốn dọc và lựa chọn Microsoft Comm Control 6.0 sau đó chọn Install .
Sau đó ta chọn Actix X trên thanh công cụ để lấy Mscomm ra ứng dụng + Các thuộc tính điều khiển cổng
Hình 4.5 Khai báo Import Actix X
+ Các thuộc tính khi lập trình nhận và xuất dữ liệu.
Input: nhận một chuỗi ký tự và xoá khỏi bộ đệm.
InBufferCount: số ký tự có trong bộ đệm nhận
InBufferSize: kích thước bộ đệm nhận
Output, OutBufferCount và OutBufferSize hoàn toàn tương tự nhưng là để xuất
+ Thiết lập các thuộc tính cho Mscomm
Để thiết lập thuộc tính cho Mscomm ta có thể thiết lập trong Object Inspector sau khi đã nhấp chuột vào đối tượng. Hoặc ta nháy đúp chuột vào biểu tượng của Mscomm để thiết lập thuộc tính.
Khi đó ta có các thông số cần thiết lập như sau:
Hình 4.6 Thiết lập các thông số cổng COM
Trong nhãn Generalcho ta thiết lập:
Thông số CommPort: Xác định cổng cần truyền thông.
Thông số Settingscho ta thiết lập: Tốc độ truyền: 4200b/s, 9600b/s, .... Kiểm tra chẵn lẻ với bảng sau:
Số bit dữ liệu: 4 bit, 5 bit, 7 bit, 8 bit. Số bit Stop: 1 bit ,1.5 bit, 2 bit.
Thông số Handshahing: cho phép thiết lập chế độ bắt tay hay không bắt tay khi truyền dữ liệu, mặc định là không chọn.
Hình 4.7 Thiết lập thuộc tính MSComm
InBufferSize ( bộ đệm dữ liệu đầu vào ) ta thiết lập là 1024. OutBufferSize ( bộ đệm dữ liệu đầu ra) ta thiết lập là 1024.
Trong nhãn Hardware: cho ta thiết lập các thông số để kiểm tra như: chọn tiếp việc thay thế bit kiểm tra chẵn lẻ ( Parity Replace )....
Sau khi thiết lập xong các thông số cơ bản ta nhấn OK để chấp nhận .
6. Lập trình dùng Matlab
Cho phépgiao tiếp nối tiếp giữa Matlab với thiết bị ngoại vi qua cổng nối tiếp Các lệnh dùng cho việc giao tiếp:
Instrcallback: Thông tin về sự kiện khi một sự kiện xảy ra.
Instrfind: Truy xuất các đối tượng cổng COM từ bộ nhớ để xuất ra Workspace. Instrfindall: Tìm các đối tượng cổng COM có thuộc tính ấn và không ẩn.
Readasync: Đọc dữ liệu từ thiết bị ngoại vi gửi lên theo phương thức bất đồng bộ.
Record: Lưu giữ lại dữ liệu và thông tin về sự kiện vào một tập tin. Serial: Tạo mới đối tượng cổng COM.
Serial.delete: Xóa đối tượng cổng COM khỏi bộ nhớ.
Serial.fgetl: Đọc chuỗi ký tự được gửi lên từ thiết bị ngoại vi nhưng không đọc ký tự kết thúc.
Serial.fgets: Đọc chuỗi ký tự được gửi lên từ thiết bị ngoại vi bao gồm cả ký tự