3.4.1.Viết chương trình.
Lưu đồ thuật tốn điều khiển quá trình chỉ thị hành trình
Giải thích lưu đồ:
Sau khi khởi động, chương trình sẽ xác lập địa chỉ RAM, kiểm tra ngắt ngồi, nếu: Port 3.2 cĩ giá trị 1 sẽ thực hiện quá trình đếm lên và ngược lại sẽ thực hiện quá trình đếm xuống.
Chương trình được viết bằng một phần mềm soạn thảo văn bản bất kỳ, thường dùng Notebook vì nĩ đi kèm với Window mà khơng phải cài đặt, file xuất ra cĩ dung lượng nhỏ.
* Xác lập địa chỉ.
Dưới đây là các đoạn mã dùng để xác lập địa chỉ cho chương trình. .ORG 0H ;Bắt đầu tại địa chỉ 0000H
.ORG 30H ; Bắt đầu tại địa chỉ 30H.
*Khởi động chương trình:
LJMP MAIN ; Gọi chương trình con cĩ tên là “MAIN”. START
XÁC ĐỊNH ĐỊA CHỈ RAM
NGẮT NGOAØI
ĐẾM XUNG LÊN ĐẾM XUNG XUỐNG
NGUỒN XUNG
HIỂN THỊ LED 7 ĐOẠÏN
MAIN:
SETB IT1 ;NEGATIVE EDGED ACTION OF INTERUPT 1 MOV IE, #84H ;PERMIT INTERUPT 1
ACALL INIT
* Kiểm tra RAM:
MOV A, 26H CJNE A, #0, DOWN MOV A, 23H CJNE A, #0, DOWN MOV A, 22H CJNE A, #0, DOWN MOV A, 25H CJNE A, #0, DOWN MOV 21H, #0 CJNE A, #0, DOWN MOV 20H, #0 CJNE A, #0, DOWN
* Gọi chương trình hiển thị.
RE: LCALL DISPLAY_VALUES ;CALL DISPLAY PROGRAM SJMP RE
Đây là chương trình hiển thị:
DISPLAY_VALUES:
MOV DPTR, #CODE_LED
MOV P0, #01111111B ;Den dau tien tinh tu ben phai sang MOV A, 20H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu
MOV P0, #10111111B ;Den thu hai tinh tu ben phai sang MOV A, 21H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #11111110B ;Dau cham thap phan LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu
MOV A, 22H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu
MOV P0, #11101111B ;Den thu tu tinh tu ben phai sang MOV A, 23H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu
MOV P0, #11110111B ;The digit third right is light MOV A, 24H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu RET
* Mã hiển thị của LED:
CODE_LED: DB 00000011B ;Number 0 DB 10011111B DB 00100101B DB 00001101B DB 10011001B DB 01001001B DB 01000001B DB 00011111B DB 00000001B DB 00011001B ;Number 9 END
* Phân vùng hiển thị (chương trình con INIT):
INIT: MOV 20H, #00H ; So thu nhat MOV 21H, #00H ; So thu hai MOV 22H, #00H ; So thu ba MOV 23H, #00H ; So thu tu
MOV 25H, #00H MOV 26H, #00H
RET
* Lệnh gọi ngắt:
EX1ISR: JB P3.2, UP ; COUNTING UP IF P3.2 IS HIGH
* Chương trình xử lý:
UP: INC 25H MOV A, 25H
MOV B, #20 ; Mot xung ung voi con chay dich chuyen 1 doan 2mm MUL AB CJNE A, #100, XULI1 MOV 25H, #0 INC 26H MOV A, #0 SJMP XULI1 DOWN: MOV A, 25H
MOV B, #20 ; Mot xung ung voi con chay dich chuyen 1 doan 2mm MUL AB CJNE A, #0, XULI2 MOV 25H, #5 DEC 26H MOV A, #80 MOV B, #10 DIV AB MOV 20H, B MOV 21H, A MOV A, 26H MOV B, #10 DIV AB MOV 22H, B MOV 23H, A RETI XULI1: MOV B, #10 DIV AB MOV 20H, B MOV 21H, A MOV A, 26H MOV B, #10
DIV AB MOV 22H, B MOV 23H, A RETI XULI2: DEC 25H MOV A, 25H MOV B, #20 MUL AB MOV B, #10 DIV AB MOV 20H, B MOV 21H, A MOV A, 26H MOV B, #10 DIV AB MOV 22H, B MOV 23H, A RETI
* Duy trì quá trình hiển thị:
DELAY1:
MOV R7, #250 DJNZ R7, $ RET
Đây là chương trình hồn chỉnh:
;--- .ORG 0H
LJMP MAIN
LJMP EX1ISR ; Interupt vector 1 .ORG 30H
;--- ; INTERUPT VECTOR
;---
EX1ISR: JB P3.2, UP ; Dem len neu P3.2 o muc cao,
MOV A, 26H ; nguoc lai se dem xuong
CJNE A, #0, DOWN ; Kiem tra RAM MOV A, 23H CJNE A, #0, DOWN MOV A, 22H CJNE A, #0, DOWN MOV A, 25H CJNE A, #0, DOWN MOV 21H, #0 CJNE A, #0, DOWN MOV 20H, #0 CJNE A, #0, DOWN LCALL DISPLAY_VALUES RETI UP: INC 25H MOV A, 25H
MOV B, #20 ; Mot xung ung voi con chay dich chuyen 1 doan 2mm MUL AB CJNE A, #100, XULI1 MOV 25H, #0 INC 26H MOV A, #0 SJMP XULI1 DOWN: MOV A, 25H
MOV B, #20 ; Mot xung ung voi con chay dich chuyen 1 doan 2mm
CJNE A, #0, XULI2 MOV 25H, #5 DEC 26H MOV A, #80 MOV B, #10 DIV AB MOV 20H, B MOV 21H, A MOV A, 26H MOV B, #10 DIV AB MOV 22H, B MOV 23H, A RETI XULI1: MOV B, #10 DIV AB MOV 20H, B MOV 21H, A MOV A, 26H MOV B, #10 DIV AB MOV 22H, B MOV 23H, A RETI XULI2: DEC 25H MOV A, 25H MOV B, #20 MUL AB MOV B, #10 DIV AB MOV 20H, B MOV 21H, A MOV A, 26H MOV B, #10 DIV AB MOV 22H, B MOV 23H, A RETI
;--- INIT: MOV 20H, #00H ; So thu nhat MOV 21H, #00H ; So thu hai MOV 22H, #00H ; So thu ba MOV 23H, #00H ; So thu tu MOV 25H, #00H MOV 26H, #00H RET ;--- ; DISPLAY PROGRAM ;--- DISPLAY_VALUES: MOV DPTR, #CODE_LED
MOV P0, #01111111B ;Den dau tien tinh tu ben phai sang MOV A, 20H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu
MOV P0, #10111111B ;Den thu hai tinh tu ben phai sang MOV A, 21H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #11111110B ;Dau cham thap phan LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu
MOV P0, #11011111B ;Den thu ba tinh tu ben phai sang MOV A, 22H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu
MOV P0, #11101111B ;Den thu tu tinh tu ben phai sang MOV A, 23H
MOVC A, @A+DPTR MOV P2, A
MOV P2, #0FFH ;Khu nhieu
MOV P0, #11110111B ;The digit third right is light MOV A, 24H
MOVC A, @A+DPTR MOV P2, A
LCALL DELAY1
MOV P2, #0FFH ;Khu nhieu RET ;--- ; DELAY PROGRAM ;--- DELAY1: MOV R7, #250 DJNZ R7, $ RET ;--- ; MAIN PROGRAM ;--- MAIN:
SETB IT1 ;NEGATIVE EDGED ACTION OF INTERUPT 1 MOV IE, #84H ;PERMIT INTERUPT 1
ACALL INIT
RE: LCALL DISPLAY_VALUES ;Goi chuong trinh hien thi SJMP RE ;--- CODE_LED: DB 00000011B ;Number 0 DB 10011111B DB 00100101B DB 00001101B DB 10011001B DB 01001001B DB 01000001B DB 00011111B DB 00000001B DB 00011001B ;Number 9 END
3.4.2.Biên dịch chương trình.
Chương trình sau khi viết phải được biên dịch, sau đĩ mới nạp vào IC. Sau đây là các bước để biên dịch chương trình : DO_DAI.ASM
- Sử dụng chương trình "X8051" để kiểm tra lỗi và biên dịch thành: *.OBJ
- Sử dụng "LINK" để biên dịch *.OBJ thành *.HEX
Hình 3.16: Biên dịch File *.OBJ thành *.HEX bằng “LINK”.
3.5 .Lắp ráp – Nạp chương trình - Chạy thử. 3.5.1.Lắp ráp:
Thứ tự lắp ráp:
- Hệ truyền động cơ khí bao gồm bánh răng, dây đai.
- Đặt vị trí led thu phát sao cho hai xung ra vuơng gĩc 900. Để thực hiện điều này, địi hỏi sự tỷ mỹ và khéo léo. Ta chưa vội nối xung vào board chính, thay vào đĩ là hai đèn led, quan sát sự sáng tắt của chúng mà cân chỉnh cho phù hợp dựa vào sơ đồ sau:
-
A B
Hình 3.17. Bố trí LED Thu - Phát
- Lắp mạch khử nhiễu.
- Lấy tín hiệu ra từ mạch khử nhiễu nối đến board chính.
*Lắp ráp Board chính.
- Thiết kế mạch trên phần mềm OrCad. - In mạch trên mạch in.
- Nhúng mạch in trong acid để rửa trơi lớp đồng cĩ trên mạch in mà khơng được phủ lớp bảo vệ.
- Sấy khơ.
3.5.2.Nạp chương trình.
a. Mạch nạp chương trình cho IC AT89C51:
Nguồn:
12VAC – 16VAC.
Hoặc:
15VDC – 20VDC.
Trước khi chạy chương trình nạp cần phải kết nối cổng COM của máy tính với Card nạp dữ liệu. Xem hình sau:
Hình 3.18: Mạch nạp chương trình cho IC AT89C51
b. Chương trình nạp dữ liệu cho IC:
Sử dụng chương trình nạp ROM MCS-51 Version 1.5 của tác giả Lê Đỗ Nam Bình. Dưới đây là giao diện của chương trình:
Hình 3-20: Giao diện chương trình nạp chương trình cho AT89C51
Cũng giống như các phần mềm khác, giao diện gồm thanh trạng cơng cụ chuẩn chứa các menu như Thốt, mở, lưu File và các nút chức năng khác. Nhìn chung, giao diện này tương đối dễ sử dụng.
* Cách sử dụng chương trình:
- Kết nối phần cứng như hướng dẫn trên.
- Chọn IC tại thanh thanh sổ xuống ở gĩc trên phải màng hình, ở đây em chọn AT89C51.
- Mở File đã được biên dịch.
- Chọn nút Ghi để ghi dữ liệu lên IC.
- Chọn Lock Bit để khố IC lại nếu cảm thấy cần thiết (tính bản quyền của sản phẩm).
Cĩ thể bấm nút Xố để xố dữ liệu trong IC trước thao tác Mở File, tuy nhiên, ở gốc dưới phải màng hình tác giả đã để mặc định chức năng Xố IC trước khi nạp (đánh dấu kiểm tại đây) nên khơng cần làm thao tác này.
IC sau khi nạp cĩ thể cho vào mạch chạy thử.
3.5.3.Chạy thử:
Đây là cơng đoạn cuối cùng của việc thiết kế-chế tạo: chạy thử. - Đưa con chạy về mốc: “0”, nhấn “Reset”.
- Di chuyển con chạy theo chiều từ trái sang phải, mạch thực hiện quá trình đếm lên.
- Di chuyển con chạy theo chiều từ phải sang trái, mạch thực hiện quá trình đếm lùi.
* Hình ảnh chạy thử chương trình đếm xung:
* Hình ảnh chạy thử chương trình đo chiều dài:
3.6.Kết quả – Thảo luận. 3.6.1.Kết quả:
Sau quá trình chạy thử, mạch hoạt động gần như đạt những yêu cầu đề ra ngay lúc đầu, cĩ thể chỉ thị được cả hai hành trình đi và về.
3.6.2.Thảo luận:
Mặc dầu đã đáp ứng được yêu cầu, tuy nhiên trong quá trình chạy thử, vẫn phát sinh một số vấn đề:
1- Khi ngừng đếm tới, thử nghiệm quá trình đếm lùi, mạch vẫn đếm thêm một xung nữa ứng với khoảng dịch chuyển 2mm.
* Cĩ hai nguyên nhân dẫn đến hiện tượng này:
- Thứ nhất, các lỗ chia trên đĩa khơng đều, tín hiệu vào chân D của IC 74LS74 đang ở mức thấp chuyển sang mức cao nếu tín hiệu vào Clock tích cực (sườn dương) cuối quá trình thì đúng. Tuy nhiên, trên thực tế đơi lúc nĩ lại tích cực sớm hơn lý thuyết vì vậy nĩ sẽ chốt tín hiệu vào chân D của 74LS74 (mức thấp) vì vậy nĩ vẫn thực hiện quá trình đếm lên.
- Thứ hai, việc điều chỉnh độ lệch 900 giữa hai xung ra trên thực tế phải nhờ tới một thiết bị chuyên dùng (Ossillo) để đo và cân chỉnh. Ở đây, em đã thực hiện quá trình cân chỉnh bằng thị giác qua sự sáng tắt của hai led. Vì vậy, vẫn cịn mang tính cảm tính nhiều. Kết quả là độ lệch của hai xung chưa đáp ứng yêu cầu. 2- Xuất hiện hiện tượng “trượt” xung khi dịch chuyển với tốc độ cao.
Đây là một hiện tượng đã được tính tới từ trước khi thực hiện vì một nguyên nhân: chất lượng LED Thu – Phát. Vì khơng phải là LED chuyên dụng nên độ nhạy cịn ở mức hạn chế, sẽ sinh ra hiện tượng “trượt” nếu ta dịch chuyển con chạy với tốc độ cao do LED đã “bỏ qua” một hay một vài xung nào đĩ.
3- Trong lúc hoạt động đơi lúc chương trình báo lỗi, lỗi này do nhiều nguyên nhân trong đĩ cĩ thể là do dịch chuyển quá nhanh hoặc cĩ thể vì một lý do nào đĩ chương trình “set” về mức 0, do khơng đếm số âm nên cũng xuất hiện lỗi... sau những lỗi này hoặc chương trình sẽ ngừng đếm hoặc sẽ vẫn tiếp tục nhưng kết quả khơng hiển thị chính xác.
KẾT LUẬN
Qua thời gian tìm hiểu, nghiên cứu, đến nay, luận văn cơ bản đã hồn thành. Thiết bị chỉ thị hành trình của cơ cấu chuyển động thẳng đã được chế tạo và đi vào giai đoạn thử nghiệm đến nay căn bản đã hồn tất.
Qua khoảng thời gian thực hiện đề tài, em đã thực hiện được một số cơng việc sau:
Ø Tìm hiểu, khảo sát chức năng và cơng dụng của vi điều khiển họ