Kỹ thuật Vi điều khiển
Bạn đang xem 20 trang mẫu của tài liệu "Kỹ thuật Vi điều khiển", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- ky_thuat_vi_dieu_khien.pdf
Nội dung text: Kỹ thuật Vi điều khiển
- KKỹỹtthuhuậậtt ViVi đđiiềềuu khikhiểểnn Th.S LÊ XỨNG và Th.S NGUYỄN BÁ HỘI Trường Đại học Bách khoa, ĐHĐN Lexung59@yahoo.com hoinb@ud.edu.vn Xung & Hoi1
- Sáchthamkhảo • I. Scott Mackenzie, Họ Vi điềukhiển8051, Dịch: TốngVăn On vàHoàng ĐứcHải, 2001 • NgôDiênTập, Kỹ thuậtghépnốimáytính, 2000 • NgôDiênTập, Đolườngvà điềukhiểnbằngmáytính, 1998 • Đỗ XuânTiến, Kỹ thuậtVi xử lývàlậptrìnhAssembly chohệ vi xử lý, 2003 • SencerYeralan, The 8051 Cookbook for Assembly and C with Experiments in MechatronicsamdRobotics, 2000 • SencerYeralan, Programming and Interfacing the 8051 Microcontroller, 1995 Xung & Hoi2
- 1.Giớithiệu 2.Sơđồ khốivàchân 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ 8.LậptrìnhIO 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi3
- 1.LED 1 2.LED 2 3.Hiểnthị vớiLED 7 đoạn 4.Keypad 5. Đothờigian 6.Tạosóngvuông 7. Đồnghồsố 8.GiaotiếpPC, viếtC code 9.ADC, cảmbiến& xuấtLED 7 đoạn 10.Motor bước 11.PWM Xung & Hoi4
- ViVi xxửử lýlý •CPU chocácmáytính •Khôngcó RAM, ROM, I/O trênCPU chip •Vd: Intel’s x86, Motorola’s 680x0 Data Bus Nhiềuchips trênbomạchchủ CPU Cổng RAM ROM I/O Timer Vi xử lý Port nốitiếp Address Bus Hệ thốngvi xử lý Xung & Hoi5
- ViVi đđiiềềuu khikhiểểnn •Làmáytínhmini •Có RAM, ROM, I/O ports trênCPU chip •Vd: Motorola’s 6811, Intel’s 8051, Zilog’sZ80, & PIC 16X CPU RAM ROM tấtcảbêntrong1 chip Cổng I/O Timer Port nốitiếp Vi điềukhiển Xung & Hoi6
- ViVi xxửử lýlý && ViVi đđiiềềuu khikhiểểnn Vi xử lý Vi điềukhiển Ø CPU chip riêngbiệt. RAM, Ø CPU, RAM, ROM, I/O & ROM, I/O, Timer bênngoài Timer nằmtrêncùng1 chip Ø LượngROM, RAM, I/O Ø CốđịnhlượngROM, RAM, Ports tùyý I/O Ports trênchip ØGiáthànhcao Ø Thíchhợpchocác ứngdụng: Ø Đanăng ügiácảthấp Ø Đamụcđích ünănglượngtiêuthụ thấp ükhônggianhạnchế Ø Đơnmụcđích Xung & Hoi7
- HHệệththốốngng nhnhúúngng (Embedded(Embedded System)System) Bộxửlý được nhúng(embedded) vàomộtứngdụngcụthể Mộtsảnphẩmnhúngchỉ sử dụngVXL,VĐK, FPGA, DSP để thựcthi1 côngviệcduynhất Chỉ cómộtphầnmềmứngdụng& thôngthường đượcnộp trongROM vd:printer, keyboard, video game player Xung & Hoi8
- 33 tiêutiêu chchíí chchọọnn vivi đđiiềềuu khikhiểểnn 1. Đáp ứngyêucầuvềnhiệmvụvàgiáthànhthicông Ø Tốc độ, lượngbộnhớ, cổngI/O, timers, kíchcỡ, đóng gói, nănglượngtiêuthụ Ø Dễ nângcấp Ø Giáthành 2.Cáccôngcụpháttriểnphầnmềm Ø Assember, bộ sửalỗi, trìnhdịchC, môphỏng, hỗ trợ kỹ thuật 3.Thị trườngcungcấpsảnphẩmtin cậy Xung & Hoi9
- 1.Giớithiệu 2.Sơđồ khốivàchân(block and pin diagrams) 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt(SFR) 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ 8.LậptrìnhIO 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- 22 1.1. SSơơ đđồồ khkhốốii External by Timers, Serial Port On-chip Timer/Counter ROM for Interrupt On-chip Timer 1 Counter program Control RAM Inputs code Timer 0 T1,T0 CPU Serial Bus 4 I/O Ports OSC Control Port /EA P0 P1 P2 P3 TxDRxD ALE RST Address/Data /PSEN Xung & Hoi2
- 22 2.2. SoSo ssáánhnh ccáácc ththàànhnh viênviên hhọọ 80518051 Specification 8031 8051 8751 8951 8052 8752 Code Mem on 0K 4K 4K 4K 8K 8K chip (bytes) ROM EPROM Flash ROM EPROM Data Mem on 128 128 128 128 256 256 chip (bytes) Timers 2 2 2 2 3 3 I/O pins 32 32 32 32 32 32 Serial Port 1 1 1 1 1 1 Interrupt 5 5 5 5 6 6 sources Xung & Hoi3
- 22 3.3. SSơơ đđồồ chânchân P1.0 140 Vcc P1.1 239 P0.0(AD0) P1.2 338 P0.1(AD1) P1.3 48051 37 P0.2(AD2) P1.4 536 P0.3(AD3) P1.5 635 P0.4(AD4) P1.6 734 P0.5(AD5) P1.7 833 P0.6(AD6) RST 932 P0.7(AD7) (RXD)P3.0 10 31 EA/VPP (TXD)P3.1 11 30 ALE/PROG (INT0)P3.2 12 29 PSEN (INT1)P3.3 13 28 P2.7(A15) (T0)P3.4 14 27 P2.6(A14) (T1)P3.5 15 26 P2.5(A13) (WR)P3.6 16 25 P2.4(A12) (RD)P3.7 17 24 P2.3(A11) XTAL2 18 23 P2.2(A10) XTAL1 19 22 P2.1(A9) GND 20 21 P2.0(A8) Xung & Hoi4
- CCááccchânchân 80518051 ((phphầầnn 1)1) § Vcc (chân40): üCungcấpnguồnchochip ü+5V § GND (chân20): đất § XTAL1 & XTAL2 (chân19, 18) ü2 châncungcấpxungclock ngoài üCách1: dao độngdùngthạchanh üCách2: dao độngtừnguồnxungclock TTL bênngoài üQuanhệgiữachukỳmáyvàXTAL Xung & Hoi5
- CCááccchânchân 80518051 ((phphầầnn 2)2) § RST (chân9): reset üinput & kíchhoạtmứccao üĐểđảmbảohoạt độngreset xảyra, xungkíchkhởi phảikéodàiítnhấtlà 2 chukỳmáy üGiátrị cácthanhghichịutác độngbởihoạt độngreset, xembảngtrongphần5 bàigiảng üMạchreset cóchốngrung Xung & Hoi6
- CCááccchânchân 80518051 ((phphầầnn 3)3) Ø /EA (chân31): External Access ü/EA nốimass chỉđịnhrằngcode lưutrênbộnhớ ngoài ü/PSEN & ALE dùngchoROM ngoài üVới8051, 8031, 8032 thì/EA nốiVcc ü“/”: chỉđịnhtác độngmứcthấp Ø /PSEN (chân29): Program Store Enable üOutput, chophéptruyxuấtbộnhớ chươngtrìnhngoài üNốitớichân/OE củaROM/EPROM üKhithựcthichươngtrình ở ROM nội, /EA được gán mức 1, (khi đó/PSEN được tự động giữởmức1) Xung & Hoi7
- CCááccchânchân 80518051 ((phphầầnn 4)4) Ø ALE (pin 30):Address Latch Enable ØLàchânoutput chophépchốt địachỉđể giải đahợp(de- multiplexing) bus dữ liệuvàbus địachỉ ØALE xuấttínhiệu để chốt địachỉ (byte thấp địachỉ 16-bit) vào1 thanhghingoàitrongsuốtnửađầucủachukỳbộnhớ (memory cycle). Trongnửachukỳbộnhớ cònlại, P0 sẽ xuất/nhậpdữliệu ØALE cóf=1/6fclock ØCó1 ngoạilệ: trongthờigianthựcthilệnhMOVX, một xungALE bị bỏ qua Ø CổngI/O: P0, P1, P2, & P3. Mỗicổng: 8 chân. Xung & Hoi8
- CCááccccổổngng I/OI/O Ø 4 cổngI/O Port 0 (chân32-39) :P0 (P0.0〜P0.7) Port 1 (chân1-8) :P1 (P1.0〜P1.7) Port 2 (chân21-28) :P2 (P2.0〜P2.7) Port 3 (chân10-17) :P3 (P3.0〜P3.7) Mỗicổngcó 8 chân ĐánhtênP0.X (X=0,1, ,7), P1.X, P2.X, P3.X Ex:P0.0 làbit 0 (LSB)củaP0 Ex:P0.7 làbit 7 (MSB) củaP0 8 bits nàycấuthành1 byte Mỗicổngcóthểđượcdùngnhư input hay output Xung & Hoi9
- 1.Giớithiệu 2.Sơđồ khốivàchân 3.Tổchứcbộnhớ (Memory Organization) 4.Cácthanhghichứcnăng đặcbiệt 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ 8.LậptrìnhIO 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- Hai đặctínhcầnlưuý 1.Các thanhghi vàcác I/O port được định địachỉ theokiểu ánhxạbộnhớ (memory mapped) & do đó đượctruyxuấtnhư 1 vị trínhớ trongbộnhớ 2.Stack làtrênRAM nộithayvìtrênRAM ngoàinhư đốivớicácbộVXL Xung & Hoi2
- 3-1. Khônggianbộnhớ ROM nội 0000H 0000H 0000H 4k 8k 0FFFH 32k 1FFFH 8751 AT89C51 8752 AT89C52 7FFFH DS5000-32 AtmelCorporation Dallas Semiconductor Xung & Hoi3
- 3-2. Khônggianbộnhớ RAM nội 7F 7E 7D7C7B7A79 78 Byte address 2F 7FH 2E RAM đamục đích 30H 2FH RAM định địa chỉ bit 20H 1FH Bank 3 18H 17H Bank 2 10H 1F 1E 1D1C1B1A19 18 0FH 17 16 15 14 13 12 11 10 08H Bank 1 (Stack) 0F 0E 0D0C0B0A09 08 07H R7 Default Register R6 20 00H 07 06 05 04 03 02 01 00 Bank for R0-R7 R5 R4 Bit address R3 R2 Xung & Hoi4 R1 R0
- 3-2-1. VùngRAM đamụcđích •Truyxuấttựdo 80 bytes nàytheokiểu định địachỉ trựctiếp hay giántiếp •MOV A, 5FH Hoặc: MOV R0, #5FH MOV A, @R0 Xung & Hoi5
- 3-2-2. VùngRAM định địachỉ bit •Truyxuấtcácbit riêngrẽlà1 đặctrưngcủa VĐK. Cácbit có thểđượcset, xóa, AND, OR chỉ bằng1 lệnhso với1 chuỗi lệnhcủaVXL •Cácport cũng được định địachỉ bit •Vd: để set bit 7FH bằng1, taviết: VĐK: SETB 7FH VXL: MOV A,2FH; đọccảbyte ORL A,#10000000B; set bit MOV 2FH,A; ghitrở lạicảbyte Xung & Hoi6
- 3-2-3. Cácdãythanhghi(register banks) •Cáclệnhdùngthanhghilànhữnglệnhngắn& thựchiện nhanhhơn –MOV A,R5; 1 byte –MOV A,05H; 2 bytes •Cácdữliệuthườngdùngnênchứa ở cácthanhghi •Ý tưởngcácdãythanhghichophép chuyển đổingữ cảnh nhanhvàhiệuquảởcácmodule độclậpnhaucủaphầnmềm Xung & Hoi7
- 3-2-4. Ngănxếp •Thanhghidùngtruy 7FH cậpngănxếpgọilà SP (stack pointer) Scratch pad RAM • SP làthanhghi8 bit: 30H 2FH giátrị từ 00 à FFH. Bit-Addressable RAM •Khi đượccấpnguồn 20H hay saukhireset, 1FH Register Bank 3 18H 17H SP=07H Register Bank 2 10H 0FH (Stack) Register Bank 1 08H 07H Register Bank 0 00H Xung & Hoi8
- VD:MOVR6,#25H MOVR1,#12H MOVR4,#0F3H PUSH6 PUSH1 PUSH4 0BH 0BH 0BH 0BH 0AH 0AH 0AH 0AH F3 09H 09H 09H 12 09H 12 08H 08H 25 08H 25 08H 25 Start SP=07H SP=08H SP=09H SP=0AH Xung & Hoi9
- 1.Giớithiệu 2.Sơđồ khốivàchân 3.Tổchứcbộnhớ 4. Các thanh ghi chức năng đặc biệt (SFR) 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ 8.LậptrìnhIO 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- SFRs Xung & Hoi2 XêmthêmHình2.6 trang26
- CPU registers: -ACC: Accumulator. -B: B register. -PSW: Program Status Word. -SP: Stack Pointer. -DPTR: Data Pointer (DPH, DPL). Interrupt control: -IE: Interrupt Enable. -IP: Interrupt Priority. I/O Ports: -P0: Port 0. -P1: Port 1. -P2: Port 2. -P3: Port 3. Xung & Hoi3
- TImers: -TMOD: Timer mode. -TCON: Timer control. -TH0: Timer 0 high byte. -TL0: Timer 0 low byte. -TH1: Timer 1 high byte. -TL1: Timer 1 low byte. Serial I/O: -SCON: Serial port control. -SBUF: Serial data registers. Other: -PCON: Power control & misc. Xung & Hoi4
- 4-1. ThanhghiPSW •ThanhghiPSW (bit addressable) C AC F0 RS1 RS0 OV P Cờ nhớ PSW.7 C Cờ nhớ phụ PSW.6 AC Available to user for general purpose PSW.5 Bit chọndãythanhghi1 PSW.4 RS1 Bit chọndãythanhghi0 PSW.3 RS0 Cờ tràn PSW.2 OV Dự trữ - User define bit PSW.1 Cờ chẵnlẻ PSW.0 P RS1RS0Register BankByte Address of R0-R7 0 0000H-07H 0 1108H-0FH 1 0210H-17H 1 1318H-1FH D7 D6 D5 D4 D3 D2 D1 D0 Xung & Hoi5Địachỉ bit
- •C(carry flag) -Cờnhớ – Đượcset bằng1 nếucósốnhớ từ phépcộngbit 7 hay cósố mượnmang đếnbit 7 •MOVA,#FFH •ADD A,#1 –Còn đượcdùngnhư 1 thanhghi1 bit đốivớicáclệnhlogic thaotáctrêncácbit •ANLC,25H •AC (auxiliary carry) –Cờnhớ phụ – Đượcset bằng1 nếucósốnhớ từ bit 3 sang bit 4 •RS1, RS0 - Cácbit chọndãy(bank) thanhghi –Dùng để xác địnhdãythanhghitíchcực –Chúng đượcxóakhireset SETB RS1 º SETB 0D4H SETBRS0 MOVA,R7 Xung & Hoi6
- •OV (overflow flag) -Cờtràn –Set bằng1 sauphéptoáncộnghoặctrừ nếucóxuấthiện1 trànsốhọc. Khicácsốcódấuđượccộnghoặctrừ, phần mềmcóthể kiểmtrabit trànOV để xác địnhKQ cónằm trongtầmhay không –Vớicácsốcódấu, KQ nhỏ hơn-128 hoặclớnhơn+127 sẽ set cờ OV = 1. Vớicácsốkhôngdấu, OV=1 khiKQ vượt quá255 –VD: •0Fthậpphân15 •+7F+127 •___ •8E142 •8EH biễudiễn-114 không đúngvớiKQ mongmuốnlà 142 nênOV = 1 Xung & Hoi7
- •P (parity) -Cờchẵnlẻ –KiểmtrachẵnlẻchothanhchứaA –Sốcácbit 1 trongthanhchứaA cộngvớibit P luônluôn chẵn •MOV A,#10101101B • àP=1 –Bit chẵnlẻđượcsửdụngkếthợpvớicácchươngtrình xuất/nhậpnốitiếptrướckhitruyềndữliệuhoặc để kiểmtra chẵnlẻsaukhinhậndữliệu VD1: MOVA,#88H VD2: MOVA,#9CH ADDA,#93H ADDA,#64H VD3: MOVA,#38H VD4: MOVA,#FFH ADDA,#2FH ADDA,#1 Xung & Hoi8
- VD: VD: MOVA,#88H MOVA,#9CH ADDA,#93H ADDA,#64H 88 10001000 9C 10011100 +93 +10010011 +64 +01100100 11B 00011011 100 00000000 C=1 AC=0 P=0 C=1 AC=1P=0 VD: VD: MOVA,#38H MOVA,#FFH ADDA,#2FH ADDA,#1 3800111000 +2F+00101111 A=00H;C=1;AC=1; 67 01100111 C=0 AC=1P=1 Xung & Hoi9
- Nhữnglệnh ảnhhưởng đếncácbit cờ X cóthể là1 hoặc0 Xung & Hoi10
- 4-2. ThanhghiB •B đượcdùngvớithanhchứaA trongcácphéptoánnhân, chia •MULA,B ; nhân2 số 8-bit khôngdấuchứatrongA & B, KQ 16-bit chứavàocặpthanhghi B:A (B chứabyte cao) •DIVAB ; chiaA bởiB, thươngsốcấttrongA, dư cấttrongB •B còn đượcxửlýnhư thanhghinháp •B được định địachỉ bit F7 F6 F5 F4 F3 F2 F1 F0 Xung & Hoi11
- 4-3. Con trỏ ngănxếp(SP) Địachỉ byte 81 •SP chứa địachỉ củadữliệuhiện đang ởđỉnhcủastack •Cáclệnhliênquan đếnstack baogồmlệnhcấtdữliệuvào stack (làmtăngSP trướckhighidữliệu) vàlệnhlấydữliệu khỏistack (giảmSP) •Muốnstack bắt đầu ở 60H: –MOVSP,#5FH –Thìvùngstack sẽ là32 byte trên8051 vì địachỉ caonhất củaRAM nộilà7FH –5FH đượcdùngvìSP tănglên60H trướckhithaotáccất vàostack đầutiên đượcthựcthi Xung & Hoi12
- •Nếukhôngkhởi độngSP, nộidung mặc địnhlà07H (để duy trìsựtươngthíchvới8048) à thaotáccấtvàostack đầutiên sẽ lưudữliệuvàovịtrínhớ có địachỉ 08H •Trongtrườnghợpnày, nếuphầnmềmứngdụngkhôngkhởi độngSP, dãythanhghi1 (vàcólẽ2, 3) sẽ khôngcònhợplệvì chúng đượcsửdụnglàmstack •PUSH & POP cấtdữliệuvàostack vàlấydữliệutừstack •ACALL, LCALL, RET, RETI cấtvàphụchồibộđếmchương trìnhPC Xung & Hoi13
- VD:MOVR6,#25H MOVR1,#12H MOVR4,#0F3H PUSH6 PUSH1 PUSH4 0BH 0BH 0BH 0BH 0AH 0AH 0AH 0AH F3 09H 09H 09H 12 09H 12 08H 08H 25 08H 25 08H 25 Start SP=07H SP=08H SP=09H SP=0AH Xung & Hoi14
- 4-4. Con trỏ dữ liệu (DPTR) •DPTR đượcdùng để truyxuấtbộnhớ chươngtrìnhngoàihoặc bộ nhớ dữ liệungoài •VD: MOVA,#55H MOVDPTR,#1000H MOVX@DPTR,A 83H DPH 82H DPL Xung & Hoi15
- 4-5. CácthanhghiI/O port: P0, P1, P2, P3 •Tấtcảport đều được định địachỉ bit •VD: (điềukhiểnmotor nốibit P1.0) SETBP1.0 CLRP1.0 • Đoạnchươngtrìnhkiểmtratrạngthái BUSY của thiếtbị: WAIT: JB P1.5, WAIT Xung & Hoi16
- 4-6. Cácthanhghi địnhthời •8051 có 2 bộđếm/địnhthời16-bit đểđịnhcáckhoảngthời gianhoặc đếmcácsựkiện •Hoạt độngcủabộđịnhthời đượcthiếtlậpbởi: –TMOD (Timer Mode Register) –TCON (Timer Control Register) Xung & Hoi17
- 4-7. Cácthanhghicủaport nốitiếp •8051 có1 port nốitiếp để truyềnthôngvớicácthiếtbịnốitiếp •SBUF (Serial Data Buffer): lưutrữ dữ liệutruyềnvànhận •SCON (Serial Port Control Register): chọnchếđộ hoạt động Xung & Hoi18
- 4-8. Cácthanhghingắt •IE (interrupt enable) •IP (interrupt priority) Xung & Hoi19
- 1.Giớithiệu 2.Sơđồ khốivàchân 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt 5.Dao độngvàhoạt độngreset (oscillator and reset) 6.Tậplệnh 7.Cácmode định địachỉ 8.LậptrìnhIO 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- 5-1. Dao độngdùngthạchanh C2 XTAL2 30pF C1 XTAL1 30pF GND Xung & Hoi2
- 5-2. Dao độngtừnguồnxungclock ngoài Ø Dùngbộdao NXTAL2 độngTTL C Ø Chúý XTAL2: EXTERNAL NC OSCILLATOR SIGNAL XTAL1 GND Xung & Hoi3
- 5-3. Dao động& chukỳmáy ATìmchukỳmáycho (a) XTAL = 11.0592 MHz (b) XTAL = 16 MHz. Giải đáp: (a) 11.0592 MHz / 12 = 921.6 kHz; Chukỳmáy(machine cycle) = 1 / 921.6 kHz = 1.085 ms (b) 16 MHz / 12 = 1.333 MHz; Chukỳmáy(machine cycle) = 1 / 1.333 MHz = 0.75 ms Xung & Hoi4
- 5-4. MạchReset cóchốngrung Vcc 100 31 EA/VPP X1 10 uF 30 pF X2 RST 9 8.2 K Xung & Hoi5
- 5-5. Giátrị Reset củacácthanhghi8051 Thanhghi Giátrị Reset PC 0000H A 00H B 00H PSW 00H SP 07H DPTR 0000H P0, P1, P2 ,P3 FFH RAM nôikhôngbịảnhhưởng Xung & Hoi6
- 1.Giới thiệu 2.Sơ đồ khối vàchân 3.Tổchức bộ nhớ 4.Các thanh ghi chức năng đặc biệt 5.Dao động vàhoạt động reset 6.Tập lệnh (Instruction Set) 7.Các mode định địa chỉ 8.Lập trình IO 9.Tạo trễ 10.Lập trình Timer/Counter 11.Lập trình giao tiếp nối tiếp 12.Lập trình ngắt 13.Lập trình hợp ngữ Xung & Hoi1
- MOV dest, source ; dest = source MOVA, #72H;A=72H MOVDPTR, #7634H MOVR4, #62H;R4=62H MOVDPL, #34H MOVA, R4;A=62H MOVDPH, #76H MOVB, 7EH MOVP1, A;mov A to port 1 MOVDPTR, A MOVRm, Rn Chúý 1: MOVA,#72H ≠ MOVA,72H 8086 8051 MOVAL,72HMOVA,#72H MOVBX,72H MOVAL,[BX]MOVA,72H Chúý 2: ≡ MOVA,R3 MOXung V& HoA,3i2
- ADDA, Source ;A=A+Source ADDA,#6;A=A+6 ADDA,R6;A=A+R6 ADD A,6;A=A+[6] or A=A+R6 ADDCA, source ;A=A+source+CY SETBC;CY=1 ADDCA,R5;A=A+R5+1 SUBBA, source ;A=A-source-CY SETBC;CY=1 SUBBA,R5;A=A-R5-1 Xung & Hoi3
- SETBbit; bit=1 CLRbit; bit=0 SETBC; CY=1 SETBP0.0;bit 0 from port 0 =1 SETBP3.7;bit 7 from port 3 =1 SETBACC.2;bit 2 from Accumulator =1 SETB05 ;set bit địa chỉ 05h (tại RAM có địa chỉ byte20h) Chúý: Lệnh xóa bit CLR tương tự lệnh set bit SETB CLRC;CY=0 Song tồn tại 1 ngoạilệcâu lệnh sau đây chỉ cho CLR CLRA;A=0 Xung & Hoi4
- DECbyte;byte=byte-1 INCbyte;byte=byte+1 INCR7 DECA DEC40H; [40]=[40]-1 CPLA;1’s complement MOVA,#55H;A=01010101 B L01:CPLA MOVP1,A ACALLDELAY SJMPL01 Xung & Hoi5
- ANL -ORL –XRLdest, source vd: MOVR5,#89H ANLR5,#08H RR A RL A RRC A RLC A NOP & RET & RETI Giống như các lệnh của 8086 Xung & Hoi6
- MULAB ;B|A = A*B MOVA,#25H MOVB,#65H MULAB;25H*65H=0E99 ;B=0EH, A=99H DIVAB ;A = A/B, B = A mod B MOVA,#25 MOVB,#10 DIVAB;A=2, B=5 Xung & Hoi7
- Các lệnh nhảy có điều kiện: JZ rel Jump if A=0 JNZ rel Jump if A¹0 DJNZ byte, rel Decrement & jump if byte¹0 CJNE dest, source, rel Jump if dest ¹ source JC rel Jump if CY=1 JNC rel Jump if CY=0 JB bit, rel Jump if bit=1 JNB bit, rel Jump if bit=0 JBC bit, rel Jump if bit=1 & clear bit Xung & Hoi8
- ØDJNZbyte, rel-addr Viết chương trình xóa thanh ghiA, sau đócộng 3 vào A mười lần? à ORG 0000H MOVA,#0; MOVR2,#10 AGAIN:ADDA,#03 DJNZR2,AGAIN ;repeat until R2=0 (10 lần) MOVP1,A Xung & Hoi9
- CJNE , , rel •So sánh vànhảy nếu không bằng. CJNE so sánh 2 giátrị đầu tiên vàrẽnhánh nếu các giátrị của 2 toán hạng không bằng nhau •C được set bằng 1 nếu giátrị nguyên không dấu của nhỏ hơn của . Ngược lại, C = 0 •Cả2 toán hạng không bịảnh hưởng sau khi thực thi lệnh Xung & Hoi10
- VD: Viết 1 chương trình so sánh R0, R1: Nếu R0>R1: gửi 1 ra port 2 Else if R0 R1 R0_NHO_HON: ;R0<R1 Xung & Hoi11
- VD: MOV A, 79H Port 1 làngõ vào cógiátrị thay đổi liên tục. . WAIT:CJNEA,P1,WAIT tác dụng gì? Trả lời: Chương trình lặp lại tại điểm này cho tới khi nhận giátrị 79H tại đầu vào P1. Xung & Hoi12
- • SJMPrel-addr Làlệnh nhảy không điều kiện. Làlệnh nhảy ngắn (2-byte). Byte đầu tiên làopcode, byte thứ 2 là địa chỉ tương đối của đích. Địa chỉ tương đối trong khoảng 00àFFH nhưng chia thành 2 hướng: tới, lui (forward, backward) nên tầm nhảy cho phép là -128 đến +127 bytes trước lệnh vàsau lệnh. •VD: PC 0100H:SJMP RelativeAddress 0123H: RelativeAddress à Byte độ dời của lệnh: 0123H-0102H=21H là độ dời tương đối Xung & Hoi13
- AJMP addr11 Làlệnh nhảy không điều kiện. Nhảy đến địa chỉ tuyệt đối. Đích nhảy đến phải ở trong vùng 2K của bộ nhớ chương trình với byte đầu tiên của lệnh theo sau lệnh AJMP. Mã đối tượng như sau: a a a 0 0 0 0 1 a a a a a a a a A10-A8 & A7-A0 của địa chỉ đích LJMP addr16 Làlệnh nhảy không điều kiện (3 bytes). Byte đầu tiên là opcode, byte 2 & 3 chứa địa chỉ đích 16-bit. Tầm nhảy từ 0000àFFFFH Xung & Hoi14
- CALL 1 lệnh chuyển điều khiển khác làCALL, dùng để gọi 1 chương trình con (subroutine). LCALL Làlệnh 3 bytes. LCALL dùng để gọi chương trình con nằm bất kỳ đâu trong khoảng 64K byte không gian địa chỉ của 8051. 0 0 0 1 0 0 1 0 a a a a a a a a a a a a a a a a A15-A8 & A7-A0 của địa chỉ đích Xung & Hoi15
- VD: Ban đầu không khởi động stack pointer (SP). Nhãn Subroutine đặt tại vị trí1234H trong bộ nhớ chương trình. Tại 0123H thực hiện:LCALL Subroutine Mô tả hoạt động sau khi thực hiện lệnh trên? RAMRAMRAM 0BH 0BH 0BH 0AH 0AH 0AH 12H 34H 09H 09H 09H 01H PC 08H 08H 26H 08H 26H Start SP=07H SP=08H SP=09H Xung & Hoi16
- ACALL Làlệnh 2-byte. Chương trình con phải ở trong phạm vi 2K của bộ nhớ chương trình so với byte đầu tiên của lệnh theo sau ACALL. a a a 1 0 0 0 1 a a a a a a a a A10-A8 & A7-A0 của địa chỉ đích Xung & Hoi17
- 1.Giớithiệu 2.Sơđồ khốivàchân 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt(SFR) 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7. Các mode định địa chỉ (addressing modes) 8.LậptrìnhIO 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- •Dữliệuchứa ởđâukhithựcthi1 lệnh? à Nhiềulờigiải tương ứngcáckiểu định địachỉ khácnhau •Cáckiểu định địachỉ chophépxác địnhnguồnvà đíchcủa dữliệutheonhiềucáchkhácnhautùytìnhhuốnglậptrình. 1.Tứcthời 2.Thanhghi 3.Trựctiếp 4.Giántiếp 5.Chỉ số Xung & Hoi2
- 7-1. Định địachỉ tứcthời MOVA,#65H MOVR6,#65H MOVDPTR,#2343H MOVP1,#65H VD : NumEQU30 MOVR0, #Num MOVDPTR, #data1 ORG100H data1:db“BACHKHOA” Xung & Hoi3
- 7-2. Định địachỉ thanhghi MOVRn, A;n=0, ,7 ADDA, Rn MOVDPL, R6 MOVDPTR, A MOVRm, Rn Xung & Hoi4
- 7-3. Định địachỉ trựctiếp •Dùngtruyxuấtcácbiếnnhớ hoặccácthanhghitrênchip •Mặcdầucóthể truycậpcả128 bytes RAM nộisửdụngkiểu định địachỉ trựctiếp, song thôngthườngtachỉ dùngchovùngRAM* nội đamụcđích(có địachỉ từ 30 –7FH) MOVR0, 40H MOV56H, A MOVA, 4; ≡ MOV A, R4 MOV6, 2; copy R2 to R6; MOV R6,R2 ! Thanhghichứcnăng đặcbiệt& địachỉ: MOV0E0H, #66H; ≡ MOV A,#66H MOV0F0H, R2; ≡ MOV B, R2 MOV80H,A; ≡ MOV P1,A Xung & Hoi5
- 7-4. Định địachỉ giántiếp •Làmthế nàonhậnbiết1 biếnkhi địachỉ biến đã đượcxác định, tínhtoánhoặcsửađổitrongkhi1 chươngtrình đang chạy? •Khiquảnlýcácvịtrínhớ liêntiếp. Các điểmnhập được định chỉ số trongcácbảngchứatrongRAM (cácdãysốhay các chuỗikýtự) àGiảipháplàkiểu định địachỉ giántiếp •Khinày, thanhghi đượcsửdụngnhư 1 con trỏ (pointer) đến dữ liệu •MOVA,@Ri ; copy dữ liệutrỏ bởiRivàoA (i=0 hay 1) •MOV@R1,B •Nóicáchkhác, nộidung củacácthanhghiR0 hay R1 cóthể là nguồnhoặc đíchtrongcáclệnhMOV, ADD & SUBB Xung & Hoi6
- Bàitoán7.1. Copy bytes trongRAM nội AViếtchươngtrìnhcopy 10 bytes từ vùngRAM có địachỉ bắt đầu là37H tớivùngRAM có địachỉ bắt đầulà59H Giải đáp: MOV R0,#37h; Con trỏ nguồn MOV R1,#59h; Con trỏđích MOV R2,#10; Bộđếm L1: MOV A,@R0 MOV @R1,A INC R0 INC R1 DJNZ R2,L1 Xung & Hoi7
- Bàitoán7.2. XóaRAM nội AViếtchươngtrìnhxóaRAM nộitừ60H à 7FH Trả lời: MOVR0,#60H LOOP:MOV@R0,#0 INCR0 CJNER0,#80H,LOOP Xung & Hoi8
- 7-5. Định địachỉ chỉ số & truycậpROM nội • Đượcsửdụngkhitruycậpcácthànhphầndữliệucủabảng nhảy hoặc bảngtìmkiếm MOVCA, @A+DPTR A = nộidung tại địachỉ A+DPTR trongROM Chúý: •Cácthànhphầndữliệu đượclưutrongkhônggianbộnhớ chươngtrìnhROM của8051, nênsửdụngMOVC thayvì MOV. “C”: code. Thanhghinền Offset Địachỉ tác động PC (or DPTR) + A = PC (or DPTR) Xung & Hoi9
- Bàitoán7.3. Copy bytes ROM à RAM • VD: Giả sử khônggianbộnhớ ROM bắt đầutạiđịa chỉ 250H chứa“ROBOCON”, viếtchươngtrình truyềncácbytes trênvàovùngnhớ RAM bắt đầutại địachỉ 40H Xung & Hoi10
- Giải đáp: ORG0 MOVDPTR,#MYDATA MOVR0,#40H L1:CLRA MOVCA,@A+DPTR JZL2 MOV@R0,A INCDPTR INCR0 SJMPL1 L2:SJMPL2 ; ORG250H MYDATA:DB“ROBOCON”,0 END Xung & Hoi11
- Bàitoán7.4. Đọcx & xuấtx2 • Viếtchươngtrình đọcgiátrị x từ port 1 vàxuấtgiátrị x2 ra port 2 ? Xung & Hoi12
- Giải đáp: ORG0 MOVDPTR, #TAB1 MOVA, #0FFH; chúý! MOVP1, A L01: MOVA, P1 MOVCA, @A+DPTR MOVP2, A SJMPL01 ; ORG300H TAB1:DB 0,1,4,9,16,25,36,49,64,81 END Xung & Hoi13
- •MOVC A,@A+PC ;hoạt độngtươngtự, ngoạitrừởđây, bộ đếmchươngtrình PC đượcdùng để chứa địachỉ nền và bảng đượctruyxuấtnhờ vàochươngtrìnhcon. Số của điểmnhập (entry-number) yêucầuchovàothanhchứaA, sau đóchương trìnhcon đượcgọi. Bảngphải được địnhnghĩangaysaulệnh RET trongchươngtrình. MOVA, entry-number CALLTIM-KIEM TIM-KIEM: INCA MOVCA, @A+PC RET TABLE:DBdata1,data2,data3, Xung & Hoi14
- Homework Viếtchươngtrìnhcho2 vídụtrêndùng MOVC A, @A+PC thayvì MOVC A, @A+DPTR? Xung & Hoi15
- 1.Giớithiệu 2.Sơđồ khốivàchân 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ 8.LậptrìnhIO (IO Port Programming) 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- 8-1. Cổng1 (Port 1) Port 1 (chân1-8) Port 1 đượckýhiệuP1 à Cácchân: P1.0 -P1.7 SửdụngP1 trongcácvídụsau đây để chỉ rahoạt động củachúng à P1 làcổngra–output (ghidữliệuCPU racácchân bênngoài) à P1 làcổngvào–input (đọcdữliệutừcácchânbên ngoàivàoCPU bus) Xung & Hoi2
- 8-2. CấutrúcphầncứngcủaP1.x Read DFF Vcc TB2 Tải Bus nội DQ P1.x P1.x Write to DFF ClkQ M1 TB1 Read pin Xung & Hoi38051 IC
- a.Bus nội: giaotiếpvớiCPU b.BộchốtdữliệuDFF: lưutrữ giátrị củachân. Khi “Write to DFF”= 1: ghidữliệuvàoDFF c.Haibộđệm3 trạngthái(tri-state buffers): -TB1: điềukhiểnbởi“Read pin”. Khi“Read pin”= 1: đọcgiátrị tạichân ngoài -TB2: điềukhiểnbởi“Read DFF”. Khi“Read DFF”= 1: đọcgiátrị từ DFF nội d.Transistor M1 Xung & Hoi4
- Bộđệm3 trạngthái(Tri-state Buffer) OutputInput Trở khángcao (hở mạch) Tri-state control (kíchhoạt 0 mứccao) 0011 1 1 Xung & Hoi5
- 8-3. Ghiracổngoutput Vd: MOV A, #55H BACK: MOV P1, A ACALLDELAY CPL A SJMP BACK Xung & Hoi6
- 8-3-1. Ghi“1”rachânoutput P1.x Read DFF Vcc TB2 Tải 2. Chânralà 1.ghi1 Vcc 1 Bus nội DQ P1.x P1.x 0 output 1 Write to DFF ClkQ M1 TB1 Read pin Xung & Hoi78051 IC
- 8-3-2. Ghi“0”rachânoutput P1.x Read DFF Vcc TB2 Tải 2. Chânra nối đất 1. ghi0 0 Bus nội DQ P1.x P1.X 1 output 0 Write to DFF ClkQ M1 TB1 Read pin Xung & Hoi88051 IC
- 8-4. Đọctừchâninput & bộ chốt Khi đọcchân, cóhaikhả năngsau: ØĐọctrạngtháicủachân input (bênngoài) MOVA,Px JNBP2.1,Label JBP2.1,Label ØĐọcdữliệubộchốtcủachân output (bêntrong) ANLP1,A ORLP1,A INCP1 Đọc-Sửa đổi-Ghi Xung & Hoi9
- 8-4-1. Đọctừchâninput Để P1 làinput, P1 phải đượclậptrìnhbằngcáchghi“1” vàotấtcảcácbit củaP1 MOV P1,#0FFH ; P1=11111111B ; P1 làinput BACK:MOV A,P1 MOV P2,A SJMP BACK E tươngtựchoP0, P2, P3 Xung & Hoi10
- Đọc“1”tạichâninput Read DFF 2. MOV A,P1 Vcc Chânngoài=“1” 1.ghi1 TB2 Tải MOV P1,#0FFH 1 1 Bus nội DQ P1.x P1.x 0 Write to DFF ClkQ M1 3. Read pin=1 Read DFF=0 Write to DFF=0 TB1 Read pin 8051 IC Xung & Hoi11
- Đọc“0”tạichâninput Read DFF Vcc 2. MOV A,P1 1.Ghi1 TB2 Tải Chânngoài=“0” MOV P1,#0FFH 0 1 Bus nội DQ P1.x P1.x 0 Write to DFF ClkQ M1 3. Read pin=1 Read DFF=0 Write to DFF=0 TB1 Read pin 8051 IC Xung & Hoi12
- Cáclệnh đọcchâninput Lệnh Vídụ Môtả MOV A,PX MOV A,P2 ĐọcP2 vàoA JNB PX.Y, JNB P2.1,TARGET NhảynếuP2.1 = 0 JB PX.Y, JB P1.3,TARGET NhảynếuP1.3 = 1 Copy trạngtháichân MOV C,PX.Y MOV C,P2.4 P2.4 vàoCY Xung & Hoi13
- 8-4-2. Đọcchânouputtứcđọcbộchốt MOVP1,#55H; P1=01010101 ORLP1,#0F0H;P1=11110101 Ø “Read DFF”kíchhoạtTB2 vàchuyểndữliệutừQ của DFF vàoCPU à đọc đượcP1.7 = 0 Ø CPU thựchiệnOR dữ liệunàyvớibit 1 à được1 ØD củaDFF bị thay đổithành1 ØGhiKQ rachân à P1.7 = 1 Xung & Hoi14
- Đọcbộchốt 1.Read pin = 0 Read DFF = 1 Write to DFF = 0 (ban đầuP1.7=0) Read DFF Vcc TB2 Tải 2. CPU tính(P1.7 OR 1 ) 0 4. P1.7 = 1 10 1 Bus nội DQ P1.7 1 P1.7 0 Write to DFF ClkQ M1 3. GhiKQ vàoDFF Read pin=0 Read DFF=0 Write to DFF=1 TB1 Read pin 8051 IC Xung & Hoi15
- Đọc-Sửa đổi-Ghi Đặc điểmnàybaogồm3 hành độngtrong1 lệnh đơn: 1.CPU đọcbộchốt 2.CPU thựchiệntínhtoán à sửa đổibộchốt 3.Ghirachân Chúý:8 châncủaPort làmviệc độclậpnhau Xung & Hoi16
- Cáclệnhcó đặc điểm Đọc-Sửa đổi-Ghi Lệnh Ví dụ ANL ANL P1,A ORL ORL P1,A XRL XRL P1,A JBC PX.Y, TARGET JBC P1.1, TARGET CPL CPL P1.2 INC INC P1 DEC DEC P1 DJNZ PX, TARGET DJNZ P1,TARGET MOV PX.Y,C MOV P1.2,C CLR PX.Y CLR P1.3 SETB PX.Y SETB P1.4 Xung & Hoi17
- Tómlại •1 chânlàoutput thìcóthể ghidữliệutrựctiếprachân •1 chânlàoutput thì đọctrạngtháicủachânnghĩalà đọc bộ chốttương ứngcủachân •1 chânlàinput thìset nólên“1”trướckhithaotác •1 chânlàinput thì đọctrạngtháitrựctiếptừchân Xung & Hoi18
- Câuhỏigợinhớ Ø Cách ghi dữ liệurachân? Ø Cách đọc dữ liệutừchân? üĐọcgiátrị từ chânbênngoài •Tạisaophảiset chântrướckhitiếnhành đọc? üĐọcgiátrị từ bộ chốt •Lệnhnhư thế nàogọilàcótínhchất Đọc-Sửa đổi-Ghi? Xung & Hoi19
- Bàitoán1: thaotácbit Bàitoán: 1.Theo dõibit P1.2 cho đếnkhinhận được“1” 2.Khinhận được“1”, ghi45H raP0 3.& gửixung“High-to-Low”rachânP2.3 Xung & Hoi20
- Giải đáp: SETB P1.2 ;P1.2 làinput MOV A,#45H ;A=45H AGAIN:JNB P1.2,AGAIN;lặplạiđếnkhiP1.2=1 MOV P0,A ;xuấtA raP0 SETB P2.3 ;P2.3 = “High” CLR P2.3 ;P2.3 = “Low”for H-to-L Trong đó: 1. JNB: jump if no bit (jump if P1.2 = 0) 2. Xung“H-to-L” đượctạobởichuỗilệnhSETB & CLR Xung & Hoi21
- Bàitoán2: Ưu điểmkhisửdụngcâulệnhcó đặc điểm Đọc-Sửa đổi-Ghi ACóbacách để nháycácbit củaPort 1 liêntục • Cách1: GửidữliệutớiP1 qua thanhchứaA BACK: MOV A,#55H ;A=01010101B MOV P1,A ACALL DELAY MOV A,#0AAH ;A=10101010B MOV P1,A ACALL DELAY SJMP BACK Xung & Hoi22
- • Cách2: Xuấtdữliệutrựctiếp BACK: MOV P1,#55H ;P1=01010101B ACALL DELAY MOV P1,#0AAH ;P1=10101010B ACALL DELAY SJMP BACK • Cách3: Dùnglệnhvớiđặc điểm Đọc-Sửa đổi-Ghi MOV P1,#55H ;P1=01010101B AGAIN: XRL P1,#0FFH ACALL DELAY SJMP AGAIN Xung & Hoi23
- 8-5. Cáccổng(port) cònlại ØP1, P2, P3 có điệntrở tảinội ØP0 khôngcó điệntrở tảinội ØPhíangườilậptrình: khôngcósựkhácbiệtnàogiữacác cổng Ø Tấtcảcáccổnglàoutput và ở mứclogic caokhiReset Xung & Hoi24
- CấutrúcphầncứngP0.x Read DFF TB2 Bus nội DQ P0.X P1.X Write to DFF ClkQ M1 TB1 Read pin Xung & Hoi25
- Port 0 KhiP0 đượcdùng để xuấthay nhậpdữliệu, phảicócác điệntrở kéolênbênngoài(10K hoặc4,7K) Vàvớicác điệntrở kéolênbênngoàinày, khireset hay khi bậtnguồn, P0 mặc địnhlàoutput. Vcc 10 K P0.0 P P0.1 o 8051 r P0.2 t P0.3 P0.4 0 P0.5 P0.6 P0.7 Xung & Hoi26
- 8-6. VaitròképcủaP0 •Khinối8051 tớibộnhớ ngoàithìnósửdụngcácport để gửi địachỉ và đọccáclệnh –8051 cókhả năngtruyxuất64K bytes bộ nhớ ngoài – Địachỉ 16-bit: P0 cungcấpcác đường địachỉ A0-A7, P2 cungcấpA8-A15 – Đồngthời, P0 cungcấpcác đườngdữliệuD0-D7 •KhiP0 đượcsửdụng đahợpđịachỉ/dữ liệu, nó được kếtnốitới74LS373 để chốt địachỉ –Khinàykhôngcầncác điệntrở kéolênbênngoài Xung & Hoi27
- 8-6-1. Bộ chốt74LS373 8051 A15 -A8 PORT2 ROM(S) ALE ADDRESS ADDRESS AD7 -AD0 LATCH PORT0 INPUTS A7 -A0 DATA D7 -D0 OUTPUTS PSEN OE ChânALE đượcdùng để giải đahợp(de-multiplexing) địachỉ vàdữliệubằngcáchnốitớichânG củabộchốt74LS373 KhiALE=0, P0 cungcấpdữliệuD0-D7 KhiALE=1, P0 cungcấpđịachỉ A0-A7 Xung & Hoi28
- PSEN OE ALE G 74LS373 P0.0 A0 D P0.7 A7 D0 D7 EA P2.0 A8 P2.7 A15 8051 ROM Xung & Hoi29
- State 1State 2State 3State 4State 5State 6State 1State 2 P1P2 P1P2 P1P2 P1P2 P1P2 P1P2 P1P2 P1P2 XTAL2 ALE ___ PSEN P0 PCL out PCL out PCL out Data Data Data sampled sampled sampled P2 PCH out PCH out Xung & Hoi30
- 8-6-2. ĐọcROM ngoài(1/2) 1. Gửi địachỉ 2. 74373 chốt địa tớiROM chỉ & gửitớiROM PSEN OE ALE G 74LS373 P0.0 A0 D P0.7 A7 Address D0 D7 /EA P2.0 A8 P2.7 A12 8051 Xung & HoiROM 31
- ĐọcROM ngoài(2/2) 2. 74373 chốt địa chỉ & gửitớiROM PSEN OE ALE G 74LS373 P0.0 A0 D P0.7 Address A7 D0 D7 /EA 3. ROM gửilệnh trở lại P2.0 A8 P2.7 A12 8051 Xung & HoiROM 32
- 8-6-3. ĐọcghiRAM ngoài RAM(S) or 8051 I/O DECODE PORT 2 CE ALE ADDRESS ADDRESS LATCH INPUTS PORT 0 DATA OUTPUTS WR R/W RD OE Khônggiantốiđa64KB. Truyxuất địachỉ giántiếpqua 2 thangghiR0 vàR1, con trỏ dữ liệu. Xung & Hoi33
- 8-7. Port 3 •Port 3 khôngcầncác điệntrở kéolênbênngoài •MặcdầuPort 3 cũng đượccấuhìnhnhư ouputkhireset nhưng nóthườngdùngchocácchứcnăngriêngnêudưới đây P3 Bit Function Pin P3.0 RxD 10 P3.1 TxD 11 P3.2 INT0 12 P3.3 INT1 13 P3.4 T0 14 P3.5 T1 15 P3.6 WR 16 P3.7 RDXung & Hoi17 34
- Xung & Hoi35
- 1.Giớithiệu 2.Sơ đồ khốivàchân 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt(SFR) 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ (addressing modes) 8.LậptrìnhIO 9. Tạo trễ 10.LậptrìnhTimer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- Chukỳmáy-Machine Cycle (MC) •Chykỳmáy(machine cycle) là đơnvịđothờigianthựcthicác lệnh •Tầnsốdao độngcủathạchanhchohọ8051 cóthể từ 4MHz đến30 MHz, tùythuộcnhàsảnxuất. Song thôngthường, loại 11.0592 MHz đượcdùngnhằmlàmchocáchệthốngdựatrên 8051 tươngthíchvớicổngnốitiếpcủaIBM PC. •Vớihọ8051, mộtchukỳmáykéodài12 chukỳdao động Xung & Hoi2
- Bàitoán9.1. Tínhthờigianthựcthi1 lệnh • Cho1 hệ 8051 códao động thạchanh11.0592 MHz. Tìmthờigianthựcthicho cáccâulệnhsau: a.MOVR3,#79H a 1 1*1.085us b.LJMP b 2 2*1.085us c.MULAB c 4 4*1.085us d.DECR5 d 1 1*1.085us e.SJMP e 2 2*1.085us f.NOP f 1 1*1.085us Giải đáp: Xung & Hoi3
- Bàitoán9.2. Tínhthờigiantrễđoạncode •Tìmthờigiantrễ chochươngtrìnhcon say đây, (vớitầnsố dao độngthạchanhlà11.0592 MHz) DELAY:MOVR3,#250;1 MC HERE:NOP;1 MC NOP;1 MC NOP;1 MC NOP; 1 MC DJNZR3,HERE;2 MC RET;1 MC Answer:[250x(1+1+1+1+2)+2]x1.085 us=1629.67us Xung & Hoi4
- Bàitoán9.3. NháyLED AChươngtrìnhlầnlượtthay đổitrạngtháisáng/tốicủaLED hay lầnlượtthay đổitrạngthái đóng/mở củarơle: (vớiKIT 8951) ORG0000 MOVA,#01H L1:RLA MOVP2,A LCALLDELAY_500ms LCALLDELAY_500ms SJMPL1 DELAY_500ms: Xung & Hoi5
- DELAY_500ms: MOVR1, #250 PUSH 00H D2:MOVR0, #250 PUSH 01H DJNZR0, $ MOVR0, #250 MOVR1, #250 DJNZR0, $ D1:MOVR0, #250 DJNZR1, D2 DJNZR0, $ MOVR0, #250 POP01H DJNZR0, $ POP00H DJNZR1, D1 RET END Xung & Hoi6
- 1.Giớithiệu 2.Sơ đồ khốivàchân 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt(SFR) 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ 8.LậptrìnhIO 9.Tạotrễ 10.Lập trình Timer/Counter 11.Lậptrìnhgiaotiếpnốitiếp 12.Lậptrìnhngắt 13.Lậptrìnhhợpngữ Xung & Hoi1
- 10-1. Giớithiệu •8051 có2 timers/counters: timer/counter 0 & timer/counter 1. Chúngcóthểđượcdùngnhư: 1.Bộđịnhthời (Timer) dùngnhư 1 bộ tạotrễ –Nguồnxungclock chínhlàdao độngthạchanhbêntrong 2.Bộđếmsựkiện (Event Counter) – Đầuvàotừchânbênngoài đểđếmsốsựkiện –Cóthể dùng đếmsốngười điqua cổng, số vòngquay của bánhxe, hay bấtkểcácsựkiệnmàchuyển đượcsang dạng xung 3.Tạotốcđộ baud (baud rate) choport nốitiếpcủa8051 Xung & Hoi2
- Timer •Khởitạogiátrị ban đầuchocácthanhghi •KíchhoạtTimer, sau đó8051 tínhlên •Ngõvàolàtừclock nội(machine cycle) •Khicácthanhghibằng0 thì8051 sẽ set cờ tràn 8051 P2 P1 to Set LCD Timer 0 TH0 TL0 Xung & Hoi3
- Counter • Đếmsốsựkiện: –Chỉ rasốsựkiệntrêncácthanhghi –Counter 0: NgõvàotừchânbênngoàiT0 (P3.4) –Counter 1: NgõvàotừchânbênngoàiT1 (P3.5) TH0 P1 to TL0 LCD P3.4 a switch T0 Xung & Hoi4
- CácthanhghidùngtruyxuấtTimer/Counter •TH0, TL0, TH1, TL1 •TMOD thanhghichếđộđịnhthời(Timer mode register) •TCON thanhghi điềukhiển địnhthời(Timer control register) •8052 với3 timers/counters sẽ cóthêmcácthanhghiT2CON (Timer 2 control register), TH2 and TL2 SFR Name Description SFR Address TH0 Timer 0 High Byte 8Ch TL0 Timer 0 Low Byte 8Ah TH1 Timer 1 High Byte 8Dh TL1 Timer 1 Low Byte 8Bh TCON Timer Control 88h TMOD TimerXu Modeng & Hoi589h
- TH0, TL0, TH1, TL1 (not bit addressable) •Cảtimer 0 & timer 1 đềucó độ rộng16 bits –Cácthanhghinàylưutrữ •Giátrị tạothờigiantrễ (time delay) (nếulàtimer) •Sốsựkiện(number of events) (nếulàcounter) –Timer 0: TH0 & TL0 •Timer 0 high byte, timer 0 low byte –Timer 1: TH1 & TL1 •Timer 1 high byte, timer 1 low byte –Mỗibộđịnhthời16-bit cóthểđượctruycậpnhư 2 thanhghi8-bit táchbiệt Xung & Hoi6
- TH0TL0 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 Timer 0 TH1TL1 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 Timer 1 Xung & Hoi7
- 10-2. ThanhghichếđộđịnhthờiTMOD •Timer mode register: TMOD (not bit addressable) –Thanhghi8-bit –Thiếtlậpchếđộ hoạt độngchocácbộđịnhthời: •4 bits thấpdànhchoTimer 0 (Set to 0000 if not used) •4 bits caodànhchoTimer 1 (Set to 0000 if not used) (MSB)(LSB) GATE C/T M1 M0 GATE C/T M1 M0 Timer 1 Timer 0 Xung & Hoi8
- (MSB)(LSB) GATE C/T M1 M0 GATE C/T M1 M0 Timer 1 Timer 0 GATE Bit điềukhiểncổng. Khiset lên1, timer chỉ hoạt độngkhi chân/INTx ở mứccaovàTRx= 1. Khixóa, timer hoạt động khiTRx= 1 C/T Bit chọnchứcnăng đếmhoặc địnhthời: 1: đếm; 0: địnhthời M1 Chọnmode -bit 1 M0 Chọnmode -bit 0 Xung & Hoi9
- GATE –GATE=0 • Điềukhiểnbêntrong(Internal control) •Bậthay tắttimer bằngphầnmềm •Timer đượcchophépkhiTR đượcset –GATE=1 • Điềukhiểnbênngoài(External control) •Bậthay tắttimer bằngphầnmềm& mộtnguồnbên ngoài(external source) •Timer đượcchophépkhichân/INT ở mứccao& TR đượcset Xung & Hoi10
- XTAL oscillator ÷ 12 C/T = 0 C/T = 1 T0 Pin Pin 3.4 TR0 Gate INT0 Pin Pin 3.2 Xung & Hoi11
- M1, M0 M1 M0 Mode Hoạt động Chếđộđịnhthời 13-bit 0 0 0 8-bit THx+ 5-bit TLx(x= 0 or 1) Chếđộđịnhthời 16-bit 0 1 1 8-bit THx+ 8-bit TLx Chếđộ tựđộngnạplại8-bit (auto reload mode) 1 0 2 8-bit auto reload timer/counter; THxlưutrữ giátrị nạplạichoTLxmỗi khitràn(overflow) Chếđộđịnhthờichiasẻ 1 1 3 (SplitX tiunmg &er Ho miode) 12
- VD: Tìmgiátrị TMOD nếumuốnlậptrìnhTimer 0 làmviệc ở mode 2 ? Dùng8051 XTAL choxungclock, & dùnglệnh để bậthay tắttimer Giải đáp: timer 1 timer 0 TMOD= 0000 0010 Timer 1 khôngdùng Timer 0, mode 2 C/T = 0 à dùngnguồnxungclock (Timer) GATE = 0 à điềukhiểnbằng phầnmềm Xung & Hoi13
- 10-3. Thanhghi điềukhiển địnhthờiTCON •Timer control register: TCON –½byte caochotimer/counter, ½byte thấpchointerrupts • TR (run control bit) –TR0 for Timer/counter 0; TR1 for Timer/counter 1. –TR đượcset hay xóabởiphầnmềmđể bật/tắttimer/counter •TR=0: off (stop) •TR=1: on (start) (MSB)(LSB) TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Timer 1 Timer0 for Interrupt Xung & Hoi14
- • TF (timer flag, control flag) –Cờtràncủabộđịnhthời –TF0 chotimer/counter 0; TF1 chotimer/counter 1 –Khởi đầu, TF=0 & đượcset bởiphầncứngkhicótràn–tức TH-TL chuyển đếmvề0000 từ FFFFH •Nếuchophépngắt, thìTF=1 sẽ kíchkhởiISR – Đượcxóabởiphầnmềm(hoặcbởiphầncứngkhibộxi xử lýtrỏđếntrìnhphụcvụngắt) (MSB)(LSB) TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Timer 1 Timer0 for Interrupt Xung & Hoi15
- 10-4. Cácchếđộđịnhthời mode overflow flag Timer clock TLx THx TFx 0 overflow flag Timer clock TLx THx TFx 1 overflow flag Timer clock TLx TFx 2 reload THx Timer clock TLx THx 3 Timer clock TL0 TF0 Fosc/12 TH0 TF1 Xung & Hoi16
- M1 M0 Mode Hoạt động Chếđộđịnhthời 13-bit 0 0 0 8-bit THx+ 5-bit TLx(x= 0 or 1) Chếđộđịnhthời 16-bit 0 1 1 8-bit THx+ 8-bit TLx Chếđộ tựđộngnạplại8-bit (auto reload mode) 1 0 2 8-bit auto reload timer/counter; THxlưutrữ giátrị nạplạichoTLxmỗi khitràn(overflow) Chếđộđịnhthờichiasẻ 1 1 3 (Split timer mode) Xung & Hoi17
- 10-4-1. Chếđộđịnhthời16-bit (mode 1) 1.Chọntimer 0 làmviệc ở mode 1 (địnhthời16-bit) – MOV TMOD,#01H 2.Khởitạogiátrị ban đầunạpchoTH0 & TL0. – MOV TH0,#FFH – MOV TL0,#FCH 3.Thoạt đầunênxóacờTF0 về 0 – CLR TF0 4.BậtTimer 0 – SETB TR0 Xung & Hoi18
- overflow flag Timer clock TLx THx TFx TR0=1 TR0=0 Start timer TH0 TL0 Stop timer FFFC FFFD FFFE FFFF 0000 TF = 0 TF = 0 TF = 0TF = 0 TF = 1 TF Theo dõiTF đếnkhiTF = 1 5.Khicóxungclock đến, 8051 bắt đầu đếmlênbằngcáchtăng giátrị trongcácthanhghiTH0-TL0 TH0-TL0= FFFCH,FFFDH,FFFEH,FFFFH,0000H Xung & Hoi19
- 6.KhiTH0-TL0cósựchuyểnsốđếmtừFFFFH à 0000 thì 8051 set TF0=1 – TH0-TL0 = FFFEH, FFFFH, 0000H (khinàyTF0=1) 7.Theo dõicờtràn(TF) – AGAIN: JNB TF0, AGAIN 8.XóaTR0 để tắttimer 0 – CLR TR0 9.Xóacớtrànchovòngtiếptheo – CLR TF0 Xung & Hoi20
- Nguồnxungclock cungcấpchobộđịnhthời C/T=0: up C/T C/T=0: down XTAL oscillator ÷ 12 T0 hay Timer clock T1 pin THx TLx TFx TF goes high overflow flag TRx when FFFF à 0 Mode 1 Xung & Hoi21
- Bàitoán10.1. Sóngvuông EViếtchươngtrìnhtạosóngvuôngcóthờigianmứccaovà thấpbằngnhautrênchânP1.5. DùngTimer 0 tạotrễ mode 1 ;each loop is a half clock MOV TMOD, #01 ;Timer 0,mode 1(16-bit) HERE: MOV TL0, #0F2H ;Giátrị Timer0 = FFF2H MOV TH0, #0FFH CPL P1.5 ACALL DELAY SJMP HERE P1.5 50% 50% wholeXun clockg & Hoi22
- ;tạotrễ dùngtimer 0 DELAY: SETB TR0 ;start the timer 0 JNB TF0, $ CLR TR0 ;stop timer 0 CLR TF0 ;clear timer 0 flag RET FFF2 FFF3 FFF4 FFFF 0000 TF0 = 0 TF0 = 0 TF0 = 0TF0 = 0 TF0 = 1 Xung & Hoi23
- Vài điểmcầnchúý trongVD trên: 1. TMOD = 0000 0001 đượcthựcthi 2. FFF2H chuyểnvàoTH0 –TL0 3. Set vàxóaP1.5 trongthờigianmứccaovàthấpcủaxung 4. CTC DELAY dùngTimer đượcgọi 5. TrongCTC DELAY, bậttimer 0 dùnglệnh“SETB TR0” 6. Timer 0 đếmlênmỗikhicóxungclock (cungcấpbởidao độngthạchanh) Timer 0 đếmqua cácgiátrị: FFF3, FFF4, FFF5, FFF6, FFF7, FFF8, FFF9, FFFA, FFFB, FFFC, FFFFD, FFFE, FFFFH, 0000H à TF0 = 1 vàkhinàylệnhJNB bị bỏ qua 7. TắtTimer 0 dùnglệnh“CLR TR0”. CTC DELAY kếtthúc, tiếntrình đượclặplại. Chúý, làmviệcvớimode 1, nên để lặplạitiếntrình, taphải nhậplạigiátrị chocácthanXunhg &gh HoiiTH-TL & bậtlạiTimer. 24
- 10-4-2. Chếđộđịnhthời13-bit (mode 0) •Mode 0 tươngtựmode 1, ngoạitrừ nólà 13-bit timer thayvì 16-bit. –8-bit TH0 + 5-bit TL0 •Bộđếmvìthế cógiátrị từ 0000 đến1FFF trongcácthanhghi địnhthờiTH0-TL0 –213-1= 2000H-1=1FFFH •Ta cũnggáncácgiátrị ban đầuvàoTH0-TL0 để thựchiện đếmlên •KhiTimer đạt đến1FFFH thìnóchuyểnvề0000, vàTF0 được set overflow flag Timer clock TLx THx TFx Xung & Hoi25
- 10-4-3. Chếđộ tự nạplại8-bit (mode 2) •Bộđịnhthời8-bit –Chophépcácgiátrị từ 00 đếnFFH lưutrongTH0 •Tựđộngnạplại(Auto-reloading) •TL0 đượctănglênkhiTR0=1 •VD, tạothờigiantrễ với200 chukỳmáy(MC) trêntimer 0. Timer clock TLx TFx overflow flag reload TF goes high when FF à 0 THx Xung & Hoi26
- 1.Chọnmode 2 timer 0 – MOV TMOD,#02H 2.KhởitạogiátrịđầutrongTH0 – MOV TH0,#38H 3.XóacờTF0=0. – CLR TF0 4.SaukhiTH0 đượcgán, 8051 copy giátrị nàyvàoTL0 – TL0=TH0=38H 5.BậtTimer – SETB TR0 Xung & Hoi27
- 6.8051 đếmlênTL0 – TL0= 38H, 39H, 3AH, 7.KhiTL0 từ FFH à 00 thì8051 set TF0=1. Bêncạnh đó, TL0 đượctựđộngnạplạigiátrị lưugiữ trongTH0 – TL0= FEH, FFH, 00H (lúcnày TF0=1) –8051 tựđộngnạplạiTL0=TH0=38H. –Quay lạibước6 8.CLR TF0 9.CLR TR0 Xung & Hoi28
- C/T=0: up C/T C/T=0: down XTAL oscillator ÷ 12 T0 hay Timer clock T1 pin overflow TL1 TF1 flag reload TRx TH1 TF goes high when FF à 0 Mode 2 Xung & Hoi29
- 10-5. Tínhtoántrễ dùngTimer Ápdụng đ/v chếđộđịnhthời16-bit (mode 1) (a) Dạnghexa (b) Dạngthậpphân (FFFF –YYXX + 1) * 1.085 ms Chuyểncácgiátrị YYXX củaTH, TL sang dạngthập Trong đóYYXX làcácgiá phânNNNNN, à tacó trị ban đầucủaTH, TL tương ứng (65536 –NNNNN) * 1.085 ms XTAL = 11.0592 MHz Xung & Hoi30
- Bàitoán10.2. Sóngvuông, tìmf EChươngtrìnhsautạosóngvuôngtrênchânP1.5 liêntụcdùng timer 1 tạotrễ mode 1. Tìmtầnsố? (Khôngbaogồmoverhead gâybởicáclệnhtrongvònglặp) MOV TMOD,#10H ;timer 1, mode 1 AGAIN:MOV TL1,#34H ;timer value=7634H MOV TH1,#76H SETB TR1 ;start BACK: JNB TF1,BACK CLR TR1 ;stop CPL P1.5 ;next half clock CLR TF1 ;clear timer flag 1 SJMP AGAIN ;reload timer1 Xung & Hoi31
- Giải đáp: Vớimode 1, cácthanhghi địnhthờiTH, TL phải đượckhởi động lạisaumỗilầntràn. FFFFH –7634H + 1 = 89CCH = 35276 clock count ½chukỳ = 35276 × 1.085 ms = 38.274 ms Chukỳ = 2 × 38.274 ms = 76.548 ms Tầnsố = 1/ 76.548 ms = 13.064 Hz. Trongcáctínhtoántrên, khôngbaogồmoverhead gâybởi cáclệnhtrongvònglặp Xung & Hoi32
- Bàitoán10.3. • ETìmKQ cácbàitoántrêntrongtrườnghợpcótính đến overhead? • EGiảicácbàitoántrênvớichếđộđịnhthờitựnạplại8-bit (mode 2)? • EVớiphạmvi tầnsốnàothìkhôngthể dùngchếđộ tự nạplại 8-bit (mode 2), giảithích? Xung & Hoi33
- 10-6. Tìmgiátrị cácthanhghi địnhthời •Giảđịnhbiếttrướcthờigiantrễ, XTAL = 11.0592 MHz •Làmsaotínhtoáncácgiátrị cầngánchoTH, TL? 1.Chiathờigiantrễ cho 1.085 ms. 2.Thựchiện 65536 –n, với n (decimal) từ bước1 3.ChuyểnKQ trongbước2 sang hex yyxx 4.Set TH = yy và TL = xx. Xung & Hoi34
- Bàitoán10.4. Tạosóngvuôngtheof cho sẵn EXTAL = 11.0592 MHz, viếtchươngtrìnhtạosóngvuông50 Hz trênchânP2.3 Giải đáp: (a) T = 1 / 50 Hz = 20 ms. (b) Thờigianmứccao= Thờigianmứcthấp= 10 ms. (c) 10 ms / 1.085 ms = 9216 65536 –9216 = 56320 in decimal = DC00H in hex. (d) TL1 = 00H and TH1 = DCH. Xung & Hoi35
- MOV TMOD,#10H ;timer 1, mode 1 AGAIN: MOV TL1,#00 ;Timer value = DC00H MOV TH1,#0DCH SETB TR1 ;start BACK: JNB TF1,BACK CLR TR1 ;stop CPL P2.3 CLR TF1 ;clear timer flag 1 SJMP AGAIN ;reload timer since ;mode 1 is not ;auto-reload Xung & Hoi36
- Tạothờigiantrễ lớn • Độ lớntdelay phụ thuộc2 thôngsố: –Tầnsốdao độngthạchanh –Giátrị chứatrongcácthanhghi địnhthờiTH & TL •Thờigiantrễ làlớnnhấtkhiTH=TL=0. NNếếuu vvẫẫnn chchưưaa đđủủ?? Xung & Hoi37
- Bàitoán10.5. Tínhdelay EKhảosátBT sauvàtìmthờigiantrễ? (Khôngtínhoverhead) MOV TMOD,#10H MOV R3,#200 AGAIN: MOV TL1,#08H MOV TH1,#01H SETB TR1 BACK: JNB TF1,BACK CLR TR1 CLR TF1 DJNZ R3,AGAIN Giải đáp: TH –TL = 0108H = 264 (decimal) 65536 –264 = 65272. Trễ do timer = 65272 × 1.085 ms = 70.820 ms Tổngthờigiantrễ = 200 × 70.820 ms = 14.164024 seconds Xung & Hoi38
- Bàitoán10.6. Tínhtầnsốxungvuông ETìmtầnsốxungvuôngtrênchânP1.0 ? MOV TMOD,#2H ;Timer 0,mode 2 MOV TH0,#0 AGAIN:MOV R5,#250 ;count 250 times ACALL DELAY CPL P1.0 SJMP AGAIN DELAY:SETB TR0 ;start BACK: JNB TF0,BACK CLR TR0 ;stop CLR TF0 ;clear TF DJNZ R5,DELAY ;timer 2: auto-reload RET Giải đáp:T= 2 (250 × 256 × 1.085 ms) = 138.88 ms à f = 72 Hz. Xung & Hoi39
- Bàitoán10.7. Tìmgiátrị gánchoTH EGiả sửđanglậptrình •Giải đáp: Vài 8051 assemblers cho choTimer ở mode 2, tìm phép cách thức sau: giátrị hex gánchothanh •-200 = -C8H à 2’s complement ghiTH trongcáctrường of –200 = 100H –C8H = 38H hợpsau: Decimal2’s complement (TH (a) MOV TH1,#-200 value) (b) MOV TH0,#-60 -200 = -C8H38H (c) MOV TH1,#-3 -60 = -3CHC4H (d) MOV TH1,#-12 -3FDH (e) MOV TH0,#-48 -12F4H -48D0H Xung & Hoi40
- Bàitoán10.8. Tìmf (a)Tìmtầnsốsóngvuôngvớiđoạncode sau (b)Thờigianmứccaovàthấp MOV TMOD,#2H ;Timer 0,mode 2 MOV TH0,#-150 ;Count=150 AGAIN:SETB P1.3 high period ACALL DELAY ACALL DELAY CLR P1.3 low period ACALL DEALY SJMP AGAIN DELAY:SETB TR0 ;start BACK: JNB TF0,BACK CLR TR0 ;stop CLR TF0 ;clear TF Xung & Hoi41 RET
- Giải đáp: “MOV TH0,#-150”dùng150 clocks. CTC DELAY = 150 × 1.085 ms = 162 ms. Thờigianmứccaogấp2 lầnthờigianmứcthấp(66% duty cycle). Chukỳ = Thờigianmứccao+ thờigianmứcthấp = 325.5 ms + 162.25 ms = 488.25 ms Tầnsố = 2.048 kHz. Xung & Hoi42
- 10-7. Bộđếm •Cácbộđịnhthời(timers) cũngcóthể dùngnhư nhữngbộđếm (counters) đểđếm sự kiện xảyrabênngoài8051 •Khi đó, xungtừngoàisẽlàmtănggiátrị cácthanhghiTH, TL •KhiC/T=1, bộđếmsẽđếmlênkhicóxungxuấthiệntừ: –T0: timer 0 input (Pin 14, P3.4) –T1: timer 1 input (Pin 15, P3.5) Pin Port Pin Function Description 14 P3.4 T0 Timer/Counter 0 external input 15 P3.5 T1 Timer/Counter 1 external input (MSB)(LSB) GATE C/T=1 M1 M0 GATE C/T=1 M1 M0 Timer 1 Xung & HoiTimer 0 43
- 10-7-1. Chếđộđếm16-bit (mode 1) • 16-bit counter (TH0 and TL0) •Giátrị trongcácthanhghiTH0-TL0 tăngkhi: TR0 đượcset lên1 và mộtxungbênngoài(T0) xuấthiện •Khibộđếm(TH0-TL0) đạttớigiátrị lớnnhấtlàFFFFH, nó đượcchuyểntrạngtháivề0000, vàTF0 đượcset lên1 •Bằngcáchnạpgiátrị ban đẩuchoTH0-TL0, theodõiTF0=1 để nhậnbiết1 tìnhhuốngnào đó(vd: 100 người đã đến). Timer 0 ngõvào từ bênngoài overflow flag chân3.4 (T0) TH0 TL0 TF0 C/T = 1 TF0 goes high TR0 Xung & Howhien FFFF à 0 44
- 10-7-2. Chếđộđếmtựnạplại8-bit (mode 2) •8-bit counter. –Chỉ chophépcácgiátrị từ 00 đếnFFH nạpvàoTH0 •Tựđộngnạplại(Auto-reloading) • Giátrị trongTL0 sẽ tăngnếuTR0=1 và 1 xungbênngoàixuất hiện Xung & Hoi45
- Bàitoán10.9. Đếmxung& xuấtport Giảđịnh1 xungclock được đưavàochânT1, viếtchương trìnhbộđếm1 làmviệc ở mode 2 đểđếmxung& hiểnthị giá trị củaTL1 raP2, khiCounter trànthìkếtthúc? 8051 P2 to LEDs P3.5 T1 Xung & Hoi46
- Ans: MOV TMOD, #01100000B ;mode 2, counter 1 MOV TH1, #0 SETB P3.5 SETB TR1;start BACK: MOV A,TL1 MOV P2,A;display in P2 JNB TF1,BACK;overflow CLR TR1;stop CLR TF1;make TF=0 Xung & Hoi47
- Bàitoán10.10. Đếmxung& Hiểnthị LCD •Giả sử 1 xungtầnsố1Hz đượccấpvàochânP3.4. Viết chươngtrìnhhiểnthị counter 0 trênLCD. Khởitạogiátrị ban đầuchothanhghiTH0 là-60. 8051 P1 to LCD P3.4 1 Hz clock T0 Xung & Hoi48
- ACALL LCD_SET_UP ;initialize the LCD MOV TMOD,#00000110B ;Counter 0,mode2 MOV TH0,#-60 SETB P3.4 ;make T0 as input AGAIN: SETB TR0 ;starts the counter BACK: MOV A,TL0 ;every 60 events ACALL CONV ;convert in R2,R3,R4 JNB TF0,BACK ;loop if TF0=0 CLR TR0 ;stop CLR TF0 SJMP AGAIN Xung & Hoi49
- ;converting 8-bit binary to ASCII CONV: MOV B,#10 ;divide by 10 DIV AB MOV R2,B ;save low digit MOV B,#10 ;divide by 10 once more DIV AB ORL A,#30H ;make it ASCII MOV R4,A MOV A,B ORL A,#30H R4 R3 R2 MOV R3,A MOV A,R2 ORL A,#30H MOV R2,A ;ACALL LCD_DISPLAY here RET Xung & Hoi50
- Bàitoán10.11. Đồnghồsố •Cảitiếnvídụtrênthựchiện1 đồnghồsốđơngiản, chưacần cácnúthiệuchỉnhgiở, phút? •Việcsửdụnglệnh “JNB TF0,target” để giámsátcờTF0 làsựhoangphíthờigianvôcùnglớn –Giảipháplàdùngngắt, đề cậptrongphần12 củabàigiảng –Vớingắt, tacóthể thựcthinhiềuviệc –KhicờTF đượcset, nósẽthôngbáochochúngta Xung & Hoi51
- 1.Giớithiệu 2.Sơđồ khốivàchân 3.Tổchứcbộnhớ 4.Cácthanhghichứcnăng đặcbiệt(SFR) 5.Dao độngvàhoạt độngreset 6.Tậplệnh 7.Cácmode định địachỉ (addressing modes) 8.LậptrìnhIO 9.Tạotrễ 10.LậptrìnhTimer/Counter 11.Lập trình giao tiếp nối tiếp (serial comm programming) 12.Lậptrìnhngắt(interrupt programming) 13.Lậptrìnhhợpngữ Xung & Hoi1
- 11-1. Giớithiệu •Port nốitiếphoạt độngsong công(full duplex), nghĩalàcó khả năngthuvàphát đồngthời •Sửdụng2 thanhghichứcnăng đặcbiệt SBUF (địachỉ byte là 99H) & SCON (địachỉ byte là98H) để truyxuấtport nốitiếp •Việc ghilênSBUF sẽ nạpdữliệu để phát, vàviệc đọcSBUF sẽ truyxuấtdữliệu đãnhận được à thựcracó2 SBUF riêng rẽ •SCON chứacácbit trạngtháivà điềukhiển, thanhnày được định địachỉ bit •Tầnsốhoạt độngcủaport nốitiếphay còngọilà tốc độ baud (baud rate) cóthể cốđịnhhoặcthay đổi Xung & Hoi2
- RXD TXD (P3.0) (P3.1) D Clk SBUF Q Shift Register (write only) Clk Baud rate clock Baud rate clock (phát) (thu) SBUF (read only) 8051 internal bus Xung & Hoi3
- 11-2. Thanhkhi điềukhiểnport nốitiếp SCON SM0 SM1 SM2 REN TB8 RB8 TI RI SM1, SM0: chọnchếđộ củaport nốitiếp SM2: chophéptruyềnthông đaxửlý REN: chophépthu, phải đượcset để nhậncáckýtự TB8:bit thứ 9 đượcphát ở chếđộ 2 & 3 RB8:bit thứ 9 nhận được TI: cờ ngắtphát, đượcset ngaysaukhikếtthúcviệcphát1 kýtự; đượcxóabởiphầnmềm RI: cờ ngắtthu, đượcset ngaysaukhikếtthúcviệcthu1 kýtự; đượcxóabởiphầnmềm Xung & Hoi4
- 11-3. Cácchếđộ hoạt động SM0SM1ModeMôtả Tốcđộ baud 000ThanhghidịchCốđịnh(fOSC/12) 011UART 8-bit Thay đổi (thiếtlập bởibộđịnhthời) 102UART 9-bitCốđịnh(fOSC/12 hoặcfOSC/64) 113UART 9-bit Thay đổi (thiếtlập bởibộđịnhthời) Xung & Hoi5
- 11-3-1. Thanhghidịch8-bit (mode 0) •Khiphátvàthudữliệu8-bit, bit LSB đượcpháthoặcthutrước tiên •Tốcđộ baud cốđịnh= fOSC/12 •ChânRxDdùngchocảviệcthuphátdữliệutrongkhiTxD dùnglàmchânxuấtclock dịchbit •Phát: –GhivàoSBUF –Dữliệu đượcdịchrangoàitrênchânRxD(P3.0) –Xungclock dịchbit đượcgửiratrênchânTxD(P3.1) –Mỗibit hợplệtruyền đitrênRxDtrong1 chukỳmáy Xung & Hoi6
- •Thu: –Chỉđượckhởi độngkhiREN = 1 & RI = 0, nghĩalàphảiset REN = 1 ở thời điểmbắtđầuchươngtrình& xóaRI để bắt đầucôngviệcthudữliệu –Dữliệu đượcdịchvàochânRxDbởixungclock dịchbit (tác độngsườnlên) •1 Ứngdụngcủamode 0: –Mởrộngthêmcácngõracho8051 8 ngõramởrộng 8051 TxD(P3.1) Clock Shift Regsiter RxD(P3.0) Data Xung & Hoi7
- 11-3-2. UART 8-bit cótốcđộ baud thay đổi(mode 1) •UART làbộthuphátdữliệunốitiếpvớimỗikýtựdữliệu được đứngtrướcbởi1 bit start và đứngsaubởi1 bit stop. Thỉnhthoảng1 bit parity đượcchènvào. •Hoạt độngchủ yếucủaUART làbiếndữliệupháttừ// thành ntvàbiếndữliệuthutừntthành// •CờngắtphátTI đượcset bằng1 ngaykhibit stop xuấthiện trênTxD 1 / baud rate Start Stop TxD bit bit D0D1D2D3D4D5D6D7 TI TI (ready for more Xung & Hoi8data)
- •Việcnhận đượckhởi độngbởi1 chuyểntrạngtháitừ1 xuống 0 trên đườngRxD(bit start) •Bit start sau đó đượcbỏqua & 8 bit dữ liệusau đó đượcnhận tuầntựvàothanhghidịchbit củaport nốitiếp. Khicả8 bit đượcnhận, tacó: –Bit thứ 9 (bit stop) à RB8 củaSCON –8 bit dữ liệu đượcnạpvàoSBUF –CờngắtthuRI đượcset •Note: Các điềutrênchỉ xảyranếutrước đócờRI = 0 Xung & Hoi9
- 11-4. Khởi độngvàtruyxuấtcácthanhghi •Chophépnhận: REN trongSCON phải đượcset bởiphần mềm để chophépnhậnkýtự SETBREN Hoặc MOVSCON, #xxx1xxxxB •Thêmvàobit chẵnlẻ:bit P trongPSW đượcset hoặcxóa ở mỗichukỳmáy để thiếtlậpviệckiểmtrachẵncho8 bit chứa trongA MOVC, P; đưabit kiểmtrachẵnvàoTB8 MOVTB8, C; bit nàytrở thànhbit thứ 9 MOVSBUF, A; dichuyển8 bit dữ liệuvàoSBUF Xung & Hoi10
- •Cáccờngắt: RI vàTI đượcset bằngphầncứngnhưngphải xóabằngphầnmềm CTC nhận1 kýtựqua port nốitiếpnhư sau: INCHAR:JNBRI, $ CLRRI MOVA, SBUF RET CTC phát1 kýtựqua port nt: OUTCHAR:JNBTI, $ CLRTI MOVSBUF, A RET Xung & Hoi11
- 11-5. Tốc độ baud củaport nốitiếp On-chip Baud rate OSC ¸12 clock Mode 0 ¸64 SMOD=0 On-chip Baud rate OSC clock SMOD=1 Mode 2 ¸32 ¸32 SMOD=0 Timer 1 Baud rate overflow clock SMOD=1 Mode 1 & 3 ¸16 Xung & Hoi12
- Dùngtimer 1 làmxungclock tốc độ baud •Thôngthườngkhởi độngthanhghiTMOD ở chếđộ tựđộng nạplại8-bit (mode 2) & đặtgiátrị nạplạithíchhợpvàothanh ghiTH1 để cótốcđộ tràn đúng, từđótạoratốcđộ baud •MOVTMOD, #0010xxxxB ;for timer 1 •Baud rate = Timer 1 overflow / 32 hay /16 tùythuộcgiátrị bit SMOD Xung & Hoi13
- Bàitoán11.1 •Tínhtoáncácgiátrị nạplạichothanhghiTH1 đốivớicáctốc độ baud 9600, 4800, 2400, 1200 (XTAL = 11,0592MHz)? Tốc độ Tầnsốthạch Giátrị nạp Tốcđộ baud SMOD Saisố baud anh(MHz) choTH1 thựctế 9600 12 1 -7 (F9H) 8929 ~7% 1200 12 0 -26 (E6H) 1202 0,16% 19200 11,0592 1 -3 (FDH) 19200 0% 9600 11,0592 0 -3 (FDH) 9600 0% 4800 11,0592 0 -6 (FAH) 4800 0% 2400 11,0592 0 -12 (F4H) 2400 0% 1200 11,0592 0 -24 (E8H) 1200 0% Xung & Hoi14
- Tómlại: NếuPCON.7 = 0 •TH1 = 256 -((Crystal / 384) / Baud) NếuPCON.7 =1 •TH1 = 256 -((Crystal / 192) / Baud) Làmvdvớibaud rate 19200 để chứngtỏvaitròbit SMOD 11.059Mhz crystal: •TH1 = 256 -((Crystal / 384) / Baud) TH1 = 256 -((11059200 / 384) / 19200 ) TH1 = 256 -((28799) / 19200) TH1 = 256 -1.5 = 254.5 Xung & Hoi15
- •Nếuset 254 ta đạt được14,400 baud cònvới255 ta đạt được 28,800 baud •Set PCON.7 (SMOD). Ta có: TH1 = 256 -((Crystal / 192) / Baud) TH1 = 256 -((11059200 / 192) / 19200) TH1 = 256 -((57699) / 19200) TH1 = 256 -3 = 253 Kếtluậnvới19,200 baud (11.0592MHz crystal) taphải: 1.CấuhìnhPort nốitiếpmode 1 or 3 2.Timer 1 hoạt độngmode 2 (8-bit auto-reload) 3.Set TH1 bằng253 4.Set PCON.7 (SMOD) Xung & Hoi16
- Cácbàitoán • EBT11.1. Khởi độngport nt: Viếtchuỗilệnhkhởi độngport nốitiếphoạt độngnhư 1 UART 8-bit vớitốcđộ baud 2400. Dùngtimer 1 để cungcấpxungclock tốc độ baud? • EBT11.2. CTC xuấtkýtự: ViếtCTC mangtênOUTCHAR phátmãASCII 7-bit chứatrongA raport nốitiếpvớibit kiểm trachẵnlàbit thứ 8. Việctrở về từ CTC phảikhônglàmthay đổinộidung thanhchứaA? • EBT11.3. CTC thukýtự: ViếtCTC mangtênINCHAR để thu1 kýtự từport nốitiếp& trả về mãASCII 7-bit trongA. Sử dụngkiểmtrachẵntrongbit thứ 8 thu đượcvàset cờ nhớ bằng1 nếucólỗichẵnlẻ? Xung & Hoi17
- MAX 232 Xung & Hoi18
- Xung & Hoi19