1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

báo cáo thí nghiệm vi xử lý

42 284 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 42
Dung lượng 688,4 KB

Nội dung

Bài 1: Thí nghiệm với LED đơn Chớp tắt đèn p1.0 với chu kì là 500ms Thuật toán: tạo vòng lặp liên tục chớp tắt đèn với chu kì là 500ms Lưu đồ thuật toBài 1: Thí nghiệm với LED đơn Chớp tắt đèn p1.0 với chu kì là 500ms Thuật toán: tạo vòng lặp liên tục chớp tắt đèn với chu kì là 500ms Lưu đồ thuật toán:án:

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA

TP.HỒ CHÍ MINH - -

Thành viên nhóm: MSSV:

Đinh Xuân Tuế 41104041

Đỗ Mạnh Thưởng

Nguyễn Đức Bình 41100298 Nguyễn Hữu Thạnh 41003060

Trang 2

Bài 1: Thí nghiệm với LED đơn

Chớp tắt đèn p1.0 với chu kì là 500ms

Thuật toán: tạo vòng lặp liên tục chớp tắt đèn với chu kì là 500ms

Lưu đồ thuật toán:

PUSH 05 ;chương trình delay 500s

PUSH 06 ;đặt để cất giá trị ở thanh ghi r5 r6 r7 vào ngăn xếp PUSH 07

DELAY 500ms

Trang 3

;ngăn xếp để bảo tồn giá trị

; ( theo quy tắc cất trước thì lấy sau) POP 06

POP 05

RET

END

Bài 2: Thí Nghiệm Hiển Thị LED

Hiển thị đèn LED từ 0 đến 9 sau đó lặp lại

Thuật toán: sử dụng thanh ghi DPTR để kết nối LED bằng cách move địa chỉ thanh

ghi DPTR vào địa chỉ #0000H Lựa chọn đèn LED nào sáng vào hiển thị giá trị số nào bằng cách gán nội dụng vào thanh ghi DPTR (đó là @DPTR) (sử dụng 8 bit) 4 bit đầu quy định led nào sẽ sáng 4 bit sau quy định số sẽ sáng

VD: chọn LED số 4 thì LED số 4 phải ở mực thấp: 1110E, hiển thị số 0 thì nội dụng @DPTR phải là #0E0H

Tương tự: LED 3 hiển thị số 2: 1101 0010  @DPTR là #0D2H

LED 2 hiển thị số 1: 1011 0001  @DPTR là #0B2H

Sử dụng vòng lặp tăng giá trị lên Dùng delay điều chỉnh thời gian thi hành chậm lại

để có thể lưu ảnh trong mắt người quan sát Đồng thời kiểm tra nếu quá 9 sẽ trở lại về

0 (sử dụng CJNE)

Lưu đồ thuật toán:

ORG

DPTR#0000H A#0E0H

@DPTRA DELAY INC A

A>9 N

Trang 4

Source code:

ORG 2000H

MOV DPTR,#0000H ; truy xuất đến LED

AGAIN: MOV A, #0E0H ;gán A là 1110 0000B

NEXT: MOVX @DPTR, A ;Đưa A vào nội dung thanh ghi

DPTR

;( bằng cách mov vào @DPTR) LCALL DELAY ;Gọi delay để có thời gian chờ để lưu

DELAY: MOV R7,#10 ;vòng lặp delay sử dụng timer 1

LAP1: MOV TMOD,#01H

MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0

JNB TF0,$

CLR TR0 CLR TF0 DJNZ R7,LAP1 RET

END

Bài 3:Thí Nghiệm Hiển Thị LCD

Hiển thị chữ ‘HELLO’ trên màn hình LCD

Thuật toán: -Sử dụng thanh ghi DPTR để kết nối LCD bằng cách move địa chỉ thanh

ghi DPTR vào địa chỉ #8000H

-Viết 2 chương trình con:

Y

Trang 5

