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 1TRƯỜ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 2Bà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: 1110E, 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
@DPTRA DELAY INC A
A>9 N
Trang 4Source 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 6Lư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 R4R4+1 AR4 R5R5-1
R5=0
SJMP $ ; lặp tại chỗ để chương trình không kết thúc
N
Y
Trang 7Source 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 8SETB 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 10Lư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 11JNB TI,$ ; Chờ phát xong byte trước đó
CLR TI ;Chuẩn bị phát byte kế tiếp
Trang 12RET
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 135) Đ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 14Lư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 15MOV 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 176) 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 18Sơ đồ đị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 19Hì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 20Tạ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 21Ví 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 24LCALL 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 25MOV 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 26MOV 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 27LCALL WAIT
RET
WAIT:
PUSH 07 ; chương trình con Delay 2ms
PUSH 06 ;coi lại bài LCD
Trang 287) 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 29sơ đồ 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 30ORG
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 31CLR 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 32CALL 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