Yêu cầu khi làm trên Proteus: Vẽ mô phỏng trên Proteus, lập trình cho 8051 thực hiện chương trình đọc trạng tháicủa các nút nhấn và bật tắt các đèn LED tương ứng tương ứng là nút nhấn vớ
Trang 1BÁO CÁO BÀI TẬP LỚN
MÔN VXL LỚP L16 – NHÓM 10 – ĐỀ TÀI 7
Họ tên – MSSV:
BẢNG PHÂN CHIA CÔNG VIỆC CỦA CÁC THÀNH VIÊN TRONG
NHÓM
1 2013288 Hoàng Văn Huy Viết thuật toán cho chương trình+Code
chính
100%
2 2013143 Lê Trung Hiếu Giãi mã địa chỉ,Thiết kế phần cứng, dò và
điều chỉnh lại code để hoàn thành BTL 100%
3 2012674 Phạm Đăng Bảo Giãi mã địa chỉ, Thiết kế phần cứng 100%
Trang 21 ĐỀ TÀI [SỐ THỨ TỰ CỦA ĐỀ TÀI]
Thiết kế mạch điện tử sử dụng vi xử lý 8051 và một vi mạch 74’138 cùng các cổng logic, vi mạch cần thiết khác để điều khiển 10 đèn LED và giao tiếp với 10 nút nhấn đượccho tại địa chỉ sau
1.1 Yêu cầu khi làm trên Proteus:
Vẽ mô phỏng trên Proteus, lập trình cho 8051 thực hiện chương trình đọc trạng tháicủa các nút nhấn và bật tắt các đèn LED tương ứng (tương ứng là nút nhấn với LED có sốgiống nhau) Nút nhấn khi nhấn vào sẽ bật đèn, nhấn vào lần nữa sẽ tắt đèn Nếu không
có lệnh tắt đèn trong vòng 10 giây thì sau 10 giây đèn sẽ tự động tắt
Trang 32 THIẾT KẾ MÔ PHỎNG TRÊN PROTEUS.
2.1 Sơ đồ khối tổng quan
2.1.1 Sơ đồ khối tổng quan
Trang 4Chân (Pin) Kiểu chân Chức năng
Port 0 Inout (Theo sơ đồ mũi tên
Port 2 Output (theo sơ đồ mũi
tên chỉ đi qua EPROM) Xuất ra tín hiệu giải mã địa chỉ để chọnvùng địa chỉ cần truy xuấtOUTPUT Xuất tín hiệu cho phép ra các Led
OUTPUT Xuất tín hiệu cho phép khi nhận dữ liệu từ
các Switch
2.2.2 Chống rung nút nhấn
- Vì nút nhấn thường có hiện tượng rung phím Do phần cứng phản xạ cực nhanh với các tiếp xúc,nên khi trong quá trình nhấn nút như trên thì phần cứng nó
Trang 5hiểu rằng bạn nhấn công tắc nhiều lần nên ta dùng tụ 1nF để khắc phục hiện tượng trên
2.2.2.2: 74HC573(2)
Trang 6Chân (Pin) Kiểu chân Chức năng
Trang 7Từ bảng phân vùng trên, ta thấy CS0, CS1,CS2 thì A15 đều = 0 , chỉ có CS3 có phân vùng chứa A15=1 nên ta chọn A15 làm ngõ vào chân E2 và E3 cho thuận tiện, chân E1 cho tích cực cao , 3 ngõ vào C B A của IC 74LS138 là A14,A13,A12
Để thuận tiện cho việc thiết kế mạch giải mã địa chỉ một cách đơn giản, ta lập bảng phân chia nhỏ phân vùng của các /CS phụ thuộc vào các ngõ ra của IC 74LS138 như sau:
Dựa vào bảng trên , ta tiến hành thiết kế các /CS như sau:
-Để có thể tách vùng địa chỉ ta dùng cổng OR cho tín hiệu tích cực thấp.
-Để có thể gộp vùng địa chỉ ta dùng cổng AND cho tín hiệu tích cực thấp.
Thiết kế /CS0:
Trang 8Vùng địa chỉ /CS0 bao gồm 2 phân vùng gộp lại gồm:
Từ 0000H - 1FFFH : phân vùng này bao gồm 2 vùng /Y0 và /Y1 gộp lại
Vùng địa chỉ /CS1 bao gồm 3 phân vùng gộp lại gồm:
Từ 2400H-2FFFH : phân vùng này tách ra từ vùng /Y2 với điều kiện 1 trong 2địa chỉ A10 và A11 bằng 1
Vùng địa chỉ này bao gồm 4 phân vùng gộp lại gồm:
Từ 4600H – 4FFFFH :đây là phân vùng còn lại của /Y4 sau khi dùng cho vùngCS1
=>
Trang 9 Từ 5000H – 5FFFH : đây là phân vùng của toàn bộ /Y5
Từ 6000H -6FFFFH :đây là phân vùng của toàn bộ /Y6
Từ 7000H – 77FFH : đây là phần vùng của /Y7 với điều kiện A11 tích cực thấp
=>
=> /CS2 = ( ). (
Thiết kế /CS3
Vùng địa chỉ này bao gồm 4 phân vùng gộp lại gồm:
Từ 7800H – 7FFFH:đây là phân vùng của /Y7 với điều kiện A11 tích cực cao
Trang 103 ASSEMBLY CODE FOR 8051
3.1 Sơ đồ giải thuật chương trình chính.
Trang 11Sau khi Reset (là mới nạp lại code, chạy từ đầu), chương trình chạy qua phần Setup -
là bước cấu hình cho các đèn tắt , khai báo ngắt Timer 1 , chọn ô nhớ có địa chỉ 41H và 42H để lưu trạng thái hoạt động của các LED 0- 9 Với 5 bit thấp của ô nhớ 41H dùng để lưu trạng thái hoạt động của các LED 0-4, 5 bit thấp của ô nhớ 42H dùng để lưu trạng thái hoạt động của các LED 5-9
+ Quy tắc : bit 0 là trạng thái LED tắt , bit 1 là trạng thái LED bật
- Sau đó chương trình vào vòng lập vô tận, trong vòng lập này làm nhiệm vụ:
+ Thực hiện đọc tín hiệu từ các SW về vi xử lí bằng 2 dòng lệnh :
MOV DPTR, #S1ADR ( S1ADR là địa chỉ giao tiếp ngoại vi với SW)
MOVX A,@DPTR
Trang 12+ Dùng Port P1 để lưu tín hiệu từ các SW , sau đó kiểm tra lần lượt các SW nào được nhấn Dùng ô nhớ 40H ( biến mặt nạ ) để đánh dấu SW nào được tác động, bit tương ứng của ô nhớ 40H với SW sẽ được SETB lên 1.
+ Khi nhận thấy có SW được tác động, ta sẽ chuyển đến phần xử lí tín hiệu bằng các dòng lệnh
MOV A,40H ; cho A = MASK
XRL A,41H ; tiến hành XOR với MASK
MOV 41H,A ; cập nhật lại trạng thái mới của các LED
Bit mask BIT trạng thái Bit trạng thái mới
Trang 133.2 Sơ đồ giải thuật các chương trình ngắt (nếu có)
- Sau khi nhận được tín hiệu cờ báo tràn TF1 = 1, chương trình sẽ chuyển đến phần
ngắt, ta tiến hành cấu hình lại cho Timer 1 với thời gian delay là 50ms
- Tiến hành kiểm tra trạng thái của các đèn LED Dùng các ô nhớ từ 21H đến 2AH
làm biến để đếm số lần sáng của LED ( 1 lần tương ứng khoảng 50ms )
- Đèn có bit tương ứng có giá trị bằng 1 ( tức đang được bật ) sẽ được tăng biến đếm
lên 1 Đèn có bit tương ứng có giá trị bằng 0 ( tức đã tắt ) sẽ bị xóa về 0
Trang 14- Sau đó chương trình kiểm tra các biến đếm nào đạt giá trị khoảng 200 lần ( tức
khoảng thời gian đèn sáng 10s, vì lí do sai số nên ta chỉ chọn giá trị gần bằng 200 lần ) thì chương trình sẽ nhảy đến phần xử lí dữ liệu để tiến hành tắt LED tương ứng
- Sau khi kết thúc chương trình phục vụ ngắt sẽ quay về chương trình chính đang
thực hiện trước đó để tiếp tục thực hiện công việc của mình
Trang 16ORG 2000H
INIT: ; khởi tạo các giá trị ban đầu
MOV 41H,#0 ; ô nhớ 41H để đánh dấu trạng thái bật tắt của led 0-4
MOV 42H,#0 ; ô nhớ 42H để đánh dấu trạng thái bật tắt của led 5-9
MOV A,#0FFH
MOV DPTR,#L1ADR ; điều chỉnh ban đầu tất cả các đèn 0-4 đều tắt
MOVX @DPTR,A
MOV DPTR,#L2ADR
MOVX @DPTR,A ; điều chỉnh ban đầu tất cả các đèn 5-9 đều tắt
MOV TMOD,#10H ; khai báo ngắt timer1
MOVX A,@DPTR ; cập nhật trạng thái các nút nhấn lưu vào thanh ghi A
MOV P1,A ; cho P1= A
MOV A,#0
JB P1.0,NEXT1 ; xét Sw0 có được nhấn hay không , nếu = 1 tức không được nhấn,nhảy đến xét Sw kế tiếp
MOV 40H,#01H ; nếu được nhấn thì cho MASH = 01H
LOOP0: ; Vòng lặp kiểm tra liên tục xem SW0 được nhả hay chưa
MOVX A,@DPTR
MOV P1,A
JNB P1.0,LOOP0
JMP ON1 ; khi được nhả rồi thì nhảy đến bước truyền tín hiệu để bật LED0
NEXT1: ; tương tự như SW0
Trang 17ON1: ; Bước truyền tín hiệu cho các LED 0-4
MOV A,40H ; Cho A = MASK
XRL A,41H ; Cho ( MASK) XOR ( TRẠNG THÁI CÁC LED) Khi XOR vớiMASK thì các bit trạng thái của LED XOR với 0 thì sẽ giữ nguyên trạng thái, XOR với 1thì bị đảo bit
Nên đèn đang bật bị tác động sẽ tắt và ngược lại Các đèn không tác động thì giữnguyên trạng thái
MOV 41H,A ; lưu lại giá trị trạng thái vừa cập nhật vào ô nhớ 41H
CPL A ; Vì các led là anot chung nên phải đảo bit các trạng thái
MOV DPTR,#L1ADR ; cập nhật tín hiệu cho các LED 0 -4
Trang 19MOVX @DPTR,A
NEXT10:
JMP START
ISR_T1: ; phần ngắt ứng dụng đếm thời gian 10s
PUSH ACC ; cất giá trị A trong CTR chính vào ngăn xếp
CLR TR1
MOV TH1,#HIGH(-50000)
MOV TL1,#LOW(-50000)
SETB TR1
MOV A,41H ; xét trạng thái của LED 0 hiện tại
JNB ACC.0,SW1 ; nếu LED đang tắt thì nhảy đến nhãn SW1 để xóa bộ đếm số lần về0
MOV R0,#21H ; nếu LED vẫn bật thì tăng giá trị lên 1
CJNE @R0,#0C4H,LED2 ; nếu chưa đủ thì xét đèn kế tiếp
MOV A,41H ; nếu đủ rồi thì tiến hành tắt LED
JMP EXIT ; thoát khỏi ngắt
LED2: ; tương tự LED 0