+Thứ nhất: chương trình con nhận lệnh truyền đến để thực hiện (WRITE) Để nhận lệnh thì ta phải setb p3.4 và clr p3.5 Chương trình này giúp LCD nhận lệnh từ máy như xóa màn hình LCD, hiển thị kiểu nào, con trỏ ở đâu.v v

+Thứ hai: chương trình nhận kí tự xuất ra LCD hiển thị (WRITE_TEXT) Để nhận chuỗi kí tự ta phải setb p3.4 và cả p3.5

-Viết chương trình con khởi động LCD (tên là LCD) với phổ biến là truyền 3 lệnh sau:

+#06H: hiển thị tăng và không shift +#0EH: hiển thị cursor nhưng không hiển thị blinking +#38H: giao tiếp 8 bit, 2 dòng với font 5x8

-Viết chương trình con lấy kí tự từ bảng (là chuỗi kí tự muốn hiển thị) (chương trình con BANG)

-Viết chương trình con delay để tạo độ trễ Để có thể xuất hiện từng chữ một trên LCD

-Chương trình chính:

+Khởi động LCD

+Xóa màn hình đang hiện thị trên LCD bằng cách truyền lệnh #01H +Tạo vòng lặp hiển thị từng chữ một trên LCD bằng cách tra bảng

Trang 6

Lưu đồ thuật toán:

ORG

DPTR#8000H CALL LCD ; khởi động LCD

A#01H CALL WRITE ;xóa màn hình

R5#5 A#0 R4#0

CALL BANG CALL WRITE_TEXT R4R4+1 AR4 R5R5-1

R5=0

SJMP $ ; lặp tại chỗ để chương trình không kết thúc

N

Y

Trang 7

Source code:

ORG 2000H

MAIN:

MOV DPTR , #8000H ;Truy xuất đến LCD

CALL LCD ;Khởi động LCD cài đặt thông số cần thiết MOV A,#01H ;cho A=#01H để truyền lệnh vào

;LCD xóa màn

; hình LCD CALL WRITE

MOV R5,#5 ;Tạo vòng lặp 5 lần ứng với

;chữ HELLO có 5 kí tự MOV A,#0 ;Khởi tạo A bằng đầu từ kí tự thứ nhất MOV R4,#0 ;Khởi tạo biến đếm để tăng giá trị A

; (vì A dễ thay đổi trong quá trình làm) LAP: CALL BANG ;Gọi bảng mang kí tự

CALL WRITE_TEXT ;Hiển thị lên LCD

INC R4 ;Tăng biến đêm R4 để gán vào A

MOV DPTR,#TABLE ;gọi bảng

MOVC A,@A+DPTR ;Gán vào A kí tự thứ A của chuỗi kí tự RET

LCD: ;Khởi động LCD

MOV A,#38H ;truyền lệnh cho LCD giao tiếp 8 bit,

; 2 dòng với font 5x8 LCALL WRITE

MOV A,#0EH ;truyền lệnh cho LCD hiển thị cursor nhưng

;không hiển thị blinking LCALL WRITE

MOV A,#06H ; truyền lệnh cho LCD hiển

;thị tăng, không shift LCALL WRITE

RET

WRITE_TEXT: ;hiển thị kí tự trong thanh ghi A bằng LCD

MOV DPTR,#8000H ;Truy xuất đến LCD

SETB P3.4 ;Khởi động chế độ

Trang 8

SETB P3.5 ;Bật chế độ nhận kí tự hiển thị ra LCD MOVX @DPTR,A ;Nhận kí tự qua từ thanh ghi A vào nội dung

; DPTR (là @DPTR)

;để hiển thị CLR P3.4 ;Kết thúc chế độ

LCALL WAIT

RET

WRITE: ;nhận lệnh từ thanh ghi A vào LCD

MOV DPTR,#8000H ;Truy xuất đến LCD

Về cơ bản, phần cứng đã có trong giáo trình Phần này ta sử dụng thêm hiển thị LCD

đã được nói ở thí nghiệm trước

Lưu ý: xác định chính xác tốc độ baud Trên LCD do hiển thị có 2 hàng mỗi hang 16

ký tự, nhưng thực tế thì

