Giải toàn bộ đề thi vi xử lý vấn đáp Đại học Bách khoa Hà Nội 8051 vi xử lý đại học bách khoa viện Điện Điều khiển và Tự động hoá vi điều khiển 8051 Giải bài tập vấn đáp cuối kì Vi Xử Lý ĐHBK Hà Nội
Nguyễn Tiến Hoàng DK-TDH 05 K62 Bài tập vi xử lý ơn thi cuối kì Điều khiển tự động hố Nguyễn Tiến Hồng- DK-TDH -5 K62 ;Bài 1: cong so n byte luu ket qua vao ; so hang dau ; byte MSB cai tai o o co dai chi ORG 00H LJMP Main; muc dich tranh chuong trinh ngat ORG 30H; Main: DC_so1 EQU 13H ; So I 10H 11H 12H 13H DC_so2 EQU 23H ; so II 20H 21H 22H 23H sobyte EQU 4; xet hop cong so 4byte Khoi_tao_thong_so: push 00H; cat giu r0 push 01H; cat giu r1 push 02H; cat giu r2 mov r0,#DC_so1; tro r0 tro toi byte cua So I mov r1,#DC_so2; trỏ r1 trỏ tới byte Số II mov r2,#sobyte ; so lan lap clr c; xoa co nho c Chuong_trinh_cong: mov a,@r0; nạp byte số hạng thứ mà r0 trỏ tới vào A đển thực cộng A=R0 addc a,@r1; cộng có nhỏ A=A+r1+C=r0+r1+c mov @r0,a; cập nhật lại kết vào byte số hạng thứ dec r0; giảm nhớ trỏ xuống ô nhớ thấp để thực vòng tiếp dec r1; giảm ô nhớ trỏ xuống ô nhớ thấp để thực vòng tiếp djnz r2,Chuong_trinh_cong; giảm r2 nhảy chương trình cộng Nguyễn Tiến Hồng DK-TDH 05 K62 Pop 00H; lay lai du lieu tu ngan xep Pop 01H POP 02H here: sjmp here ; 2; dao dau n byte bo nho ; n0 cho phep bat dau chuyen doi Tích cu ;P2.3:INTR – tích cực thấp ngắt sau chuyển đổi ADC chuyển đooi xong INTR lên Nguyễn Tiến Hoàng DK-TDH 05 K62 Câu 22: viết chương trình cộng số byte dạng ascii nhớ, kết dạng ascii cất vào số thứ trường hơp kết số byte Note( so byte sau chuyen o dang bcd) Phân tích tích: chữ số ascii: 0…9 30h ……39H Cách làm: ví dụ chuyển 35H+36H thành 50H+60H dùng da chỉnh thành 10h 01h Lí giải điều số biểu diễn từ 0—9 nên vượtt bị tràn Vì nên ta cần phải hiệu chỉnh DA ( hiệu chỉnh số bcd) + địa byte LSB số thứu lưu r0 + địa byte LSB số thứ lưu r1 Giải Nguyễn Tiến Hoàng DK-TDH 05 K62 So thu msb 40 -41H -44H lsb So thu msb 50H 51H 54H lsb Org 000h Ljmp main Org 030h Main: Mov r0,#44H; luu gia tri ma tro tro toi Mov r1,#54H; luu gia tri ma tro tro toi Mov r2,#5; byte Loop: Mov A,@R0 ANL A,#0FH; xoa bit cao số số SWAP A; trao doi ghi A MOV @R0,A luu lai gai tri cua A vao R0 MOV A,@R1 ANL A,#0FH; xoa bit cao xoá chữ số SWAP A; trao doi ghi A JNC khongnho; kiem tra co tran CY xem cy=0 nhay cy=1 khong nhay ADD A,#10; Neu nho thi phai cong them 10 da chi hieu chinh chu khong nho Khongnho: ADD A,@R0 DA A; hieu chinh ghi A ve dang tu den SWAP A; đổi từ 10 thành 01 MOV @R0, A DEC R0; tro den so tiep theo cua so thu DEC R1; tro den so tiep theo cua so thu DJNZ R2, loop Mov r2,#5; Nguyễn Tiến Hoàng DK-TDH 05 K62 Chuong_trinh_doilai_thanh ASCII: MOV r0,#44H; MOV A,@r0; ADD A,#30H;;;; chuyền thành ascii Mov @r0,A; cập nhật lại Dec r0; giảm xuống byte trước Djnz r2,Chươngtrinh_doilai_thanh_ASCII; Loop: jmp loop end Bài 23: Viết chương trình đièu khiển timer để tạo mạch chia tần số để chế độ counter Đầu bit p1.0 Phân tích: chia tần số f=f/n =➔ cho timer đến n/2 cpl p1.0 Ví dụ với trường hợp chia 30: đếm từ fff1h Thì cần đếm 15 xung nhịp 10000H-F=FFF1H Giai: Cách 1: sử dụng timer có ngắt Org 000h Ljmp main Org 00bh;;; đầu vào ngắt timer0 ISR_time0: CPL P1.0; Mov Tl0,#0F1H MOV TH0,#0FFH Clr TF0 Setb tr0 reti Org 0030H Nguyễn Tiến Hoàng DK-TDH 05 K62 Start: Setb p1.0 Mov IE,#1000 0010b; chop EA=1, chop hep ngat timer Mov tmod,#0000 0101b; counter =1 cho timer hoat động chế độ 16 bit Mov tl0,#0F1H;;;;;; Mov th0,#0FFH;;;;;;; Setb tr0;;; khoi dong timer chay timer run Here: SJMP here; nhảy chỗ đến có cờ báo tràn timer END Cách 2: Dùng dụng timer khơng có ngắt org 0000h Ljmp org Main 0100h Main: mov tmod,#0000 0101 ;Timer0 che 1,Chuc nang dem mov th0,#0fFh mov tl0,#0f1h setb tr0 jnb tf0,$ clr tr0 clr tf0 cpl p1.0 SJMP main end Câu 24: Viết chương trình dịch số n byte, m vị tri theo cua RR Nhận xét giống câu Nguyễn Tiến Hoàng DK-TDH 05 K62 Vi du cho n=3 Ví dụ số byte MSB 30H 31H 32H LSB Giai: mov 20H,#10110111b mov 21H,#11011111b mov 22H,#01110101b có MSB 20H 21H 22H Dich: Mov r0,#đại ô nhớ chứa byte_thấp_nhất gan dia chi byte lsb cho tro mục đích lấy cờ nhớ để dịch byte lấy ví dụ 22H ;; mục đích ta dịch từ 20H trước tiên Mov a,@r0;;; lưu giá trị vào A để thực cách lệnh tính toán logic RRC A; cat bit cao nhat vao CY Mov r0,#_địa byte_cao nhap dia chi byte cao MSB 20H chọn 20 Mov r7,#m; nap bo dem dịch m vị trí chọn=3 Mov r6,#n; nap so byte liệu ban đầu Chuong_trinh_dich_phai_m_byte_1bit: Mov a,@r0;; RRc A;;; lệnh dịch phải có nhớ Mov @r0,A; lưu lại vào địa trỏ r0 trỏ đến INC r0;; tăng trỏ 40 để dịch byte thấp Djnz r6,Chuong_trinh_dich_phai_m_byte_1_bit; SJMP Chuong_trinh_khoi_tao_lai_de_dich_bit_tiep_theo Here: sjmp here;;; nhảy chỗ để quan sát kết Chuong_trinh_khoi_tao_lai_de_dich_bit_tiep_theo: MOV R0,#22H;;;;; lại lấy 22H để lấy cờ nhớ phần khởi tạo mov a,@r0;;;; rrc A;;; mục đích lấy lại cờ nhớ mov r0,#20H;;;; Nguyễn Tiến Hoàng DK-TDH 05 K62 mov r6,#n;;;; giữu lại số byte ;;;; phần khởi tạo giống khởi tạo ban đầu khác phần số bit cần dịch phải trừ Djnz R7,lap;;;; giảm số bit cần dịch xuống nhảy LJMP here;;; nhảy đến phần nhảy chỗ để quan sát kết Câu 25: Viết chương trình đổi 2n chữ số thập phân dạng ASCII thành n byte dạng BCD (parked) Intput r0 số dạng ascii Ouput: r1 – số dạng bcd Phân tích bcd 0-9 cịn ascii 30-39 Ví dụ R0=30H -→ 30H 31H 32H 33H có nd 37 36 35 34 R1=40H -→ 40H 41H có nd 76 54 DoiASCII_BCD: Mov r7,#n Lap: Mov a,@r0 Anl a,#0fh; xoa chu so nam dau tien Swap A mov @r1,A INC r0 Mov a,@r0 Anl a,#0f0h; xoa chu so ADD A,@r1;;; cộng tiếp vào ô nhớ chứa số bcd sau xoá số Mov @r1,A; cập nhật lại INC r0 INC r1 Djnz r7,lap Câu 26: Viết chương trình trừ số 5byte nhớ Kết cất vào số bị trử Nguyễn Tiến Hoàng DK-TDH 05 K62 Intput: r0 → địa đầu số bị trừ;;;; kết lưu địa trỏ r0 R1 → địa đầu số trừ VD r0=30H MSB 30H 31H 32H 33H 34H LSB R1=40H MSB 40H 41H 42H 43H 44H LSB Tru2so5byte: Clr c;;;; lệnh trừ có nhớ Push 00H Push 01H Push A Push 07H Mov r7,#5; nap bo dem n ta ví dụ Lap: Mov a,@r0;;;; lưu số bị trừ Subb a,@r1;;;; số bị trừ-số trừ Mov @r0,a;;;; cập nhật lại vào số bị trừ Dec r0;;; giảm địa số bị trừ xuống byte cao Dec r1;;;; giảm địa số trừ xuống byte cao Djnz r7 lap;;;; lặp đủ n lần kết thúc Pop A;;;; lấy lại liệu từ ngăn xếp Pop 00H Pop 01H Pop 07H Here: jmp here; đứng yên chỗ để quan sát kết Note: push pop de gia tri ghi psw khong thay doi Giải Cau 27: Viet chuong trinh cong so bcd n chu so bcd chu so nhớ Ket qua cat chu so hang dau DC_so_1 equ 13h DC_so_2 equ 23h Nguyễn Tiến Hoàng DK-TDH 05 K62 Sobyte equ Cong_n_byte: Mov r0,#DC_so_1; r0 tro toi byte thap nhat cua so hang Mov r1,#DC_so_2; r1 tro toi byte thap nhat cua so hang Mov r7,#sobyte; so lan lap Clr c Lap: MOV A,@r0; nap sh1 vao a Addc a,@r1; DA A;;; hiệu chỉnh A theo bcd Mov @R0,a Dec r0 Dec r1 Djnz r7,lap Here: sjmp here Câu 28: Viết chương trình đếm số dương miền nhớ từ địa 1000h đến 2000h số đếm r2 r3 ( r3 byte cao) có số đếm r3 r2 Phân tích: số dương số có bit d7=0 Demsoduong: ;; nap cac thong so can thiet Mov dptr,#1000h; nap gia tri dau cho dptr Mov r3,#0;;;; nạp byte cao biến đếm cho Mov r2,#0; nap byte thấp biến đếm cho ;;;;Mov r7,#20h, nap gai tri cuoi cho dptr ;;;;MOV r6,#80H;;;; vi vi 20H*80H=1000H ;;;;; cách dùng ô nhớ tạo vịng lặp ;;;; ta khơng dùng cách Clr c;;;;;;;; xố cờ nhớ Nguyễn Tiến Hồng DK-TDH 05 K62 Lap: Movx a,@dptr; nap gia tri ma chon tro tro den vao a Anl a,#0000 0000H;;;A=1000 0000 A số âm nên khác nên nhảy ;;; cịn A=0 khơng nhảy nên thực tiếp lệnh để thực cộng ;;; vào biến đếm Cjne a,#0,so_tiep_theo Mov A,r2;;;; r2 byte thấp Add A,#1 Mov r2,A JNC so_tiep_theo;;; có cờ nhớ byte thấp tức byte thấp biến đếm ;;;; bị tràn nên ta phải sử dụng byte cao r3 Mov A,r3 Add A,#1 Mov r3,A So_tiep_theo: Clr c;;;; xoá cờ nhớ Inc dptr ;;;; tạo vòng cjnz để kiểm tra giá trị tới hạn dptr Mov A,dph Cjne A,#20H;;; 20H vịng lại cịn phải vượt qua vịng Mov A,dpl Cjne A,#01H;;;; bước sang 2001 kết thúc cịn từ 2000 trở xuống thực nốt Here: jmp here Câu 29: Viết chương trình đếm số âm miền nhớ trỏ bỏi dptr độ dài r3, đếm r4 Phân tích: số âm số có bit d7=1 Mov r4,#0; bien dem so am Mov dptr,… ; nap gia tri cho tro Lap: moxv a,@dptr; nap gia tri ma tro tro den vao a Nguyễn Tiến Hoàng DK-TDH 05 K62 Anl a,#1000 0000H Cjne a,#1000 0000h,so _tiep_theo Inc r4; tang bien dem them don vi So_tiep_theo: Inc dptr Djnz r3,lap; giam gia tri dai Câu 30: ; viet chuong trinh dem 100 xung từ bit pit p0.6 bắt đầu đếm p0.5 chuyển từ lên ; đêm xong đặt p0.7 =1 ; giả dùng timer0 để đếm 10000 hex -FF9C hex= 100 D Org 0000h Ljmp Dem100xung: ORG 000BH Org 0030H Dem100xung: Clr p0.5 Clr p0.7 Setb p0.6; chuyen p0.6 Mov tmod,#0000 0110; chon cheo M1M0=1 che dộ mode ;;;; chọn chế độ counter nên bỏMov IE,#1000 0010; chop phep ngat timer len ;;;(SETB EA; ;;;; Setb ET0;) Mov th0,#-100; Lap: jnb p0.5, lap;; bao gio bit p0.5 chuyen len thi moi bat dau dem Setb tr0; bat dau dem timer0 Cho: jnb tf0,cho; kiem tra co tran Setb p0.7 Nguyễn Tiến Hoàng DK-TDH 05 K62 Cách BÀI 30: Đếm 100 xung từ bit P0.6 org 0000h ljmp main org 0100h main: clr p0.5 clr p0.7 mov r0,#0;;; biếm đếm đếm đủ 100 xung dừng lại kiemtra: jb p0.5, start jmp kiemtra start: jnb p0.6, start ;;;; chờ p0.6 set lên thực tiếp dem: inc r0 delay: jb p0.6, delay;;; chờ p0.6 từ cao xuống thấp tức hết xung cjne r0,#100,start setb p0.7 loop: jmp loop end