Báo cáo thí nghiệm Vi xử lý - Đinh Xuân Tuế
- 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.
Lệnh chức năng DS1820
- CONVERT T (44h)
Lệnh này khởi động một quá trình đo và chuyển đổi giá trị nhiệt độ thành số (nhị
phân). Sau khi chuyển đổi giá trị kết quả đo nhiệt độ được lưu trữ trên thanh ghi nhiệt
độ 2 byte trong bộ nhớ nháp Thời gian chuyển đổi không quá 200 ms, trong thời gian
đang chuyển đổi nếu thực hiện lệnh đọc thì các giá trị đọc ra đều bằng 0.
- 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.
ài LCD MOV A,#0EH LCALL WRITE MOV A,#06H LCALL WRITE RET WRITE_TEXT: ; chương trình con xuất kí tự ra LCD MOV DPTR,#8000H ; coi lại code bài LCD SETB P3.4 SETB P3.5 MOVX @DPTR,A CLR P3.4 LCALL WAIT RET WRITE: MOV DPTR,#8000H ; chương trình con để giúp LCD nhận lệnh SETB P3.4 ;hay là chương trình WRITE_COMAND CLR P3.5 ; theo tài liêu tham khảo MOVX @DPTR,A ; coi lại bài LCD CLR P3.4 LCALL WAIT RET WAIT: PUSH 07 ; chương trình con Delay 2ms PUSH 06 ;coi lại bài LCD MOV R7,#4 LAP1: MOV R6,#250 DJNZ R6,$ DJNZ R7,LAP1 POP 06 POP 07 RET TABLE: DB 030H,031H,032H,033H,034H,035H,036H,037H,038H,039H END 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 CHUẨN BỊ: -Coi lại kiến thưc ở các bài LCD,ADC. Nắm rõ các chương trình con trong các bài đó để dễ sử dụng thuận tiện - Đọc kĩ sơ đồ kết nối phần cứng của MCP4922 với bộ kit. Đọc thêm datasheet của MCP49922 để hiểu rõ cách thức thao tác. 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 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: 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 CODE: ORG 2000H NCS BIT P1.0 ; gán tên cho các bit P1.0,P1.1,P1.2 SCK BIT P1.1 ; để chúng ta dễ nhớ dễ thao tác SDI BIT P1.2 NLD BIT P1.3 ; bit NLDở đây là bit nLDAC trong tài liệu MAIN: 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 ^^ MOV A,R4 CALL DICH ;gọi chương trình dịch từng bit từ thanh ghi vào SDI CALL WAIT :gọi chương trình con delay khoảng 2ms MOV R2,#0FFH ; dịch tương tự thanh ghi R4 với thanh ghi R2 MOV A,R2 CALL DICH CALL WAIT Delay hiện lên LCD Nhảy về Main chính 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 NOP SETB NLD CALL DELAY2S ;gọi chương trình delay 2s để hiện lên LCD SJMP MAIN XUAT0: MOV A,#01H ;=====xóa màn hình LCD==== CALL WRITE MOV DPTR,#8000H ; các bạn xem lại phần LCD để rõ hơn CALL LCD LAP: MOV A,#01H CALL WRITE ;============================== MOV DPTR,#4001H ;trỏ con trỏ DPTR tới địa chỉ truy ;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 MOV DPTR,#TABLE ; các bạn coi lại ADC để rõ hơn ^^ MOVC A,@A+DPTR CALL WRITE_TEXT MOV A,#'.' CALL WRITE_TEXT MOV B,#10 MOV A,R3 MUL AB MOV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR CALL WRITE_TEXT CALL WAIT MOV A,#'V' CALL WRITE_TEXT CALL WAIT SJMP LAP RET ;======================================== ;=====CHƯƠNG TRÌNH CON DỊCH BIT VÀO SDI==== DICH: MOV R1,#8 ; dùng R1 để kiểm ta số bit dịch vào SDI đủ 8 chưa QUAY: RLC A ; dịch trái bit vào cờ C CLR SCK ;tạo xung clock NOP NOP MOV SDI,C ;dịch từ cờ C vào SDI NOP ; định thì tao thời gian chờ để dịch xong bit NOP SETB SCK NOP NOP DJNZ R1,QUAY ; quay lại tới khi dịch đủ 8 bit mới thôi RET DELAY0: PUSH 07 ; chương trình delay 100micro giây MOV R7,#50 DJNZ R7,$ POP 07 RET DELAY2S: ; delay 2s dùng timer 0 DELAY: MOV R7,#50 LAP100: MOV TMOD,#01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 DJNZ R7,LAP100 RET LCD: MOV A,#38H ;chương trình khởi động LCD LCALL WRITE ;coi lại bài LCD ^^ MOV A,#0EH LCALL WRITE MOV A,#06H LCALL WRITE RET WRITE_TEXT: ;coi lại bài LCD MOV DPTR,#8000H SETB P3.4 SETB P3.5 MOVX @DPTR,A CLR P3.4 LCALL WAIT RET WRITE: MOV DPTR,#8000H ;coi lại bài LCD SETB P3.4 CLR P3.5 MOVX @DPTR,A CLR P3.4 LCALL WAIT RET WAIT: PUSH 07 ; chương trình delay 2ms PUSH 06 MOV R7,#4 LAP11: MOV R6,#250 DJNZ R6,$ DJNZ R7,LAP11 POP 06 POP 07 RET TABLE: DB 030H,031H,032H,033H,034H,035H,036H,037H,038H,039H ; bảng tra mã kí tự lên LCD từ 0-9 END Bài 8 : Thí Nghiệm Với Led Ma Trận Thí nghiệm 1 : Viết chương trình hiển thị kí tự A lên led ma trận. Lưu đồ thuật toán : ORG A #01 R2 #8 R1 #0 COT: CHỌN COT COT: CHỌN COT HIEN THỊ HIEN THỊ RL A HANG : PUSH A LẤY KÍ TỰ CẦN HIỂN THỊ TRÊN HÀNG VÀ XUẤT RA HÀNG DELAY 1ms POP A R2 R2 – 1 IF R2 = 0 N CODE và chú thích : ORG 2000H MOV A,#01H ; thanh ghi A chứa dữ liệu cần xuất ra ; trên cột tức là chọn cột hiển thị MAIN: LAP2: MOV R2,#8 ; do có 8 cột nên gán r2=8 để ;thực hiện vòng lặp quét cột MOV R1,#0 ; r1 dùng để chứa vị trí kí tự trong bảng tra LOOP: CALL COT CALL HANG DJNZ R2,LOOP ; sau mỗi lần xuất được dữ liệu ra 1 ‘ hàng thì giãm r2 đi 1 cho đến khi đủ SJMP MAIN ; 8 hàng thì quay lại quét từ đầu COT: MOV DPTR,#0C000H ; lấy địa chỉ cột khối led matrix MOVX @DPTR,A ; chọn cột cần được hiển thị RL A ; xoay trái A để chọn cột tiếp theo hiển thị cho lần lặp sau RET ; HANG: PUSH ACC ; giữ lại dữ liệu cần xuất ra trên Y ;cột để cho vòng lặp sau CALL DU_LIEU ; lấy dữ liệu cần xuất ra trên hàng MOV DPTR,#0A000H ; lấy địa chỉ hàng của khối led matrix MOVX @DPTR,A ; xuất dữ liệu ra trên hàng LCALL DELAY POP ACC ; lấy lại dữ liệu xuất ra trên cột INC R1 ; tăng vị trí kí tự trong bảng tra lên 1 RET DU_LIEU: MOV A,R1 ; lấy vị trí của kí tự trong bảng MOV DPTR,#CHAR ; lấy địa chỉ đầu bảng MOVC A,@A+DPTR ; lấy kí tự cần xuất ra hàng RET DELAY: PUSH 07 ;================================================= PUSH 06 ; chương trình con DELAY ; dùng để tạo trể 1ms giữa 2 lần MOV R7,#2 ; xuất dữ liệu trên hàng LAP: MOV R6,#250 DJNZ R6,$ DJNZ R7,LAP POP 06 POP 07 RET ;================================================== CHAR: DB 03H,0EDH,0EEH,0EEH,0EDH,03H,0FFH,0FFH END BÀI 9 : THÍ NGHIỆM VỚI ĐỘNG CƠ DC Thí nghiệm 1 : viết chương trình cho phép động cơ chạy theo chiều thuận trong vòng 2s , ngừng 2s , quay chiều nghịch 2s , ngừng 2s và lặp lại . Lưu đồ thuật toán : ORG NGHICH : ACC.0 0 ; ACC.1 1 DELAY 2S NGHI : ACC.0 0 ; ACC.1 0 DELAY 2S DPTRE000 THUAN : ACC.01 ; ACC.10 DELAY 2S NGHI : ACC.0 0 ; ACC.1 0 DELAY 2S CODE và chú thích : ORG 2000H LOOP; MOV DPTR,#0E000H ; lấy địa chỉ của ngoại vi động cơ dc CALL THUAN MOVX @DPTR,A ; bắt đầu cho động cơ quay thuận CALL DELAY2S ; cho động cơ quay 2s MOV DPTR,#0E000H CALL NGHI MOVX @DPTR,A ; bắt đầu cho động cơ nghỉ CALL DELAY2S ; động cơ nghĩ 2s MOV DPTR,#0E000H CALL NGHICH ; bắt đầu cho động cơ quay nghịch MOVX @DPTR,A CALL DELAY2S ; động cơ quay nghịch 2s MOV DPTR,#0E000H CALL NGHI MOVX @DPTR,A CALL DELAY2S SJMP LOOP ; quay lại ban đầu THUAN: SETB ACC.0 ;===================================================== CLR ACC.1 ; cài đặt chế độ quay thuận RET ;===================================================== NGHICH: CLR ACC.0 ;==================================================== SETB ACC.1 ; cài đặt chế độ quay nghịch RET ;==================================================== NGHI: CLR ACC.0 ;======================================================== CLR ACC.1 ; cài đặt chế độ nghỉ RET ;======================================================== DELAY2S: MOV R7,#20 ;======================================================== LAP2: MOV R6,#200 ; chương trình con delay tạo trễ 2s LAP1: MOV R5,#250 DJNZ R5,$ DJNZ R6,LAP1 DJNZ R7,LAP2 RET ;======================================================== END
File đính kèm:
- bao_cao_thi_nghiem_vi_xu_ly_dinh_xuan_tue.pdf