Yêu Cầu: Viết chương trình nhập 1 ký tự từ cổng nối tiếp hiển thị lên CLD đồng thời

phát ra cổng nối tiếp

Trang 10

Lưu đồ giải thuật:

Code:

ORG 2000H

MOV SCON,#52H ; cổng nối tiếp , chế độ 1

MOV TMOD,#20H ; time 1 mode 2

MOV TH1,#-3 ; Trị nạp cho 19200 baud

SETB TR1 ; cho time 1 chạy

MOV A,#01H ; xóa màn hình LCD

Yes

Nhảy tại chỗ chờ lệnh kế tiếp

No

Trang 11

JNB TI,$ ; Chờ phát xong byte trước đó

CLR TI ;Chuẩn bị phát byte kế tiếp

Trang 12

RET

WRITE_TEXT:

MOV DPTR,#8000H SETB P3.4

SETB P3.5

MOVX @DPTR,A CLR P3.4

LCALL WAIT

RET

WRITE:

MOV DPTR,#8000H SETB P3.4

CLR P3.5

MOVX @DPTR,A CLR P3.4

DJNZ R7,LAP1 RET

END

Trang 13

5) Điều Khiển ADC:

Lý thuyết cơ bản:

Về cơ bản, phần cứng đã có trong giáo trình Phần này ta sử dụng thêm hiển thị LCD đã được nói ở thí nghiệm trước Tuy nhiên lưu ý thêm về hoạt động và thiết kế của ADC0809 đã được nêu trong giáo trình

Lưu ý:

Lưu ý các lệnh giao tiếp với ADC

Cách hiện thị số nhị phân (hiện đang thể hiện giá trị thập phân )

Yêu cầu: Viết chương trình thực hiện đọc điện áp kênh 0 và hiển thị lên LCD

Giá trị có thay đổi

Nhảy tại chỗ

Trang 14

Lưu ý: Lưu đồ giải thuật của LCD đã được nói tại phần LCD

MOV DPTR,#4000H ;Giao tiếp với ADC địa chỉ

; ADC với kênh MOVX @DPTR,A ;Lệnh chuyển đổi kênh tương ứng MOV R7,#50 ;Delay rất quan trọng để đợi giá trị của ADC DJNZ R7,$

MOVX A,@DPTR ; đọc ngoại vi để lấy giá trị

MOV B,#05H

MUL AB ; thực hiện phép nhân A.B

MOV R3,A ; bit thấp vào R3

MOV A,B ;bit cao chuyển vào A

MOV DPTR,#TABLE ; hiển thị số Giao tiếp với LCD MOVC A,@A+DPTR

Trang 15

MOV A,R3 ; Lấy bit thấp

MUL AB ; Hiển thị chữ số thập phân thứ nhất

; sau dấu phẩy MOV A,B ;chuyển bit cao vào A

MOV DPTR,#TABLE ; Hiển thị số Giao tiếp với LCD MOVC A,@A+DPTR

Trang 17

6) Thí nghiệm giao tiếp cảm biến nhiệt độ

ĐỀ BÀI :Viết chương trình đo và hiển thị nhiệt độ lên LCD

CHUẨN BỊ:

- Cách sử dụng giao thức 1-Wire

- Datasheet DS18S20

- Các chương trình con liên quan tới LCD ở các bài trước

Một vài chú ý trước khi viết code

Định dạng thanh ghi nhiệt độ

Bit S ở đây đóng vai trò là bit dấu

Tuy nhiên bài toán của chúng ta là đo nhiệt độ phòng Nên mình xin phép bỏ qua bit dấu luôn cho nó là 0 ( tức nhiệt độ luôn dương) Ta chỉ xét 8 bit thấp qui định giá trị của nhiệt độ phòng Mộ điểm lưu ý nữa là vì nhiệt độ phòng nên bỏ qua việc so sánh với giá trị TH,TL vì nhiệt độ phòng ta thí nghiệm luôn nằm trong khoảng âm 55 độ C tới dương 85 độ C

Bài này ta sẽ truy xuất với DS18S20 thông qua port P3.2

