1. Trang chủ >
  2. Kỹ thuật >
  3. Điện - Điện tử - Viễn thông >

 ADC0809 được nối với 8051 nh­ sau:

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.57 MB, 84 trang )


CHƯƠNG II: THIẾT KẾ PHẦN MỀM

Từ mạch đã thiết kế, chúng em đã xây dựng 3 bài toán ứng dụng:

• Quét bàn phím HEX, hiển thị phím được Ên ra LCD.

• Đọc thời gian từ đồng hồ thời gian thực DS12887.

• Điều khiển ADC0809 biến đổi tín hiệu tương tự thành số.



I. CHUƠNG TRÌNH QUÉT BÀN PHÍM HEX.



Chương trình này thực hiện quét bàn phím HEX, kiểm tra xem có phím

nào được nhấn không. Nếu có, chuyển thành mã ASCII để hiển thị ra LCD. Nếu

không có phím nào được nhấn thì kết thúc.

• Lưu đồ của bài toán



• Lưu đồ hàm quét bàn phím



• Chương trình hợp ngữ

$debug

$tilte (**



TEST PROGRAM for the MyBOARD



**)



org



0000h



main:



call



scan



; Gọi chương trình quét bàn phím.



call



convert



; Gọi chương trình đổi Hex→ASCII.



call



display



; Gọi chương trình hiển thị ra LCD.



;========================================================;

;



Chương trình con quét bàn phím SCAN



;



;========================================================;

scan:



mov



A,#00H



mov



P1,A



mov



A,P1



; Đọc các hàng



anl



A,#0F0H



; Che các bit thấp



cjne



A,#0F0H,scan_key



; Nếu có phím Ên, gọi chương trình tìm

; phím Ên



ret



; Đưa 0 ra các cột



; Không có phím nào Ên thì thoát.



;==========================================================;

; Scan_KEY: đọc trạng thái bàn

phím.

; ;

trả về C=0 nếu

không có phím nào được Ên

; ;

trả về C=1

và mã hex của phím Ên trong ACC nếu có phím Ên.

;

;==========================================================;

scan_key: mov



R6,#4



; Dùng R6 làm bộ đếm.



mov



P1,A



; Tích cực cột.



mov



R7,A



; Lưu mẫu quét



mov



A,P1



; Đọc trở lại cổng Port1



anl



A,#0F0h



; Che các bit thấp.



cjne



A,#0F0h, tao_ma



; Có hàng tích cực, thì gọi chương trình

; tạo mã



mov



A,R7



; Nếu không, di chuyển tới cột kế.



rl



A



; quay trái A



djnz



R6,quet



clr



C



; Không có phím được Ên. Xóa C=0



sjmp

tao_ma:



; Bắt đầu quét từ cột 0.



mov

quet:



A,#0FEh



exit



; Thoát



mov



R7,A



; Lưu trong R7.



mov



A,#4



; Chuẩn bị tính trọng số cột.



clr



C



subb



A,R6



; Trọng số cột = 4-R6.



mov



R6,A



; Lưu trong R6.



mov



; Đặt trong 4 bit thấp.



R5,#4



; Dùng R5 làm bộ đếm.



rrc



A



; Quay phải A với cờ nhớ.



jnc



done



; Thực thi xong khi C=0.



inc



R6



; Cộng 4 đến khi thấy hàng tích cực.



inc



R6



inc



R6



inc



R6



djnz



R5,again



setb



C



; C=1 (có phím được Ên)



mov

exit:



A



mov



done:



; Phục hồi mã quét.



swap

again:



A,R7



A,R6



; Mã được cất trong A.



ret

ret



; Kết thúc chương trình quét.



;==========================================================;

;



Chương trình hiển thị ra LCD



;



;==========================================================;

display:



R3,A



; Cất dữ liệu trong A vào thanh ghi R3.



mov



A,#38h



; Khởi tạo LCD 2 dòng, ma trận điểm ;

5x7



call



write



; Gọi chương trình ghi lệnh điều khiển

; LCD



call



delay



; Tạo độ trễ cho LCD.



mov



A,R3



call



d_data



; Gọi chương trình hiển thị dữ liệu.



mov



P2,A



; Đưa lệnh ra.



clr



P3.7



; Đặt RS = 0 để chọn thanh ghi lệnh.



clr



P3.6



; Đặt RW = 0 để ghi lệnh.



setb



P3.4



; Đặt E = 1



clr



write:



mov



P3.4



; E = 0, tạo xung cao xuống thấp.



P2,A



; Sao chép dữ liệu cần hiển thị ra P2.



ret

d_data:



mov



setb



P3.7



