Bài giảng Vi xử lý - Chương 3: Vi điều khiển. Họ vi điều khiển 8051 (Phần 2)

No overflow when adding a positive and a negative number

No overflow when signs are the same for subtraction

Overflow occurs when the value affects the sign:

overflow when adding two positives yields a negative

or, adding two negatives gives a positive

or, subtract a negative from a positive and get a negative

or, subtract a positive from a negative and get a positive

Consider the operations A + B, and A – B

Can overflow occur if B is 0 ?

Can overflow occur if A is 0 ?
 

 

ppt97 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 461 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Vi xử lý - Chương 3: Vi điều khiển. Họ vi điều khiển 8051 (Phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
cẩn thận khi sử dụng băng thanh ghi 1 (không thể sử dụng được lúc này). Tuy nhiên ta có thể giải quyết vấn đề này bằng cách ghi lại trị bắt đầu mới cho SP (các trị từ 30H đến 7FH).Khi ngăn xếp tăng trưởng có khả năng lọt vào vùng có địa chỉ bit (từ byte có địa chỉ 30H).45Look-up Tables	MOV	A,#ENTRY	CALL	 LOOK_UP	.	.LOOK_UP:	INC	A	MOVC	A,@A+PC	RETTABLE:	DB	data,data,data,...46Thí dụ: Đọc một số X từ Port 1 và xuất giá trị X2 ra Port 2	ORG 0 	; assembler directive	MOV DPTR, #LUT 	; 300H là địa chỉ đầu bảng	MOV A, #0FFH	MOV P1, A 	; Lập trình cổng P1 để nhập dữ liệuAgain: 	MOV	A, P1 	; Đọc X	MOVC	A, @A+DPTR 	; Lấy X2 bằng tra bảng	MOV 	P2, A 	; Xuất X2 ra P2	SJMP	Again 	; Lặp lại mãi mãi đoạn Again đến SJMP	ORG 300H 	; Bảng tra bắt đầu ở 0300HLUT: 	DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81	DB 100, 121, 144, 169, 196, 225	; LUT=Look-Up Table=Bảng tra cứu47EXAMPLEWrite the 8051 instruction to perform the following operations.(a) Move the contents of the accumulator to register 5.(b) Move the contents of RAM memory location 42H to port 1.(c) Move the value at port 2 to register 3.(d) Send FFH to port 0.(e) Send the contents of RAM memory, whose address is inregister 1, to port 3Solution:(a) MOV R5, A(b) MOV P1, 42H(c) MOV R3, P2(d) MOV P0, #0FFH(e) MOV P3, @R148TD: Đảo ngược các bit của A	MOV	R7,#8Loop:	RLC	A	XCH	A,0F0H	RRC	A	XCH	A,0F0H	DJNZ	R7,LOOP	XCH	A,0F0H49Tóm tắt các lệnh với biến Boole (giả sử 8051 với thạch anh 12 MHz) 50Boolean Variable ManipulationCLR	C	;clear bit CLR	bit	SETB	C	;set bit	SETB	bitCPL	C	;complement bitCPL	bitANL	C,bit	;AND bit with CANL	C,/bit	;And NOT bit with C51Boolean Variable ManipulationORL	C,bit	;OR bit with C ORL	C,/bit	;OR NOT bit with C	MOV	C,bit	;move bit to bit	MOV	bit,CJC	rel	;jump if C is setJNC	rel	;jump if C is not setJB	bit,rel	;jump if bit is setJNB	bit,rel	;jump if bit is not setJBC	bit,rel	;jump if set then clear52Phép toán XOR với biến Boole	Chú ý là các lệnh với biến Boole bao gồm các phép toán ANL (logic AND) và ORL (logic OR), mà không có phép toán XRL (logic XOR). Tuy nhiên ta có thể thực hiện phép toán XOR bằng cách kết hợp các phép toán AND, OR, NOT hoặc sử dụng cách sau (thí dụ muốn thực hiện BIT1  BIT2)	MOV	C, BIT1	JNB	BIT2, SKIP	CPL	C	SKIP:	(tiếp tục)	Trước hết BIT1 được chuyển vào cờ nhớ. Nếu BIT2 = 0 thì C chứa kết quả đúng; nghĩa là BIT1  BIT2 = BIT1 nếu BIT2 = 0. Nếu BIT2 = 1 thì C chứa phủ định của kết quả (vì BIT1  BIT2 = NOT BIT1 nếu BIT2 = 1).5354Thí dụ: Định trị một hàm Boole F = WX’Y + XY’Z’Cách 1:W	EQU	P1.3X	EQU	P1.2Y	EQU	P1.1Z	EQU	P1.0F	EQU	P1.7TMP	EQU	00h ; bit 0 của ô nhớ 20H	ORG	8000H	MOV	A, #0Fh	MOV	P1, A BACK: 	MOV	C, W	ANL	C, /X	ANL	C, Y	MOV	TMP, C	MOV	C, X	ANL	C, /Y	ANL	C, /Z	ORL	C, TMP	MOV	F, C	SJMP	BACKCách 2: Dùng các lệnh điều kiệnW	EQU	P1.3X	EQU	P1.2Y	EQU	P1.1Z	EQU	P1.0F	EQU	P1.7TMP	EQU	00h ; bit 0 của ô nhớ 20H	ORG	8000H	MOV	A, #0Fh	MOV	P1, ABACK:	JNB	W, CAL2	JNB	W, CAL2	JB	X, CAL2	JB	Y, SETITCAL2: 	JNB	X, CLEAR	JB	Y, CLEAR	JB	Z, CLEARSETIT: 	SETB	F	SJMP BACKCLEAR: 	CLR	F	SJMP	BACK55Tóm tắt các lệnh rẽ nhánh không điều kiện (giả sử 8051 với thạch anh 12 MHz)56Tóm tắt các lệnh rẽ nhánh có điều kiện (giả sử 8051 với thạch anh 12 MHz) 57Program BranchingACALL	addr11	;call subroutine LCALL	addr16	RET	 	;return from subroutineRETI	 	;return from interruptAJMP	addr11	;absolute jumpLJMP	addr16	;long jumpSJMP	rel	;short (relative) jumpJMP	@A+DPTRJZ	rel	;jump if A = 058Program BranchingJZ	rel	;jump if A = 0JNZ	rel	;jump if A not = 0CJNE	A,direct,rel	;compare and CJNE	A,#data,rel	;rel jump if not 	;equalCJNE	Rn,#data,relCJNE	@Ri,#data,relDJNZ	Rn,rel	;decrement & jumpDJNZ	direct,rel	;if not zeroNOP	;no operation59Conditional jumpsMnemonicDescriptionJZ Jump if a = 0JNZ Jump if a != 0JC Jump if C = 1JNC Jump if C != 1JB , Jump if bit = 1JNB ,Jump if bit != 1JBC , Jump if bit =1, clear bitCJNE A, direct, Compare A and memory, jump if not equal60Conditional Jumps for Branchingif condition is truegoto labelelse	 goto next instructionjz led_offsetb Cmov P1.6, Csjmp skipoverclr Cmov P1.6, Cmov A, P0led_off:skipover:if a = 0 is truesend a 0 to LEDelse	 send a 1 to LEDconditiontruefalselabel61EXAMPLE	Write a program that continuously reads a byte from port 1 and writes it to port 0 until the byte read equals zero.Solution:	READ: 	MOV 	 A, P1 ; A ←P1	MOV P0, A ; P0←A	JNZ READ ; Repeat until A = 0	NOP ; Remainder of program	etc.62More Conditional JumpsMnemonicDescriptionCJNE A, #data Compare A and data, jump if not equalCJNE Rn, #data Compare Rn and data, jump if not equalCJNE @Rn, #data Compare Rn and memory, jump if not equalDJNZ Rn, Decrement Rn and then jump if not zeroDJNZ direct, Decrement memory and then jump if not zero63EXAMPLE	Repeat the previous example, except stop the looping when the number 77H is readSolution:	READ: 	MOV A, P1 ; A ←P1	MOV P0, A ; P0←A	CJNE A, #77, READ ; Repeat until A = 77H	NOP ; Remainder of program	etc.64EXAMPLE	Repeat the previous example, except stop the looping when bit 3 of port 2 is set.	Solution:	READ: 	MOV A, P1 ; A ←P1	MOV P0, A ; P0←A	JNB P2.3, READ ; Repeat until P2.3 = 1	NOP ; Remainder of program	etc.65Iterative LoopsFor A = 0 to 4 do{} clr a loop: ...	inc a	cjne a, #4, loopFor A = 4 to 0 do{}	mov R0, #4loop: ...	...	djnz R0, loop66Execute Loop N Times	MOV	R7,#10 (SAY N=10)LOOP:	(begin loop)	.	.	(end loop)	DJNZ	R7,LOOP	(continue)67EXAMPLE	Write a program that will produce an output at port 0 that counts down from 80H to 00H.	Solution:	MOV R0, #80H ; R0 ←80H	COUNT: 	MOV P0, R0 ; P0 ←R0	DJNZ R0, COUNT ; Decrement R0, jump to	; COUNT if not 0	NOP ; Remainder of program	etc.68Jump Tables	MOV	DPTR, #JUMP_TABLE	MOV	A, #INDEX_NUMBER	RL	A	JMP	@A+DPTRJUMP_TABLE:	AJMP	CASE0	AJMP	CASE1	AJMP	CASE269Compare & JumpCompare two unsigned bytes:	CJNE	A,B,$+3	JNC	BIGLE:	.	;less than or 	.	;equal toBIG:	.	;bigger than70Thí dụ: Đổi từ binary sang biểu diễn số qua ASCII	Chương trình lấy một số trong ACC và cất biểu diễn ASCII của nó vào RAM nội ở địa chỉ trong R1. Thí dụ để chuyển 239 thành các ký tự ASCII ‘2’, ‘3’, ‘9’; trước hết lấy ký số đầu bằng cách chia cho 100 (được 2 và đổi thành ‘2’); lấy phần dư từ phép chia để có 39; lấy 39 chia 10 được 3 (và đổi thành ‘3’), và phần dư của phép chia này cho 9 (và đổi thành ‘9’).	Bài giải.	ORG	00h	MOV	A,#239	; Nạp giá trị thử vào ACC	MOV	R1,#040h	; và địa chỉ đích vào R1	LCALL	 TODEC	; TODEC(239, 040h);	MOV	A,#17	; Bây giờ thí dụ với 2 ký số	MOV	R1, #050h	; và địa chỉ đích ở R1	LCALL	 TODEC	NOP	; thêm lệnh NOP này khi chạy mô phỏng71CT con TODEC;===========================================================	; Chương trình con này đổi 1 byte thành 3 ký tự ASCII có thể in được từ 000–255; Lấy số trong ACC và cất biểu diễn ASCII của nó trong RAM nội bắt đầu ở địa chỉ ; trong R1.TODEC:	MOV	B, #100	; Lấy số chia để vào B	DIV	AB	; ACC = num/100 -> 2 , B = ACC % 100 -> 39	LCALL	 TOASCII	; đổi sang Ascii và cất trong bộ nhớ	MOV	A, B	; Lấy phần dư vào A (39)	MOV	B, #10	; 	DIV	AB	; ACC = 39 / 10 -> 3, phần dư = 39 % 10 -> 9	LCALL TOASCII	; Đổi và cất 3	MOV	A, B	; Lấy giá trị cuối cùng đưa vào A	LCALL TOASCII	RET	; Thực hiện xong72CT con TOASCII;===================================================; Đổi 1 số trong ACC thành một ký tự ASCII; Cất nó vào ô nhớ có địa chỉ cho bởi R1TOASCII:	ADD	A, #'0'	; đổi từ nhị phân sang ASCII	; cũng có thể sử dụng "ADD A,#030h”	MOV	@R1, A	; Cất vào bộ nhớ nội	INC	R1	; Tăng con trỏ địa chỉ 	RET	END73Thí dụThí dụ: Viết chương trình điềnvào các ô nhớ từ 048H đến 057H với các giá trị 0, 2, 4 . . . 30 (0–1EH), đặt 0 vào ô nhớ 48H, 2 vào 49H, ...Bài giải. 	ORG 	0 	MOV	R0, #048H ; Đặt địa chỉ của byte thứ nhất vào R0 	MOV	A, #0 	 ; Điền giá trị vào AccLOOP: 	MOV 	@R0, A ; lưu trữ byte (tương tự C:- *R0 = A)	CJNE	A, #30, NEXT	; Lưu trữ giá trị sau cùng	SJMP DONENEXT: 	ADD 	A, #2 	; Tăng ACC thàh giá trị kế	INC R0 	; Chỉ R0 đến byte kế	SJMP 	LOOP 	; Ghi giá trị kếDONE: 	NOP	; NOP không làm gì cả 	END74757677787980HƯỚNG DẪN SỬ DỤNG KEIL C51 LẬP TRÌNH ASSEMBLYDownload phần mềm keil 8.05 trên mạngCài đặt ở thư mục c:\keil Phần mềm này cho phép biên tập chương trình vi điều khiển bằng assembler và C, mô phỏng, xuất ra file .hex để ghi vào bộ nhớ chương trình của VĐK (dùng bộ nạp programmer) Chạy chương trình Keil uvision3Vào licence management 8182 Copy ID của máy tính CIDChạy file Keil Licence v3.2-2, chọn MCU Type là 51, Đánh dấu check ô External CID Code 83 Paste CID vào ô External CID Code, bấm Generate, copy LIC0 rối paste vào ô New Licence ID Code của hình trước, bấm Add LIC- Close. Bản Keil C51 của bạn đã được cấp bản quyền, không bị giới hạn chương trình 2KHƯỚNG DẪN SỬ DỤNG KEIL C5184HƯỚNG DẪN SỬ DỤNG KEIL C5185HƯỚNG DẪN SỬ DỤNG KEIL C51Nếu muốn lập trình ARM ta cài bản Keil ARM thêm vàoVào menu Project, New Project tạo một project ví dụ test, tạo một thư mục ví dụ test1 và save project Chọn loại vi điều khiển, ví dụ AT89C51 rồi bấm OK86HƯỚNG DẪN SỬ DỤNG KEIL C51HƯỚNG DẪN SỬ DỤNG KEIL C5187HƯỚNG DẪN SỬ DỤNG KEIL C51Khi được hỏi Bấm No88HƯỚNG DẪN SỬ DỤNG KEIL C51Vào File New tạo một file asm ví dụ test rối bấm save as, ta save vào cùng thư mục của project với đuôi .asm (hay a51)89HƯỚNG DẪN SỬ DỤNG KEIL C51Bấm chuột phải vào Source Group 1 chọn Add Files to Group90HƯỚNG DẪN SỬ DỤNG KEIL C5191 Vào thư mục của Project, chọn File loại asm , add file vừa tạo HƯỚNG DẪN SỬ DỤNG KEIL C5192 Bắt đầu soạn chương trìnhHƯỚNG DẪN SỬ DỤNG KEIL C51Ví dụ chương trình:93 Save sau đó vào Project - Build TargetHƯỚNG DẪN SỬ DỤNG KEIL C51Nếu không có errors hay warnings có thể output ra file hex nếu cầnVào Project – Options for Target chọn Output – Create HEX File94Build Target, thư mục của project như sau95HƯỚNG DẪN SỬ DỤNG KEIL C51Vào Debug, Start /Stop debug session96HƯỚNG DẪN SỬ DỤNG KEIL C51Vào Peripherals – I/O Ports chọn port 0 và port 1Vào Debug – Run, tác động lên ngõ vào Pin của P1 và quan sát P097HƯỚNG DẪN SỬ DỤNG KEIL C51 Vào View – Dissassembly Widows để xem mã lệnh của chương trình Muốn ngừng Debug vào Debug Stop Running – Start/ Stop Debug Session Kết thúc bấm Save All

File đính kèm:

  • pptbai_giang_vi_xu_ly_chuong_3_vi_dieu_khien_ho_vi_dieu_khien_8.ppt