Trang 18

Sơ đồ định thì khởi động DS1820 Dùng chương trình con RESET _DS1820

Theo sơ đồ thì ta sẽ tạo 1 xung reset 50% chu kì khoảng 1ms bằng cách

ban đầu CLR P3.2 sau đó delay khoảng 500 µs Set bit P3.2 delay tương ứng 500 µs

Sơ đồ định thì khe thời gian đọc/ghi

Hình 1 dùng để định thì thời gian ghi Dùng cho chương trình con WRITE_TIME

SLOT.theo sơ đồ thời gian clear P3.2 là khoảng 60 µs thời gian set là khoảng 2 µs

Trang 19

Hình 2 dùng để định thì thời gian đọc Dùng cho chương trình con READ_TIME SLOT Theo sơ đồ thời gian clear P3.2 khoảng 15 µs set là 45 µs nhưng thực tế khi viết code nó không chạy đúng tham khảo tài liệu mà mình tự mày mò dịnh thì lại thì mình định thì như trong chương trình con thì lại chạy ổn

các lệnh NOP ở đây giúp tạo thời gian delay để hoàn tất việc nhận bit Số lệnh NOP

do ta tự định thì Việc định thì là công việc khó khăn nhất ở đây !

Với đặc thù kit chỉ có 1 cảm biến nhiệt đô nên ta chỉ sử dung 1 số lệnh RO M và chức năng sau

lệnh ROM:

- SKIP ROM (CCh)

Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ nhớ của

DS1820 mà không cần gửi chuỗi mã 64 bit ROM Như vậy sẽ tiết kiệm được thời gian chờ đợi nhưng chỉ mang hiệu quả khi trên bus chỉ có một cảm biến

- READ SCRATCHPAD (BEh)

Lệnh này cho phép thiết bị chủ đọc nội dung bộ nhớ nháp Quá trình đọc bắt đầu từ bit

có ý nghĩa nhất của byte 0 và tiếp tục cho đến byte rhứ 9 (byte 8 – CRC) Thiết bị chủ

có thể xuất ra một xung reset để làm dừng quá trình đọc bất kỳ lúc nào nếu như chỉ có một phần của dữ liệu trên bộ nhớ nháp cần được đọc

Trang 20

Tạo xung reset

Gọi lệnh SKIP ROM

Cấu trúc 1 lần truy xuất DS18S20 gồm 3 lệnh Tạo 1 xung reset

1 lệnh ROM

1 lệnh chức năng

Gọi lệnh READ SCRATCHPAD Đọc nội dung bộ nhớ nháp chứa giá trị nhiệt độ

Gọi chương trình READ BYTE Đọc giá trị nhiệt độ khỏi cảm biến và lưu trên thanh ghi A

Xuất giá trị ra LCD

Trang 21

Ví dụ : giả sử muốn thao tác lệnh SKIP ROM với DS18S20

Thanh ghi A chứa giá trị 44H

Nhiệm vụ của write_time _slot:

Chuyển 1 bit dữ liệu từ C vào P3.2 khi muốn truy xuất lệnh SKIPROM thì ta sẽ

chuyển dần từng bit mã lệnh của SKIPROM là 44H vào P3.2 thông qua cờ C

Nhiệm vụ của Read_time_slot:

Đọc 1 bit dữ liệu từ P3.2 ra C khi đọc dữ liệu ra thanh ghi A ta cũng thực hiện tương

tự đọc dần từng bit thông qua cờ C

READ_TIME_SLOT: ; chương trình đọc từng bit từ DS1820 ra cờ C

CLR P3.2 ; thông qua bit P3.2

NOP

NOP

C P3.2

Trang 22

;Tức là ta dịch 8 bit WRITE_LAI:

RRC A

LCALL WRITE_TIME_SLOT

Trang 23

;hoàn tất việc dịch bit LCALL DELAY

RET ; kết thúc chương trình con giá

; trị nhị phân nhiệt độ lưu ở A DELAY: ;chương trình delay R5*2 micro giây

DJNZ R5,$

RET

