Các chức năng của họ vi điều khiển MCS-51_chương 4

Chia sẻ: Trần Huệ Mẫn | Ngày: | Loại File: PDF | Số trang:20

0
193
lượt xem
68
download

Các chức năng của họ vi điều khiển MCS-51_chương 4

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

- Một bộ định thời (timer) là một chuỗi các Flip Flop(FF) với mỗi FF là một mạch chia. - Chuỗi này nhận một tín hiệu ngõ vào làm xung clock kích cho tầng đầu tiên, ngõ ra của tầng đầu lại trở thành nguồn xung clock cho tầng kế tiếp.

Chủ đề:
Lưu

Nội dung Text: Các chức năng của họ vi điều khiển MCS-51_chương 4

  1. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 CHÖÔNG 4: CAÙC CHÖÙC NAÊNG CUÛA HOÏ VI ÑIEÀU KHIEÅN MCS-51 I. TIMER 1. Giôùi thieäu - Moät boä ñònh thôøi (timer) laø moät chuoãi caùc Flip Flop (FF) vôùi moãi FF laø moät maïch chia 2. Chuoãi naøy nhaän moät tín hieäu ngoõ vaøo laøm xung clock kích cho taàng ñaàu tieân, ngoõ ra cuûa taàng ñaàu laïi trôû thaønh nguoàn xung clock cho taàng keá tieáp. Ngoõ ra cuûa taàng cuoái cuøng laøm xung clock cho moät FF baùo traøn timer hay coøn goïi laø côø traøn (overflow flag). Côø traøn naøy seõ ñöôïc kieåm tra bôûi phaàn meàm hay taïo ra moät ngaét (interrupt). Hình 4.1 minh hoïa moät timer ñôn giaûn 3-bit. - Giaù trò nhò phaân trong caùc FF cuûa timer ñöôïc duøng ñeå tính soá xung clock (soá chu kì) cuûa tín hieäu ngoõ vaøo töø khi timer baét ñaàu ñeám. D /Q D /Q D /Q D /Q Flag Clock Q Q Q Q LSB MSB Hình 4.1 - 8051/8031 coù 2 timer 16 bit: + Timer 0: soá ñeám chöùa trong thanh ghi TH0 (byte cao) vaø TL0 (byte thaáp) + Timer 1: soá ñeám chöùa trong thanh ghi TH1 (byte cao) vaø TL1 (byte thaáp) Ngoaøi ra, caùc chip 8032/8052 coøn coù theâm timer 2. - Caùc timer chæ ñeám leân (0000H ÷ FFFFH). Khi soá ñeám traøn töø FFFFH xuoáng 0000H, côø traøn seõ ñöôïc ñaët leân 1. 2. Caùc thanh ghi cuûa timer: a. Thanh ghi cheá ñoä ñònh thôøi (TMOD): MSB LSB Gate C/T M1 M0 Gate C/T M1 M0 Timer 1 Timer 0 - Khoâng ñöôïc ñònh ñòa chæ bit. - Ñöôïc duøng ñeå ñònh cheá ñoä hoaït ñoäng cho caùc timer. - Chöùc naêng töøng bit: + M1, M0: choïn cheá ñoä hoaït ñoäng. M1 M0 Cheá ñoä (Mode) 0 0 0 0 1 1 1 0 2 1 1 3 + C / T : bit choïn chöùc naêng ñeám hoaëc ñònh thôøi cho timer. + Gate: bit ñieàu khieån coång cho boä ñònh thôøi. http://www.ebook.edu.vn 1
  2. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 b. Thanh ghi ñieàu khieån ñònh thôøi (TCON): MSB LSB TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Timer Interrupt - Chöùa caùc bit ñieàu khieån vaø traïng thaùi cuûa timer 0 vaø 1 ôû 4 bit cao, 4 bit thaáp ñöôïc duøng cho chöùc naêng ngaét (interrupt). - Ñöôïc ñònh ñòa chæ bit. - Chöùc naêng töøng bit: + TFx: côø traøn cuûa timer x (x laø 0 hay 1) + TRx = 0: khoâng cho pheùp timer chaïy. TRx = 1: cho pheùp timer chaïy. 3. Ñieàu khieån caùc boä ñònh thôøi On-chip Osc. ÷12 TLx THx TFx 0: treân 0: treân Tx 1: döôùi 1: döôùi C/T TRx Gate 8051 INTx Hình 4.2 - C / T (Counter/Timer): + C / T = 0: timer nhaän xung clock töø boä dao ñoäng noäi (sau khi qua boä chia 12). → ÖÙng duïng: thöôøng duøng cho vieäc ñònh thôøi moät khoaûng thôøi gian (moãi soá ñeám töông öùng vôùi 1 chu kyø maùy). + C / T = 1: timer nhaän xung clock töø chaân Tx (P3.4 ñoái vôùi timer 0 vaø P3.5 ñoái vôùi timer 1). → ÖÙng duïng: thöôøng duøng ñeå ñeám söï kieän beân ngoaøi. Moãi söï kieän taïo ra moät xung kích vaøo chaân Tx (tích cöïc caïnh xuoáng). Soá caùc söï kieän ñöôïc xaùc ñònh trong phaàn meàm baèng caùch ñoïc caùc thanh ghi ñònh thôøi (THx/TLx), giaù trò 16-bit trong caùc thanh ghi naøy taêng theo moãi söï kieän. - Gate: + Gate = 0: vieäc ñieàu khieån timer x chæ phuï thuoäc vaøo TRx. TRx = 0: khoâng cho pheùp timer x chaïy. TRx = 1: cho pheùp timer x chaïy. http://www.ebook.edu.vn 2
  3. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 + Gate = 1: vieäc ñieàu khieån timer x phuï thuoäc vaøo TRx vaø INTx . TRx = 1 vaø INTx = 1: cho pheùp timer chaïy. → ÖÙng duïng: thöôøng duøng ñeå ño ñoä roäng xung (thôøi gian xung ôû möùc cao) ñöa vaøo ôû chaân INTx . Ñoä roäng xung töông öùng vôùi soá ñeám trong THx/TLx. 4. Caùc cheá ñoä ñònh thôøi a. Cheá ñoä 0 - Xaùc laäp M1M0 = 00 - Laø cheá ñoä ñònh thôøi 13-bit töông thích vôùi boä vi ñieàu khieån 8048 tröôùc ñoù. Cheá ñoä naøy thöôøng ít duøng. b. Cheá ñoä 1 - Xaùc laäp M1M0 = 01 - Laø cheá ñoä ñònh thôøi 16-bit: soá ñeám 16-bit chöùa trong caëp thanh ghi THx/TLx → khoaûng ñeám toái ña laø 65536 chu kì maùy. - Giaù trò baét ñaàu ñeám ñöôïc naïp vaøo THx vaø TLx. Khi timer traøn, ñeå naïp laïi giaù trò baét ñaàu ñeám caàn phaûi döøng timer. Ví duï 1.1: Vieát 1 ñoaïn chöông trình khôûi ñoäng timer 0 ôû cheá ñoä 1 vaø duøng timer 0 ñeå taïo ra 1 xung möùc cao roäng 1ms ôû chaân P1.0. Giaû söû duøng thaïch anh 12MHz. Giaûi: MOV TMOD,#00000001B ; khôûi ñoäng timer 0 ôû cheá ñoä 1 CLR P1.0 ; xoùa P1.0 MOV TH0,#HIGH(-1000) ; naïp byte cao cuûa -1000 (FCH) vaøo TH0 MOV TL0,#LOW(-1000) ; naïp byte thaáp cuûa -1000 (18H) vaøo TL0 SETB TR0 ; cho timer 0 chaïy SETB P1.0 ; ñaët P1.0 leân möùc cao JNB TF0,$ ; chôø cho ñeán khi timer traøn (TF0 = 1) CLR P1.0 ; xoùa P1.0 CLR TF0 ; xoùa côø traøn TF0 ñeå duøng cho caùc laàn sau Ví duï 1.2: Vieát chöông trình con taïo treã 200ms duøng timer 1. Giaû söû fOSC = 12MHz. Giaûi: 12 fOSC = 12MHz → chu kyø maùy TM = = 1μs f OSC Neáu duøng timer 1 ôû cheá ñoä 1 thì thôøi gian ñònh thôøi toái ña laø 65536μs < 200.000μs = 200ms → phaûi duøng theâm voøng laëp ngoaøi. Ñeå ñôn giaûn, moãi voøng laëp seõ delay 50.000μs → soá laàn laëp laø 4. Chöông trình: DELAY_200MS: MOV TMOD,#10H MOV R7,#4 LOOP: MOV TH1,#HIGH(-50000) MOV TL1,#LOW(-50000) SETB TR1 JNB TF1,$ CLR TR1 CLR TF1 DJNZ R7, LOOP RET http://www.ebook.edu.vn 3
  4. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 Ví duï 1.3: Vieát chöông trình duøng timer taïo soùng vuoâng ñoái xöùng coù taàn soá 1KHz treân chaân P1.0. Giaûi: T tH tL 1 1 f = 1KHz → chu kyø T = = 3 = 10 −3 s = 1000μs → tH = tL = 500μs f 10 Taàn soá thaïch anh: 12 fOSC = 12MHz → chu kyø maùy TM = = 1μs → tH = tL = 500TM f OSC Chöông trình: (söû duïng timer 0) ORG 0 MOV TMOD,#01H LOOP: MOV TH0,#HIGH(-500) MOV TL0,#LOW(-500) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 CPL P1.0 SJMP LOOP END c. Cheá ñoä 2 - Xaùc laäp M1M0 = 10 - Laø cheá ñoä ñònh thôøi 8 bit töï ñoäng naïp laïi. + TLx: boä ñeám 8 bit → khoaûng ñeám toái ña laø 256 chu kì maùy. + THx: löu giaù trò baét ñaàu ñeám ñöôïc caøi ñaët. - Moãi khi timer traøn töø FFH xuoáng 00H, khoâng chæ côø traøn ñöôïc ñaët leân 1 maø giaù trò löu trong THx coøn ñöôïc töï ñoäng naïp vaøo cho TLx (khoâng caàn döøng timer) vaø vieäc ñeám seõ tieáp tuïc töø giaù trò naøy cho ñeán khi xaûy ra laàn traøn keá tieáp roài laëp laïi… Ví duï 1.4: Vieát chöông trình con delay 100μs duøng timer. Giaû söû fOSC = 12MHz. Giaûi: Do khoaûng thôøi gian taïo treã laø 100 μs = 100 TM < 256 → coù theå duøng timer ôû cheá ñoä 2. Chöông trình: DELAY_100US: MOV TMOD,#02H ; khôûi ñoäng timer 0 ôû cheá ñoä 2 MOV TH0,#-100 ; naïp giaù trò baét ñaàu ñeám –100 vaøo TH0 MOV TL0,TH0 SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET http://www.ebook.edu.vn 4
  5. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 Löu yù: thoâng thöôøng leänh khôûi ñoäng cheá ñoä timer ñöôïc ñaët trong chöông trình chính. Ví duï 1.5: Vieát chöông trình duøng timer 1 ñeå taïo soùng vuoâng ñoái xöùng, taàn soá f = 10KHz taïi chaân P1.7 (giaû söû fOSC = 6MHz). Giaûi: 1 1 f = 10KHz → chu kyø T = = = 10 − 4 s = 100μs → tH = tL = 50μs f 10.10 3 Taàn soá thaïch anh: 12 fOSC = 6MHz → chu kyø maùy TM = = 2μs → tH = tL = 25TM f OSC Chöông trình: ORG 0 MOV TMOD,#20H MOV TH1,#-25 SETB TR1 LOOP: JNB TF1,$ CPL P1.7 CLR TF1 SJMP LOOP END 4. Cheá ñoä 3 - Xaùc laäp M1M0 = 11 - Laø cheá ñoä taùch timer: timer 0 16-bit ñöôïc chia thaønh 2 timer 8-bit rieâng leõ TL0 vaø TH0 vôùi côø traøn töông öùng laø TF0 vaø TF1 (TF1 luùc naøy khoâng coøn laø côø traøn cuûa timer 1 nöõa). - Timer 1 khoâng hoaït ñoäng ôû cheá ñoä 3 nhöng coù theå ñöôïc duøng trong caùc cheá ñoä khaùc (khoâng söû duïng côø traøn TF1). Chuù yù: Caùc kyõ thuaät thöôøng ñöôïc duøng ñeå taïo caùc khoaûng thôøi gian ñònh thôøi khaùc nhau Khoaûng thôøi gian (chu kyø maùy) Kyõ thuaät ≈ 10 Ñieàu chænh phaàn meàm 256 Boä ñònh thôøi 8 bit töï ñoäng naïp laïi 65536 Boä ñònh thôøi 16 bit Khoâng giôùi haïn Boä ñònh thôøi 16 bit + caùc voøng laëp II. PORT NOÁI TIEÁP 1. Giôùi thieäu - Chöùc naêng cô baûn cuûa port noái tieáp laø chuyeån ñoåi döõ lieäu töø song song thaønh noái tieáp khi phaùt vaø töø noái tieáp thaønh song song khi thu. - Truy xuaát port noái tieáp thoâng qua 2 chaân: + RxD (P3.0): chaân thu cuûa port noái tieáp. + TxD (P3.1): chaân phaùt cuûa port noái tieáp. - Coù khaû naêng hoaït ñoäng song coâng (full duplex), töùc laø thu vaø phaùt ñoàng thôøi. Ngoaøi ra port noái tieáp coøn coù chöùc naêng ñeäm döõ lieäu khi thu cho pheùp moät kyù töï ñöôïc nhaän vaø löu giöõ trong boä ñeäm thu trong khi kyù töï tieáp theo ñöôïc nhaän vaøo. Neáu vi ñieàu khieån ñoïc kyù töï thöù nhaát tröôùc khi kyù töï thöù hai ñöôïc thu ñaày ñuû, döõ lieäu seõ khoâng bò maát. - Caùc thanh ghi lieân quan ñeán port noái tieáp: + SCON: chöùa caùc bit traïng thaùi vaø caùc bit ñieàu khieån port noái tieáp. + SBUF: laø boä ñeäm cuûa port noái tieáp. Thöïc teá, port noái tieáp goàm 2 boä ñeäm rieâng cho phaùt vaø thu. http://www.ebook.edu.vn 5
  6. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 - Taàn soá hoaït ñoäng cuûa port noái tieáp, hay coøn goïi laø toác ñoä baud (baud rate), coù theå coá ñònh hoaëc thay ñoåi. Khi duøng toác ñoä baud thay ñoåi, timer 1 ñöôïc laäp trình ñeå cung caáp xung clock toác ñoä baud phuø hôïp. TXD RXD (P3.1) (P3.0) SBUF Q D (write-only) Thanh ghi dòch CLK CLK Xung clock Xung clock toác ñoä baud toác ñoä baud (phaùt) (thu) SBUF (read-only) Bus noäi 8051 Hình 4.3 2. Thanh ghi ñieàu khieån port noái tieáp SCON MSB LSB SM0 SM1 SM2 REN TB8 RB8 TI RI - Ñòa chæ 99H. - Ñònh ñòa chæ bit. - Chöùc naêng caùc bit: + SM0, SM1: choïn cheá ñoä hoaït ñoäng cuûa port noái tieáp SM0 SM1 Cheá ñoä (Mode) Moâ taû 0 0 0 Thanh ghi dòch 0 1 1 UART 8 bit toác ñoä thay ñoåi 1 0 2 UART 9 bit toác ñoä coá ñònh 1 1 3 UART 9 bit toác ñoä thay ñoåi + SM2: choïn cheá ñoä hoaït ñoäng cuûa port noái tieáp. SM2 = 1: cho pheùp truyeàn thoâng ña xöû lyù ôû caùc cheá ñoä 2 vaø 3; bit RI seõ khoâng ñöôïc tích cöïc neáu bit thöù 9 nhaän ñöôïc laø 0. + REN: bit cho pheùp thu. REN = 1: cho pheùp thu. REN = 0: khoâng cho pheùp thu. + TB8: bit phaùt thöù 9 (ôû cheá ñoä 2 vaø 3), coù theå ñaët vaø xoùa baèng phaàn meàm. + RB8: bit thu thöù 9 (ôû cheá ñoä 2 vaø 3), coù theå ñaët vaø xoùa baèng phaàn meàm. http://www.ebook.edu.vn 6
  7. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 + TI: côø ngaét phaùt. Côø naøy ñöôïc ñaët leân 1 baèng phaàn cöùng khi phaùt xong 1 kyù töï (ñeå baùo boä ñeäm phaùt ñaõ roãng), ñöôïc xoùa baèng phaàn meàm. + RI: côø ngaét thu. Côø naøy ñöôïc ñaët leân 1 baèng phaàn cöùng khi thu xong 1 kyù töï (ñeå baùo boä ñeäm thu ñaõ ñaày), ñöôïc xoùa baèng phaàn meàm. 3. Caùc cheá ñoä hoaït ñoäng cuûa port noái tieáp a. Cheá ñoä 0 (thanh ghi dòch 8 bit) - Xaùc laäp SM0 SM1 = 0 0 - Döõ lieäu noái tieáp ñöôïc thu/phaùt thoâng qua chaân RxD. - Chaân TxD phaùt xung clock ñeå dòch bit. - Khi thu/phaùt döõ lieäu 8 bit, bit LSB ñöôïc thu/phaùt tröôùc tieân. - Toác ñoä baud coá ñònh vaø baèng 1/12 toác ñoä dao ñoäng treân chip (f = fM = fOSC /12). Moät öùng duïng khaû thi cuûa cheá ñoä 0 laø môû roäng theâm caùc ngoõ ra cho 8051. Moät vi maïch thanh ghi dòch noái tieáp-song song coù theå ñöôïc noái vôùi caùc chaân TxD vaø RxD cuûa 8051 ñeå cung caáp theâm 8 ñöôøng xuaát. Caùc thanh ghi dòch khaùc coù theå gheùp cascade vôùi thanh ghi dòch ñaàu tieân ñeå môû roäng theâm nöõa. 8 ngoõ ra môû roäng 8051 TXD (P3.1) CLOCK Thanh ghi dòch RXD (P3.0) Data Hình 4.4 b. Cheá ñoä 1 (UART 8 bit toác ñoä baud thay ñoåi) - Xaùc laäp SM0 SM1 = 0 1 - Port noái tieáp hoaït ñoäng nhö moät boä thu/phaùt baát ñoàng boä (universal asynchronous receiver/transmitter) UART 8 bit coù toác ñoä baud thay ñoåi ñöôïc. - Truyeàn 10 bit: 1 bit Start + 8 bit data + 1 bit Stop (luoân möùc 0) (bit LSB tröôùc) (luoân möùc 1) - Toác ñoä baud = (toác ñoä traøn cuûa timer 1) / 32 (neáu bit SMOD = 0) = (toác ñoä traøn cuûa timer 1) /16 ( neáu bit SMOD = 1) * Khi phaùt: - Tröôùc tieân, döõ lieäu ñöôïc ghi vaøo SBUF (phaùt). - Döõ lieäu ñöôïc dòch bit ñeå xuaát ra treân ñöôøng TxD seõ baét ñaàu baèng bit Start , tieáp theo laø 8 bit döõ lieäu vôùi LSB phaùt tröôùc vaø cuoái cuøng laø bit Stop. Bit Start vaø Stop do phaàn cöùng töï ñoäng cheøn vaøo. Thôøi gian cuûa moãi bit laø nghòch ñaûo cuûa toác ñoä baud. - Côø ngaét TI seõ ñöôïc töï ñoäng ñaët baèng 1 bôûi phaàn cöùng ngay khi bit Stop xuaát hieän treân ñöôøng TxD (töùc laø ñaõ phaùt xong 1 kyù töï döõ lieäu) ñeå baùo boä ñeäm phaùt ñaõ roãng. * Khi thu: - Vieäc thu ñöôïc khôûi ñoäng bôûi söï chuyeån traïng thaùi töø 1 xuoáng 0 treân ñöôøng RxD (baét ñaàu bit Start). - Khi 1 bit Start hôïp leä ñöôïc phaùt hieän, bit Start ñöôïc boû qua vaø 8 bit döõ lieäu ñöôïc nhaän tuaàn töï vaøo thanh ghi dòch bit cuûa port noái tieáp. Sau khi thu xong caû 8 bit, caùc ñieàu sau seõ xaûy ra: + Bit thöù 9 (bit Stop) ñöôïc ñöa ñeán bit RB8 trong SCON. http://www.ebook.edu.vn 7
  8. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 + 8 bit data ñöôïc naïp vaøo SBUF (thu). + Côø ngaét thu RI ñöôïc ñaët leân 1 bôûi phaàn cöùng. Tuy nhieân caùc ñieàu treân chæ xaûy ra neáu toàn taïi caùc ñieàu kieän sau: + REN = 1 + RI = 0 (baùo boä ñeäm thu chöa ñaày). + SM2 = 0 hoaëc SM2 = 1 vaø bit Stop nhaän ñöôïc baèng 1. c. Cheá ñoä 2 (UART 9 bit, toác ñoä baud coá ñònh) - Xaùc laäp SM0 SM1 = 1 0 - Port noái tieáp hoaït ñoäng ôû cheá ñoä UART 9 bit coù toác ñoä baud coá ñònh. - Truyeàn 11 bit: 1 bit Start + 8 bit data + bit data thöù 9 + 1 bit Stop (luoân möùc 0) (bit LSB tröôùc) (laäp trình ñöôïc) (luoân möùc 1) - Toác ñoä baud = fOSC / 64 (neáu bit SMOD = 0) hay fOSC / 32 (neáu bit SMOD = 1) - Khi phaùt, bit data thöù 9 laø bit baát kyø ñaët ôû TB8 trong thanh ghi SCON. - Khi thu, bit data thöù 9 nhaän ñöôïc seõ ñaët vaøo RB8 trong thanh ghi SCON. d. Cheá ñoä 3 (UART 9 bit, toác ñoä baud thay ñoåi ñöôïc) - Xaùc laäp SM0 SM1 = 1 0 - Port noái tieáp hoaït ñoäng ôû cheá ñoä UART 9 bit coù toác ñoä baud thay ñoåi ñöôïc, töông töï nhö cheá ñoä 2 nhöng toác ñoä baud ñöôïc laäp trình vaø ñöôïc cung caáp bôûi timer 1. - Toác ñoä baud = (toác ñoä traøn cuûa timer 1) / 32 (neáu bit SMOD = 0) = (toác ñoä traøn cuûa timer 1) / 16 (neáu bit SMOD = 1) * Giaûi thuaät chöông trình con thu vaø phaùt moät byte: INCHAR OUTCHAR RI = 1 ? TI = 1 ? N N Y Y Xoùa côø RI Xoùa côø TI Ñoïc SBUF Ghi ra SBUF RET RET * Chöông trình: INCHAR: ; CT con thu 1 byte OUTCHAR: ; CT con phaùt 1 byte JNB RI,$ JNB TI,$ CLR RI CLR TI MOV A,SBUF MOV SBUF,A RET RET 4. Toác ñoä baud cho port noái tieáp ÔÛ cheá ñoä 1 vaø 3, toác ñoä baud cho port noái tieáp ñöôïc laäp trình bôûi timer 1: Toác ñoä baud = (toác ñoä traøn timer 1) / 32 (SMOD = 0) / 16 (SMOD = 1) http://www.ebook.edu.vn 8
  9. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 → toác ñoä traøn timer 1 (ftraøn) = toác ñoä baud x 32 (hay x16) → thôøi gian traøn timer 1 (Ttraøn) = 1 / (toác ñoä traøn timer 1) Ttraøn f Soá caàn naïp cho timer 1 = = M TM ftraøn Ví duï: Vieát 1 ñoaïn chöông trình taïo toác ñoä baud 2400 (vôùi fOSC = 12MHz, SMOD = 0) ftraøn timer 1 = 2400 x 32 = 76800 Hz → Ttraøn timer 1 = 1/76800 = 13,021μs fOSC = 12MHz → TM = 1μs → Thôøi gian traøn timer 1 = 13,021/1 ≈ 13μs → sai soá: (13,021 – 13)/13 = 0,16% MOV TMOD,#00100000B ; khôûi ñoäng timer 1 ôû mode 2 MOV TH1,#-13 ; thôøi gian traøn laø 13TM SETB TR1 Ví duï: Taïo toác ñoä baud 9600 (vôùi fOSC = 12MHz, SMOD = 0) f 12MHz/12 Soá caàn naïp cho timer 1 = M = = 3,255 ≈ 3 ftraøn 9600 × 32 → sai soá: (3,255 – 3) / 3 = 8,5% : khaù lôùn. Ví duï: Taïo toác ñoä baud 1200 (vôùi fOSC = 12MHz, SMOD = 0) f 12MHz/12 Soá caàn naïp cho timer 1 = M = = 26,042 ≈ 26 ftraøn 1200 × 32 → sai soá: (26,042 – 26) / 26 = 0,16% Baûng toùm taét moät soá toác ñoä baud Toác ñoä baud Taàn soá SMOD Giaù trò naïp Toác ñoä baud Sai soá thaïch anh cho TH1 thöïc teá 9600 12,000MHz 1 -7 (F9H) 8923 7% 2400 12,000MHz 0 -13 (F3H) 2404 0,16% 1200 12,000MHz 0 -26 (E6H) 1202 0,16% 19200 11,059MHz 0 -3 (FDH) 19200 0 9600 11,059MHz 0 -3 (FDH) 9600 0 2400 11,059MHz 0 -12 (F4H) 2400 0 1200 11,059MHz 0 -24 (E8H) 1200 0 → Caàn truyeàn vôùi toác ñoä chính xaùc thì söû duïng thaïch anh 11,059MHz. 5. Caùc ví duï Ví duï 2.1: Vieát chöông trình phaùt 1 chuoãi maõ ASCII keát thuùc baèng kyù töï null (coù maõ ASCII laø 00H) ra port noái tieáp (khoâng gôûi kyù töï null). Bieát raèng chuoãi maõ ASCII naèm trong RAM ngoaøi baét ñaàu taïi ñòa chæ 2000H. Giaû söû truyeàn UART 8 bit, toác ñoä baud 2400, fOSC = 12MHz. Giaûi: ORG 0 ; khôûi ñoäng port noái tieáp MOV SCON,#01010010B ; port noái tieáp ôû mode 1 MOV TMOD,#20H ; timer 1 ôû mode 2 MOV TH1,#-13 ; toác ñoä baud = 2400 SETB TR1 ; cho pheùp timer 1 chaïy ñeå taïo xung clock toác ñoä baud http://www.ebook.edu.vn 9
  10. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 ; phaùt chuoãi maõ ASCII MOV DPTR,#2000H ; troû ñeán ñòa chæ RAM ngoaøi 2000H LOOP: MOVX A,@DPTR ; laáy noäi dung oâ nhôù RAM ngoaøi vaøo A CJNE A,#00H,CONT ; kieåm tra xem coù phaûi kyù töï null khoâng SJMP EXIT ; neáu ñuùng, keát thuùc chöông trình CONT: ; neáu khoâng, phaùt kyù töï ñoù ACALL OUTCHAR ; goïi chöông trình con OUTCHAR INC DPTR ; taêng noäi dung con troû SJMP LOOP ; laëp laïi vieäc phaùt kyù töï ; chöông trình con OUTCHAR phaùt 1 byte döõ lieäu (1 kyù töï) OUTCHAR: JNB TI,$ ; chôø côø TI baèng 1 baùo boä ñeäm phaùt roãng CLR TI ; xoùa côø TI MOV SBUF,A ; chuyeån noäi dung thanh ghi A ra SBUF RET EXIT:NOP ; theâm leänh NOP do END khoâng phaûi laø leänh cuûa 8051 END Ví duï 2.2: Vieát chöông trình nhaäp 1 chuoãi maõ ASCII töø port noái tieáp vaø caát vaøo RAM noäi baét ñaàu töø ñòa chæ 30H. Chuoãi maõ ASCII keát thuùc baèng kyù töï CR (coù maõ ASCII laø 13H). Caát caû kyù töï CR vaøo RAM noäi vaø keát thuùc chuoãi baèng caùch theâm kyù töï null. Giaû söû truyeàn UART 8 bit, toác ñoä baud 2400, fOSC = 12MHz, bit SMOD = 0. Giaûi: ORG 0 ; khôûi ñoäng port noái tieáp MOV SCON,#01010010B ; port noái tieáp ôû mode 1 MOV TMOD,#20H ; timer 1 ôû mode 2 MOV TH1,#-13 ; toác ñoä baud = 2400 SETB TR1 ; cho pheùp timer 1 chaïy ñeå taïo xung clock toác ñoä baud ; nhaäp chuoãi maõ ASCII MOV R0,#30H ; troû ñeán oâ nhôù RAM noäi 30H LOOP: ACALL INCHAR ; nhaäp 1 byte töø port noái tieáp vaøo A MOV @R0,A ; caát byte kyù töï vaøo oâ nhôù RAM noäi INC R0 ; taêng noäi dung con troû CJNE A,#13H,LOOP ; kieåm tra kyù töï thu ñöôïc coù phaûi laø CR khoâng, ; neáu khoâng thì laëp laïi MOV @R0,#0 ; neáu ñuùng, keát thuùc vaø cheøn theâm kyù töï null SJMP EXIT INCHAR: JNB RI,$ CLR RI MOV A,SBUF RET EXIT:NOP END http://www.ebook.edu.vn 10
  11. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 Ví duï 2.3: Vieát chöông trình con gôûi lieân tuïc caùc kyù töï chöõ thöôøng ra port noái tieáp. Giaûi: - Phaàn khôûi ñoäng port noái tieáp ñöôïc vieát ôû chöông trình chính. - Söû duïng chöông trình con OUTCHAR ñaõ trình baøy ôû treân ñeå xuaát 1 btye ra port noái tieáp. SEND: MOV A,#‘a’ ; chuyeån maõ ASCII cuûa kyù töï ‘a’ vaøo thanh ghi A LOOP: ACALL OUTCHAR ; xuaát kyù töï töø thanh ghi A ra port noái tieáp INC A ; taêng leân maõ ASCII cuûa kyù töï keá CJNE A,#‘z’+1,LOOP ; so saùnh (A) vôùi maõ ASCII cuûa ‘z’+1 RET ; neáu chöa baèng thì laëp laïi, neáu baèng thì thoaùt Ví duï 2.4: Vieát chöông trình nhaäp caùc kyù töï töø port noái tieáp roài xuaát ra port noái tieáp lieân tuïc. Neáu kyù töï nhaäp vaøo laø kyù töï ñieàu khieån (coù maõ ASCII töø 00H ÷ 1FH vaø 7FH) thì xuaát ra kyù töï ‘.’ñeå thay theá. Giaû söû toác ñoä baud = 1200, UART 8 bit, fOSC = 12MHz. Giaûi: ORG 0 ; khôûi ñoäng port noái tieáp MOV SCON,#01010010B ; port noái tieáp ôû mode 1 MOV TMOD,#20H ; timer 1 ôû mode 2 MOV TH1,#-26 ; toác ñoä baud = 1200 SETB TR1 ; cho pheùp timer 1 chaïy ñeå taïo xung clock toác ñoä baud ; nhaäp kyù töï vaø so saùnh LOOP: ACALL INCHAR ; nhaäp kyù töï töø port noái tieáp CJNE A,#7FH,CONT ; so saùnh vôùi 7FH SJMP CTRL ; neáu baèng, nhaûy ñeán nhaõn xuaát CTRL CONT: ; neáu khoâng, so saùnh tieáp CJNE A,#20H,CONT1 ; kyù töï coù baèng 20H CONT1: JC CTRL ; neáu nhoû hôn 20H thì nhaûy ñeán nhaõn CTRL SJMP OUT ; neáu khoâng, xuaát kyù töï ra port noái tieáp CTRL: MOV A,#‘.’ ; chuyeån maõ ASCII cuûa kyù töï ‘.’ vaøo thanh ghi A OUT: ACALL OUTCHAR ; xuaát kyù töï ra port noái tieáp SJMP LOOP ; laëp laïi INCHAR: JNB RI,$ CLR RI MOV A, SBUF RET OUTCHAR: JNB TI,$ CLR TI MOV SBUF,A RET END http://www.ebook.edu.vn 11
  12. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 III. INTERRUPT (NGAÉT) 1. Giôùi thieäu - Interrupt (Ngaét): laø vieäc ngöng thöïc hieän chöông trình hieän haønh do söï taùc ñoäng cuûa beân ngoaøi hay beân trong ñeå nhaûy tôùi thöïc hieän 1 chöông trình khaùc, ñöôïc goïi laø chöông trình phuïc vuï ngaét ISR (Interrupt Service Routine). Khi thöïc hieän xong chöông trình ISR, chöông trình tröôùc ñoù ñöôïc tieáp tuïc thöïc thi taïi nôi bò taïm döøng. - 8031/8051 coù 5 nguoàn ngaét: + 2 ngaét ngoaøi: ngaét ngoaøi 0: qua chaân INT0 (P3.2) ngaét ngoaøi 1: qua chaân INT1 (P3.3) + 3 ngaét trong: ngaét timer 0 ngaét timer 1 ngaét port noái tieáp 2. Caùc thanh ghi lieân quan ñeán ngaét a. Thanh ghi cho pheùp ngaét IE (Interrupt Enable) MSB LSB EA - (ET2) ES ET1 EX1 ET0 EX0 - Ñöôïc ñònh ñòa chæ bit. - Chöùc naêng töøng bit: EA: cho pheùp toaøn boä ET2: cho pheùp ngaét timer 2 (neáu coù) ES: cho pheùp ngaét port noái tieáp ET1: cho pheùp ngaét timer 1 EX1: cho pheùp ngaét ngoaøi 1 ET0: cho pheùp ngaét timer 0 EX0: cho pheùp ngaét ngoaøi 0 - Ñeå cho pheùp 1 nguoàn ngaét, caàn phaûi coù: + EA = 1 + Bit cho pheùp ngaét töông öùng baèng 1. Ví duï: Khôûi ñoäng thanh ghi IE cho pheùp ngaét timer 0 vaø ngaét ngoaøi 0 MOV IE, #10000011B Hay: SETB EA SETB ET0 SETB EX0 b. Thanh ghi öu tieân ngaét IP (Interrupt Priority) MSB LSB - - (PT2) PS PT1 PX1 PT0 PX0 - Ñöôïc ñònh ñòa chæ bit. - Bit = 1: möùc öu tieân cao Bit = 0: möùc öu tieân thaáp Maëc nhieân sau khi reset, taát caû caùc ngaét ôû möùc öu tieân thaáp. http://www.ebook.edu.vn 12
  13. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 - Neáu 2 ngaét vôùi möùc öu tieân khaùc nhau xuaát hieän ñoàng thôøi, ngaét coù möùc öu tieân cao seõ ñöôïc phuïc vuï tröôùc. Ñoàng thôøi, ngaét coù möùc öu tieân cao cuõng coù theå taïm döøng chöông trình phuïc vuï ngaét cuûa ngaét coù möùc öu tieân thaáp. - Neáu caùc ngaét coù cuøng möùc öu tieân xuaát hieän ñoàng thôøi, vieäc xaùc ñònh ngaét naøo ñöôïc phuïc vuï tröôùc seõ theo thöù töï: ngoaøi 0, timer 0, ngoaøi 1, timer 1, port noái tieáp, timer 2 (ñoái vôùi 8032/8052). c. Thanh ghi TCON MSB LSB TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Timer Interrupt - Ñònh ñòa chæ bit. - Chöùc naêng caùc bit lieân quan ñeán ngaét (interrupt): + IEx: côø ngaét ngoaøi x (IEx = 1 → taïo ngaét ngoaøi x) + ITx: bit xaùc ñònh loaïi taùc ñoäng ngaét ngoaøi x ITx = 0 : taùc ñoäng möùc 0 ITx = 1 : taùc ñoäng caïnh xuoáng (thöôøng duøng) 3. Caùc ngaét cuûa 8031/8051 a. Caùc ngaét ngoaøi (ngoaøi 0 vaø ngoaøi 1): - Khi coù xung caïnh xuoáng ( ) (bit ITx = 1) hay möùc 0 (bit ITx = 0) taùc ñoäng vaøo chaân INTx (chaân P3.2 hoaëc P3.3) cuûa 8051, côø ngaét IEx töông öùng seõ ñöôïc ñaët baèng 1 → vi ñieàu khieån thöïc hieän chöông trình phuïc vuï ngaét cuûa ngaét ngoaøi töông öùng. - Khi moät ngaét ngoaøi ñöôïc taïo ra, côø ngaét seõ ñöôïc töï ñoäng xoùa bôûi phaàn cöùng khi vi ñieàu khieån chuyeån ñeán chöông trình phuïc vuï ngaét neáu ngaét thuoäc loaïi taùc ñoäng caïnh xuoáng. Coøn neáu ngaét thuoäc loaïi taùc ñoäng möùc, nguyeân nhaân ngaét ngoaøi seõ ñieàu khieån möùc cuûa côø thay vì phaàn cöùng. b. Caùc ngaét timer (timer 0 vaø timer 1) - Khi timer x traøn, côø TFx ñöôïc ñaët leân 1→ vi ñieàu khieån thöïc hieän chöông trình phuïc vuï ngaét cuûa timer x. - Côø TFx ñöôïc töï ñoäng xoùa veà 0 bôûi phaàn cöùng khi vi ñieàu khieån chuyeån ñeán chöông trình phuïc vuï ngaét. c. Caùc ngaét port noái tieáp - Khi TI = 1 (phaùt xong 1 byte) hay RI = 1 (thu xong 1 byte)→ vi ñieàu khieån thöïc hieän chöông trình phuïc vuï ngaét cuûa port noái tieáp. - Côø TI hay RI khoâng ñöôïc xoùa töï ñoäng bôûi phaàn cöùng khi chuyeån ñeán chöông trình phuïc vuï ngaét → ngöôøi laäp trình phaûi xoùa côø TI hay RI veà 0 baèng phaàn meàm. 4. Thieát keá chöông trình duøng caùc ngaét * Vector ngaét (Interrupt vector): laø ñòa chæ baét ñaàu cuûa 1 chöông trình phuïc vuï ngaét. Moãi loaïi ngaét khaùc nhau ñöôïc daønh rieâng moät vector ngaét. Khi moät ngaét ñöôïc chaáp nhaän, ñòa chæ vector ngaét töông öùng ñöôïc naïp vaøo thanh ghi PC. Baûng caùc vector ngaét: Nguyeân nhaân ngaét Côø Ñòa chæ vector ngaét Reset heä thoáng RST 0000H Ngaét ngoaøi 0 IE0 0003H Ngaét timer 0 TF0 000BH http://www.ebook.edu.vn 13
  14. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 Ngaét ngoaøi 1 IE1 0013H Ngaét timer 1 TF1 001BH Ngaét port noái tieáp RI hoaëc TI 0023H Löu yù: vieäc reset heä thoáng cuõng ñöôïc xem nhö laø moät ngaét vôùi ñòa chæ vector töông öùng laø 0000H. a. Chöông trình phuïc vuï ngaét coù kích thöôùc nhoû (≤ 8 byte) Chöông trình phuïc vuï ngaét coù theå ñöôïc vieát ngay taïi ñòa chæ vector ngaét neáu noù coù kích thöôùc khoâng quaù 8 byte. Khuoân maãu chöông trình sau coù theå ñöôïc söû duïng: ORG 0000H ; ñieåm nhaäp sau khi reset LJMP MAIN ; nhaûy ñeán chöông trình chính, boû qua vuøng vector ngaét ORG 0003H ; ñieåm nhaäp cuûa trình phuïc vuï ngaét ngoaøi 0 EXT0_ISR: …… RETI ; thoaùt khoûi trình phuïc vuï ngaét, quay veà chöông trình chính ORG 000BH ; ñieåm nhaäp cuûa trình phuïc vuï ngaét timer 0 T0_ISR: …… RETI ; thoaùt khoûi trình phuïc vuï ngaét, quay veà chöông trình chính …… ORG 0030H ; baét ñaàu CT chính taïi 0030H ñeå traùnh ñeø leân vuøng vector ngaét MAIN: …… END ; keát thuùc chöông trình b. Chöông trình phuïc vuï ngaét coù kích thöôùc lôùn (> 8 byte) Neáu chöông trình phuïc vuï ngaét coù kích thöôùc daøi hôn 8 byte, caàn phaûi di chuyeån chöông trình naøy ñeán moät nôi khaùc trong boä nhôù chöông trình hay coù theå laán qua vuøng cuûa ngaét khaùc neáu ngaét ñoù khoâng duøng. Thoâng thöôøng, ISR ñöôïc baét ñaàu vôùi moät leänh nhaûy ñeán moät vuøng khaùc cuûa boä nhôù chöông trình, ôû ñoù chöông trình ñöôïc traûi roäng neáu caàn. Khuoân maãu chöông trình sau coù theå ñöôïc söû duïng: ORG 0000H LJMP MAIN ; nhaûy ñeán chöông trình chính ORG 0003H ; ñieåm nhaäp cuûa trình phuïc vuï ngaét ngoaøi 0 LJMP EXT0_ISR ; nhaûy ñeán chöông trình phuïc vuï ngaét ngoaøi 0 ORG 000BH ; ñieåm nhaäp cuûa trình phuïc vuï ngaét timer 0 LJMP T0_ISR ; nhaûy ñeán chöông trình phuïc vuï ngaét timer 0 …… ORG 0030H ; baét ñaàu chöông trình chính taïi 0030H MAIN: Thöôøng laø caùc khôûi ñoäng ban ñaàu, caùc …… leänh goïi chöông trình con, … ;SJMP $ ; caùc chöông trình con http://www.ebook.edu.vn 14
  15. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 CTCON_1: …… RET CTCON_2: …… RET …… ; caùc chöông trình phuïc vuï ngaét EXT0_ISR: …… RETI T0_ISR: …… RETI …… END 5. Caùc ví duï Ví duï 3.1: Vieát chöông trình söû duïng ngaét timer 0 ñeå taïo moät soùng vuoâng ñoái xöùng taàn soá 10KHz treân chaân P1.0. Giaû söû fOSC = 12 MHz. Giaûi: - Soùng vuoâng f = 10KHz → T = 0,1ms = 100μs → tL = tH = 50μs → cho timer ñeám 50μs → söû duïng timer 0, cheá ñoä 2 (8 bit töï ñoäng naïp laïi). - Moãi laàn traøn, timer 0 taïo ra moät ngaét (TF0 = 1). Chöông trình phuïc vuï ngaét chæ caàn laáy buø giaù trò ôû chaân P1.0 (do ñoái xöùng) → söû duïng chöông trình phuïc vuï ngaét coù kích thöôùc nhoû. Chöông trình: ORG 0 ; ñieåm nhaäp khi reset LJMP MAIN ; nhaûy ñeán chöông trình chính ORG 000BH ; vector ngaét timer 0 T0_ISR: ; chöông trình phuïc vuï ngaét timer 0 CPL P1.0 ; laáy buø chaân P1.0 RETI ; trôû veà chöông trình chính ORG 0030H ; ñieåm nhaäp chöông trình chính MAIN: ; chöông trình chính MOV TMOD,#02H ; khôûi ñoäng timer 0, cheá ñoä 2 MOV TH0,#-50 ; cho timer 0 ñeám 50μs SETB TR0 ; cho pheùp timer 0 chaïy MOV IE,#82H ; cho pheùp ngaét timer 0 SJMP $ ; khoâng laøm gì, chæ chôø ngaét END Ví duï 3.2: Vieát chöông trình söû duïng caùc ngaét timer ñeå taïo ñoàng thôøi 2 soùng vuoâng ñoái xöùng coù taàn soá laø 7KHz vaø 500Hz treân caùc chaân P1.7 vaø P1.6. Giaû söû fOSC = 12 MHz. Giaûi: http://www.ebook.edu.vn 15
  16. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 - Hai soùng vuoâng coù taàn soá khaùc nhau: + f1 = 7KHz → T1 ≈142μs → tL1 = tH1 = 71μs → duøng timer 0, cheá ñoä 2 (8 bit töï ñoäng naïp laïi) taïo ngaét laáy buø giaù trò treân chaân P1.7. + f2 = 500Hz → T2 = 2ms = 2000μs → tL2 = tH2 = 1000μs → duøng timer 1, cheá ñoä 1 (16 bit) taïo ngaét laáy buø giaù trò treân chaân P1.6. - Söû duïng chöông trình phuïc vuï ngaét kích thöôùc lôùn vì khi duøng timer 1 ôû cheá ñoä 1, trong chöông trình phuïc vuï ngaét phaûi naïp laïi giaù trò cho caùc thanh ghi TH1 vaø TL1 → chöông trình seõ vöôït quaù 8 byte. Chöông trình: ORG 0 LJMP MAIN ORG 000BH ; vector ngaét timer 0 LJMP T0_ISR ORG 001BH ; vector ngaét timer 1 LJMP T1_ISR ORG 0030H MAIN: MOV TMOD,#12H ; khôûi ñoäng timer 0 ôû cheá ñoä 2 vaø timer 1 ôû cheá ñoä 1 MOV TH0,#-71 MOV TH1,#HIGH(-1000) MOV TL1,#LOW(-1000) SETB TR0 SETB TR1 MOV IE,#8AH ; cho pheùp ngaét timer 0 vaø timer 1 SJMP $ T0_ISR: ; chöông trình phuïc vuï ngaét timer 0 CPL P1.7 RETI T1_ISR: ; chöông trình phuïc vuï ngaét timer 1 CLR TR1 MOV TH1,#HIGH(-1000) MOV TL1,#LOW(-1000) SETB TR1 CPL P1.6 RETI END Ví duï 3.3: Vieát chöông trình söû duïng ngaét ñeå lieân tuïc phaùt ñi taäp maõ ASCII (boû qua caùc maõ ñieàu khieån) ñeán 1 thieát bò ñaàu cuoái noái vôùi 8051 qua port noái tieáp. Giaû söû truyeàn UART 8 bit, toác ñoä baud laø 1200, bit SMOD = 1. Giaûi: - Coù 128 maõ ASCII 7-bit trong baûng maõ ASCII. Caùc maõ naøy bao goàm 95 maõ ñoà hoaï (töø 20H ñeán 7EH) vaø 33 maõ ñieàu khieån (töø 00H ñeán 1FH vaø 7FH). ÔÛ ñaây ta chæ xuaát caùc maõ ñoà hoïa (töø 20H ñeán 7EH). - Söû duïng ngaét port noái tieáp ñeå phaùt kyù töï: khi coù ngaét TI = 1 (baùo boä ñeäm phaùt ñaõ roãng) → vaøo chöông trình phuïc vuï ngaét ñeå gôûi maõ ñoà hoïa tieáp theo ra boä ñeäm phaùt. Tröôùc khi gôûi, caàn phaûi kieåm tra xem ñaõ heát taäp maõ ASCII chöa, neáu heát thì phaùt laïi töø ñaàu. Chöông trình: ORG 0 LJMP MAIN http://www.ebook.edu.vn 16
  17. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 ORG 0023H LJMP SP_ISR ; vector ngaét port noái tieáp ORG 0030H MAIN: ; chöông trình chính MOV TMOD,#20H ; khôûi ñoäng timer 1, cheá ñoä 2 MOV TH1,#-26 ; toác ñoä baud cuûa port noái tieáp laø 1200 SETB TR1 ; cho timer 1 chaïy ñeå taïo xung clock toác ñoä baud MOV SCON,#42h ; port noái tieáp ôû cheá ñoä 1 (UART 8 bit, toác ñoä thay ñoåi), ; cho TI = 1: buoäc ngaét ñeå gôûi kyù töï ñaàu tieân MOV A,#20H ; kyù töï ñaàu tieân laø 20H MOV IE,#90H ; cho pheùp ngaét port noái tieáp SJMP $ SP_ISR: ; chöông trình phuïc vuï ngaét port noái tieáp CJNE A,#7FH,SKIP ; neáu chöa heát taäp maõ ñoà hoïa ASCII thì phaùt kyù töï keá MOV A,#20H ; neáu heát thì phaùt laïi töø maõ ñoà hoïa ñaàu tieân (20H) SKIP: MOV SBUF,A ; gôûi kyù töï ñeán boä ñeäm phaùt INC A ; taêng leân kyù töï keá CLR TI ; xoùa côø ngaét phaùt, chuaån bò cho laàn phaùt keá tieáp RETI END Ví duï 3.4: Ñieàu khieån loø nung Giaû söû coù moät boä caûm bieán nhieät ñöôïc noái vôùi chaân INT0 (P3.2) vaø INT1 (P3.3) cung caáp hai tín hieäu HOT vaø COLD nhö sau: HOT = 0 neáu nhieät ñoä > 210C COLD = 0 neáu nhieät ñoä < 190C Loø ñöôïc ñieàu khieån baät/taét thoâng qua chaân P1.7 : P1.7 = 1 baät loø, P1.7 = 0 taét loø. 8051 HOT INT0 (P3.2) P1.7 Baät/taét loø COLD INT1 (P3.3) Vieát chöông trình söû duïng caùc ngaét ñeå ñieàu khieån loø nung sao cho nhieät ñoä loø ñöôïc duy trì ôû 20 C ± 10C. 0 Giaûi: Chöông trình seõ baät loø (P1.7 = 1) khi nhieät ñoä < 190C vaø taét loø (P1.7 = 0) khi nhieät ñoä >210C. Khi nhieät ñoä trong [190C, 210C], caùc ngoõ vaøo HOT vaø COLD ñeàu laø 1. Khi nhieät ñoä < 190C, HOT = 0 hay nhieät ñoä > 210C, COLD = 0 → taïo xung caïnh xuoáng kích vaøo chaân ngaét ngoaøi INT0 hay INT1 . Nhö vaäy trong chöông trình phuïc vuï caùc ngaét ngoaøi naøy chæ caàn ñaët hay xoùa bit P1.7. http://www.ebook.edu.vn 17
  18. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 Chöông trình: ORG 0 LJMP MAIN ORG 0003H EXT0_ISR: CLR P1.7 ; taét loø RETI EXT1_ISR: SETB P1.7 ; baät loø RETI ORG 0030H MAIN: MOV IE,#85H ; cho pheùp ngaét ngoaøi 0 vaø 1 SETB IT0 ; taùc ñoäng caïnh xuoáng SETB IT1 SETB P1.7 ; ban ñaàu, baät loø JB P3.2,SKIP ; neáu nhieät ñoä > 210C CLR P1.7 ; thì taét loø SKIP:SJMP $ ; khoâng laøm gì END http://www.ebook.edu.vn 18
  19. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 BAØI TAÄP CHÖÔNG 4 Phaàn timer (Giaû söû heä thoáng duøng thaïch anh 12MHz) 4.1. Vieát chöông trình duøng timer taïo treã 200μs. 4.2. Vieát chöông trình duøng timer taïo treã 50ms. 4.3. Vieát chöông trình duøng timer taïo moät xung möùc cao treân chaân P1.7 trong 1s. 4.4. Vieát chöông trình duøng timer taïo soùng vuoâng ñoái xöùng coù taàn soá f = 500Hz treân chaân P1.0. 4.5. Vieát chöông trình duøng timer taïo soùng vuoâng ñoái xöùng treân chaân P1.0 coù taàn soá f = 500Hz, duty cycle = 30% (thôøi gian möùc cao = 30% thôøi gian cuûa chu kì xung). 4.6. Giaû söû coù moät heä thoáng ñeám soá ngöôøi ñi vaøo moät sieâu thò nhö trong hình veõ B4.6. Boä caûm bieán seõ taïo ra 1 xung (kích caïnh xuoáng) ñöa vaøo chaân T1 cuûa 8051 (P3.5) khi coù 1 ngöôøi ñi vaøo sieâu thò. Moät boùng ñeøn ñöôïc ñieàu khieån bôûi chaân P1.7 seõ saùng khi P1.7 = 1 vaø taét neáu P1.7 = 0. Haõy vieát chöông trình duøng timer ñeå ñeám soá ngöôøi vaø baät ñeøn baùo hieäu khi coù ngöôøi thöù 10.000 ñi vaøo sieâu thò. 4.7. Vieát chöông trình duøng timer 0 ño thôøi gian möùc cao cuûa xung ñöa vaøo chaân INT0 (P3.2) cuûa 8051. Thôøi gian ño ñöôïc (tính baèng μs) ñöôïc löu vaøo oâ nhôù 30H (byte thaáp) vaø 31H (byte cao). 8051 Ñeøn baùo Boä caûm T1 P1.7 bieán Hình B4.6 Phaàn port noái tieáp 4.8. Vieát moät ñoaïn chöông trình khôûi ñoäng port noái tieáp ñeå thu döõ lieäu ôû cheá ñoä UART 8 bit, toác ñoä baud laø 4800. Giaû söû heä thoáng duøng thaïch anh 12MHz vaø bit SMOD = 0. 4.9. Vieát chöông trình nhaäp moät chuoãi maõ ASCII daøi 80 byte töø port noái tieáp vaø caát vaøo RAM ngoaøi baét ñaàu töø ñòa chæ 2000H. Giaû söû truyeàn ôû cheá ñoä UART 8 bit, toác ñoä baud laø 2400, fOSC=12MHz vaø bit SMOD = 0. 4.10. Vieát chöông trình gôûi lieân tieáp caùc kyù töï hieån thò ñöôïc trong taäp maõ ASCII (coù maõ töø 20H ñeán 7EH) ñeán thieát bò gaén vôùi port noái tieáp cuûa 8051. Giaû söû truyeàn ôû cheá ñoä UART 8 bit, toác ñoä baud laø 1200, fOSC =12MHz vaø bit SMOD = 0. 4.11. Vieát chöông trình nhaäp caùc kyù töï töø baøn phím vaøo port noái tieáp vaø xuaát ra thieát bò gaén vôùi port noái tieáp, chuyeån caùc kyù töï thöôøng thaønh kyù töï hoa. Giaû söû truyeàn ôû cheá ñoä UART 8 bit, toác ñoä baud laø 1200, fOSC =12MHz vaø bit SMOD = 0. 4.12. Töông töï baøi 11 nhöng chuyeån caùc kyù töï hoa thaønh kyù töï thöôøng. 4.13. Giaû söû coù moät chuoãi maõ ASCII 20 byte chöùa trong RAM noäi baét ñaàu töø oâ nhôù 30H. Haõy vieát chöông trình phaùt chuoãi döõ lieäu naøy ra port noái tieáp vôùi ñieàu kieän chæ truyeàn caùc kyù töï hoa. Giaû söû truyeàn ôû cheá ñoä UART 8 bit, toác ñoä baud laø 2400, fOSC = 8MHz vaø bit SMOD = 0. http://www.ebook.edu.vn 19
  20. Baøi giaûng VI XÖÛ LYÙ Chöông 4: Caùc chöùc naêng cuûa hoï MCS-51 Phaàn ngaét (interrupt) 4.14. Vieát chöông trình duøng ngaét taïo soùng vuoâng ñoái xöùng coù taàn soá f = 400Hz treân chaân P1.7. Giaû söû heä thoáng duøng thaïch anh 12MHz. 4.15. Vieát chöông trình duøng ngaét ñeå phaùt lieân tieáp caùc kyù töï hoa ra port noái tieáp. Giaû söû truyeàn ôû cheá ñoä UART 8 bit, toác ñoä baud laø 2400, fOSC = 12MHz vaø bit SMOD = 0. 4.16. Laøm laïi baøi 4.9 cuûa phaàn port noái tieáp nhöng duøng ngaét. 4.17. Laøm laïi baøi 4.13 cuûa phaàn port noái tieáp nhöng duøng ngaét. 4.18. Laøm laïi baøi 4.6 cuûa phaàn timer nhöng duøng ngaét, luùc naøy xung töø boä caûm bieán ñöa vaøo chaân INT1 (P3.4) thay vì chaân T1. 4.19. Vieát chöông trình duøng ngaét ñeå phaùt lieân tieáp caùc kyù töï hieån thò ñöôïc trong taäp maõ ASCII (maõ töø 20H ñeán 7EH) ra port noái tieáp, moãi laàn phaùt caùch nhau 50ms. Giaû söû truyeàn ôû cheá ñoä UART 8 bit, toác ñoä baud laø 2400, fOSC = 12MHz vaø bit SMOD = 0. 4.20. Giaû söû coù moät heä thoáng ñeám saûn phaåm nhö hình B4.20. Cöù moãi saûn phaåm chaïy qua boä caûm bieán seõ taïo ra moät xung vuoâng (kích caïnh xuoáng) ñöa vaøo chaân INT0 (P3.2) cuûa 8051. Haõy vieát chöông trình duøng caùc ngaét ñeå ñeám soá saûn phaåm, moãi khi ñuû 100 saûn phaåm thì xoùa boä ñeám vaø taïo moät xung möùc cao treân chaân P1.7 trong thôøi gian 1 giaây, sau ñoù laëp laïi. 8051 Boä caûm INT0 P1.7 bieán Hình B4.20 4.21. Giaû söû coù moät heä thoáng baùo ñoäng nhö hình B4.21. Boä caûm bieán cöûa môû seõ taïo ra moät xung vuoâng (kích caïnh xuoáng) ñöa vaøo chaân INT0 (P3.2) cuûa 8051. Haõy vieát chöông trình duøng caùc ngaét ñeå taïo ra aâm hieäu coù taàn soá 400Hz treân loa (noái vôùi chaân P1.7) trong thôøi gian 3 giaây neáu cöûa bò môû. Giaû söû heä thoáng duøng thaïch anh 12MHz. 8051 Boä 74LS04 caûm bieán INT0 P1.7 cöûa môû Hình B4.21 http://www.ebook.edu.vn 20
Đồng bộ tài khoản