; Đặt RS = 1 để chọn thanh ghi dữ liệu.



clr



P3.6



; Đặt RW = 0 để ghi dữ liệu.



setb



P3.4



;E=1



clr



P3.4



;E=0

; Tạo độ trễ



ret

delay:



mov



R2,#50



here:



djnz



R2,here



ret

ret

;========================================================;

;



Chương trình con Chuyển đổi mã HEX thành mã ASCII



;========================================================;

convert:



A,#0Fh



; Xóa các bit cao.



cjne



A,#0Ah,$+3



; So sánh xem A có nhỏ hơn 0Ah

;không?



jc



htoa



add

htoa:



anl



A,#7



; có, cộng thêm 7



add



A,#’0’



; Không, chuyển đổi trực tiếp.



ret

END



; Hết chương trình.



;



II. ĐỌC THỜI GIAN TỪ ĐỒNG HỒ THỜI GIAN THỰC RTC DS12887



Để thực hiện công việc đọc thời gian từ DS12887, trước hết ta phải tiến

hành chọn chip thông qua 74ALS138. Chân

của DS 12887 được nối với

chân Y1 của 74ALS138. Để chọn chân Y1, phải đặt A = 0, B = 1, C = 0.

Sau khi chọn chip, tiếp theo tiến hành đặt các thông số để đọc dữ liệu:

1. Đặt địa chỉ thanh ghi B của DS12887: đưa địa chỉ của thanh ghi B là 0Bh

vào R0 (của 8051). Gửi địa chỉ này đến Port 0 để gửi tới DS12887.

2. Đặt thông số cho thanh ghi B:

SET = 0 : không cho phép cập nhật thời gian bởi chương trình.

PIE = 1 : Cho phép ngắt.

AIE = 0 : Cho phép tín hiệu ngắt ở đầu ra



.



UIE = 1

SQWE = 0

DM = 0 : dữ liệu thông tin về thời gian được định dạng BCD.

= 1: Chế độ thời gian 24h.

DSE = 0 : Không sử dụng chế độ giê mùa đông.

Ta chỉ quan tâm tới bit SET, PIE, DM,

B trong bài toán này không cần chú ý tới.



, các bit còn lại của thanh ghi



3. Đọc thời gian :

- Địa chỉ byte giê trong DS12887 là 04h. Đọc xong lưu vào R2(của

8051).

- Địa chỉ của byte phót trong DS12887 là 02h. Đọc xong lưu vào thanh

ghi R3 (của 8051).

- Địa chỉ của byte giây trong DS12887 là 00h. Đọc xong lưu vào thanh

ghi R4( của 8051).

4. Chuyển đổi dữ liệu thời gian từ mã BCD sang mã ASCII để hiển thị ra

LCD.

5. Hiển thị trên LCD.



• Lưu đồ bài toán:



• Tiến trình đọc thông tin



• Lưu đồ hàm khởi tạo LCD



• Lưu đồ hàm kiểm tra LCD



• Chương trình hợp ngữ

$debug

$tilte (**



TEST PROGRAM for the MyBOARD

org



0000h



**)



ljmp



Main



org



0003h



; Điểm nhập vector ngắt ngoài 0.



;=======================================================;

;

ngoài



Trình xử lý ngắt

;



;=======================================================;

Ex0IRS:



setb



P3.0



; Hủy bỏ việc chọn DS12887 khi

; đọc



clr



P3.1



; xong dữ liệu.



clr



EX0



; Cấm ngắt ngoài 0.



reti



; Hết chương trình xử lý ngắt.



;=======================================================;

;



Main Program



;



;=======================================================;

org



here:



call



select_chip



;Gọi chương trình con chọn

;chip.



setb



Main:



0030h



P3.6



; Cho phép ghi.



mov



A,#0Bh



;Địa chỉ thanh ghi B của

;DS12887.



mov



P0, A



; Đưa ra cổng P0.



setb



ALE



; Cho ALE = 1



clr



ALE



; ALE = 0, tạo xung cao xuống

; thấp để chân DS cho phép chốt

; địa chỉ trong DS12887.



mov



P0,#01010010b



; Đặt các giá trị điều khiển cho

; thanh ghi B của DS12887.



setb



ALE



;Tạo mức cao ở chân DS để giải

; phóng việc chốt địa chỉ.



mov



A,#0FFh



mov



P0,A



; Thiết lập P0 làm đầu vào.



mov



R0,#04h



; Địa chỉ byte giê.



clr



ALE



mov



P0,@R0



; Đọc byte giê.



Xem Thêm
Tải bản đầy đủ (.pdf) (84 trang)

×