DELAY_LONG: ; delay dài delay 2*255*R5

;micro giây MOV R6,#0FFH

DELAY_LAI:

LCALL DELAY

DJNZ R6, DELAY_LAI

RET

Trang 24

LCALL RESET_DS1820 ;gọi chương trình tạo xung reset MOV A,#0CCH ; gọi lệnh SKIP ROM

; Truy xuất thẳng LCALL WRITE_BYTE ; tới DS1820 vì ở đây

;chỉ có 1 cảm biến MOV A,#44H ; lệnh CONVERT T

LCALL WRITE_BYTE ; bắt đầu chuyển đổi nhiệt

; độ sang nhị phân LCALL RESET_DS1820 ; xong 1 lần truy xuất

;phải reset đợi lần kế MOV A,#0CCH ; tương tự trên gọi SKIP ROM LCALL WRITE_BYTE

MOV A,#0BEH ;lệnh READ SCRATCHPAD

LCALL WRITE_BYTE ; đọc dần ô nhớ nháp chứa

;giá trị nhiệt độ LCALL READ_BYTE ; đọc dần

CLR C ;xóa cờ C vì dùng cờ C để lưu bit 0 RRC A ; dịch phải A có cờ C để

; lưu bit vào cờ C

Trang 25

MOV P1.0,C ; A đang chứa 7 bit

; phần nguyên của nhiệt độ MOV B,#10

DIV AB ; chia A cho 10 vì giá trị

; nhiệt độ gồm 2 chữ số MOV DPTR,#TABLE

MOVC A,@A+DPTR ; A chứa số hàng chục

CALL WRITE_TEXT ; xuất số hàng chục lên LCD MOV A,B ;B chứa hàng đơn vị

MOV DPTR,#TABLE ;chuyển B vào A để xuất ra LCD MOVC A,@A+DPTR

CALL WRITE_TEXT ; xuất số hàng đơn vị ra LCD MOV A,#'.' ; xuất dấu lên LCD

CALL WRITE_TEXT

MOV C, P1.0 ;xét bit 0 tức là cờ C xem nhiệt độ

JC DOLE ; có phần thập phân hay không SJMP DOCHAN

DOLE:

MOV A,#'5' ; nếu bit 0 là 1 thì nhiệt

; độ lẻ xuất xx.5 độ C CALL WRITE_TEXT

SJMP NHAY

DOCHAN:

MOV A,#'0' ;nếu bit 0 là 0 thì nhiệt độ

;chẵn xuất xx.0 độ C CALL WRITE_TEXT

SJMP NHAY

NHAY:

CALL WAIT

Trang 26

MOV A,#'C' ; xuất chữ C lên LCD

CALL WRITE_TEXT

CALL WAIT ;delay đợi hiện xong giá trị lên LCD LCALL RESET_DS1820 ; tạo xung reset kết thúc giao tiếp LCALL DELAY_LONG ; delay

SJMP LAP ; quay lại Main chính để đọc liên tục nhiệt độ SJMP $

LCD:

MOV A,#38H ; chương trình thiết lập cho LCD

LCALL WRITE ; coi lại bài LCD

WRITE_TEXT: ; chương trình con xuất kí tự ra LCD

MOV DPTR,#8000H ; coi lại code bài LCD

MOVX @DPTR,A ; coi lại bài LCD

CLR P3.4

Trang 27

LCALL WAIT

RET

WAIT:

PUSH 07 ; chương trình con Delay 2ms

PUSH 06 ;coi lại bài LCD

Trang 28

7) Thí nghiệm với vi mạch DAC MCP4922

ĐỀ BÀI: Viết chương trình xuất mức điện áp bất kì ra ngõ ra MCP4922 Ngõ ra DAC

sẽ nôi tới kênh 1 của ADC Giá trị đọc được ở ADC sẽ hiển thị lên LCD để kiểm tra

Sơ đồ dịnh thì giao tiếp SDI Dựa vào Datasheet MCP4922 thì khi muốn dịch bit vào

chân SDI thì ta phải để CS ở mưc thấp cho LDAC ở mức khi dịch bit phải tạo xung

clock SCK làm tín hiệu dịch bit Kết thúc dịch bit thì CS set lên mức 1 LDAC set

xuống 0 trong khoảng 2 chu kì máy rồi set lại lên 1

Sơ đồ dịch bit từ thanh ghi A vào cờ C rồi từ cờ C vào SDI

khi găp mỗi xung clock SCK thì bit từ cờ C sẽ đc MOV vào SDI

theo trình tự này lần lượt lưu trên 2 thanh ghi R4 và R2 sẽ đươc đưa vào MCP 4922

qua chân SDI

C

C SDI

Trang 29

sơ đồ 16 bit:

8 bit cao lưu ở thanh ghi R4

8 bit thấp lưu ở tahnh ghi R2

Bit 15 : A/B 0 chọn ngõ ra là kênh A,

1:chọn ngõ ra là kênh B mình chọn kênh B chọn khác cũng ok Bit 14: BUF, 0: chọn buffered

1: unbuffered ở bài này ta chọn BUF =1 ( thường là vậy) Bit 13 :Gain Chọn nhân đôi ngõ ra

0: áp ngõ ra được nhân đôi 1: áp ngõ ra được giữ nguyên Bit 12: chọn bit nghỉ cho DAC ở đây ta chọn bit này bằng 1

Vậy là 4 bit cao Bit 15-bit12 là 4 bit config thiết lập cho DAC theo code này mình chọn bằng 1111

Bit 11-bit 0 : 12 bit dữ liệu ta có thể tahy đổi giá trị 12 bit này để được áp ngõ ra như mong muốn

Giá trị điện áp cao nhất là 5V ứng với 12 bit dữ liệu là FFFH

Vd code của mình 12 bit dữ liệu là 0FFH

Ngõ điện áp ra là sẽ là : (0FF/FFF)*5= 0.3Volt

LƯU ĐỒ THUẬT TOÁN:

Trang 30

ORG

Khởi động DAC SETB nCS CLR nLDAC

Chọn giá trị lưu vào R4 MOV R1,#8 Cho R1 là giá trị đếm

Dịch từng bit từ A vào cờ C Dịch từ cờ C vào chân SDI R1<8

Xuất giá trị từ ADC lên LCD

Tắt DAC CLR nCS SETB nLDAC CLR nLDAC

R1>8

Chọn giá trị lưu vào R2 MOV R1,#8 Cho R1 là giá trị đếm

Dịch từng bit từ A vào cờ C Dịch từ cờ C vào chân SDI R1<8

R1>8 MAIN

Trang 31

CLR NCS ,2 lệnh clear bit chip select và

; set bit NLD là hai SETB NLD ; lệnh để khởi động DAC

; Xem thêm datasheet…

MOV R4,#0F0H ; mình sẽ dùng thanh ghi R4,R2 để chuyển dần

;16 bit dữ liệu vào chân SDI của MCP4922

;Cách dịch mình sẽ nói rõ ở phía trước ^^

Trang 32

CALL XUAT0 ;gọi chương trình xuất giá trị điện áp lên LCD SETB NCS ; kết thúc thao tác với DAC

NOP ; phải Set bit chip select và clear bit nLDAC

NOP ;giữa các lệnh này có vài lệnh NOP là giúp

CLR NLD ; MCP4922 có thời gian chờ để thực

; hiện xong tác NOP ;lệnh

;xuất ADC kênh 1 MOVX @DPTR,A ; ra lệnh chuyển đổi kênh tương ứng

CALL DELAY0 ; delay 100 micro giây

MOVX A,@DPTR ; đọc giá trị điện áp từ ADC lưu vào A MOV B,#05H ;=============================== MUL AB ; cách chuyển đổi điên áp từ gai trị nhị phân MOV R3,A ; sang thập phân ở thang đo 0 -5V

MOV A,B ; tương tự như bài ADC Mình ko nhắc lại

Ngày đăng: 06/08/2018, 21:18

TỪ KHÓA LIÊN QUAN

w