Vi xử lý - Chương 4: Các chức năng của họ vi điều khiển mcs-51

Tài liệu Vi xử lý - Chương 4: Các chức năng của họ vi điều khiển mcs-51: Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 1 CHƯƠNG 4: CÁC CHỨC NĂNG CỦA HỌ VI ĐIỀU KHIỂN MCS-51 I. TIMER 1. Giới thiệu - 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 2. 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. Ngõ ra của tầng cuối cùng làm xung clock cho một FF báo tràn timer hay còn gọi là cờ tràn (overflow flag). Cờ tràn này sẽ được kiểm tra bởi phần mềm hay tạo ra một ngắt (interrupt). Hình 4.1 minh họa một timer đơn giản 3-bit. - Giá trị nhị phân trong các FF của timer được dùng để tính số xung clock (số chu kì) của tín hiệu ngõ vào từ khi timer bắt đầu đếm. Hình 4.1 - 8051/8031 có 2 timer 16 bit: + Timer 0: số đếm chứa trong thanh ghi TH0 (byte cao) và TL0 (byte thấp) + Timer 1: số đếm c...

pdf20 trang | Chia sẻ: tranhong10 | Lượt xem: 5281 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Vi xử lý - Chương 4: Các chức năng của họ vi điều khiển mcs-51, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 1 CHƯƠNG 4: CÁC CHỨC NĂNG CỦA HỌ VI ĐIỀU KHIỂN MCS-51 I. TIMER 1. Giới thiệu - 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 2. 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. Ngõ ra của tầng cuối cùng làm xung clock cho một FF báo tràn timer hay còn gọi là cờ tràn (overflow flag). Cờ tràn này sẽ được kiểm tra bởi phần mềm hay tạo ra một ngắt (interrupt). Hình 4.1 minh họa một timer đơn giản 3-bit. - Giá trị nhị phân trong các FF của timer được dùng để tính số xung clock (số chu kì) của tín hiệu ngõ vào từ khi timer bắt đầu đếm. Hình 4.1 - 8051/8031 có 2 timer 16 bit: + Timer 0: số đếm chứa trong thanh ghi TH0 (byte cao) và TL0 (byte thấp) + Timer 1: số đếm chứa trong thanh ghi TH1 (byte cao) và TL1 (byte thấp) Ngoài ra, các chip 8032/8052 còn có thêm timer 2. - Các timer chỉ đếm lên (0000H ÷ FFFFH). Khi số đếm tràn từ FFFFH xuống 0000H, cờ tràn sẽ được đặt lên 1. 2. Các thanh ghi của timer: a. Thanh ghi chế độ định thời (TMOD): MSB LSB Gate T/C M1 M0 Gate T/C M1 M0 Timer 1 Timer 0 - Không được định địa chỉ bit. - Được dùng để định chế độ hoạt động cho các timer. - Chức năng từng bit: + M1, M0: chọn chế độ hoạt động. M1 M0 Chế độ (Mode) 0 0 0 0 1 1 1 0 2 1 1 3 + T/C : bit chọn chức năng đếm hoặc định thời cho timer. + Gate: bit điều khiển cổng cho bộ định thời. D /Q Q D /Q Q D /Q Q D /Q Q Flag Clock LSB MSB Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 2 b. Thanh ghi điều khiển định thời (TCON): MSB LSB TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Timer Interrupt - Chứa các bit điều khiển và trạng thái của timer 0 và 1 ở 4 bit cao, 4 bit thấp được dùng cho chức năng ngắt (interrupt). - Được định địa chỉ bit. - Chức năng từng bit: + TFx: cờ tràn của timer x (x là 0 hay 1) + TRx = 0: không cho phép timer chạy. TRx = 1: cho phép timer chạy. 3. Điều khiển các bộ định thời Hình 4.2 - T/C (Counter/Timer): + T/C = 0: timer nhận xung clock từ bộ dao động nội (sau khi qua bộ chia 12). → Ứng dụng: thường dùng cho việc định thời một khoảng thời gian (mỗi số đếm tương ứng với 1 chu kỳ máy). + T/C = 1: timer nhận xung clock từ chân Tx (P3.4 đối với timer 0 và P3.5 đối với timer 1). → Ứng dụng: thường dùng để đếm sự kiện bên ngoài. Mỗi sự kiện tạo ra một xung kích vào chân Tx (tích cực cạnh xuống). Số các sự kiện được xác định trong phần mềm bằng cách đọc các thanh ghi định thời (THx/TLx), giá trị 16-bit trong các thanh ghi này tăng theo mỗi sự kiện. - Gate: + Gate = 0: việc điều khiển timer x chỉ phụ thuộc vào TRx. TRx = 0: không cho phép timer x chạy. TRx = 1: cho phép timer x chạy. ÷12 On-chip Osc. T/C TRx Gate 0: trên 1: dưới 0: trên 1: dưới TLx THx TFx Tx INTx 8051 Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 3 + Gate = 1: việc điều khiển timer x phụ thuộc vào TRx và xINT . TRx = 1 và xINT = 1: cho phép timer chạy. → Ứng dụng: thường dùng để đo độ rộng xung (thời gian xung ở mức cao) đưa vào ở chân xINT . Độ rộng xung tương ứng với số đếm trong THx/TLx. 4. Các chế độ định thời a. Chế độ 0 - Xác lập M1M0 = 00 - Là chế độ định thời 13-bit tương thích với bộ vi điều khiển 8048 trước đó. Chế độ này thường ít dùng. b. Chế độ 1 - Xác lập M1M0 = 01 - Là chế độ định thời 16-bit: số đếm 16-bit chứa trong cặp thanh ghi THx/TLx → khoảng đếm tối đa là 65536 chu kì máy. - Giá trị bắt đầu đếm được nạp vào THx và TLx. Khi timer tràn, để nạp lại giá trị bắt đầu đếm cần phải dừng timer. Ví dụ 1.1: Viết 1 đoạn chương trình khởi động timer 0 ở chế độ 1 và dùng timer 0 để tạo ra 1 xung mức cao rộng 1ms ở chân P1.0. Giả sử dùng thạch anh 12MHz. Giải: MOV TMOD,#00000001B ; khởi động timer 0 ở chế độ 1 CLR P1.0 ; xóa P1.0 MOV TH0,#HIGH(-1000) ; nạp byte cao của -1000 (FCH) vào TH0 MOV TL0,#LOW(-1000) ; nạp byte thấp của -1000 (18H) vào TL0 SETB TR0 ; cho timer 0 chạy SETB P1.0 ; đặt P1.0 lên mức cao JNB TF0,$ ; chờ cho đến khi timer tràn (TF0 = 1) CLR P1.0 ; xóa P1.0 CLR TF0 ; xóa cờ tràn TF0 để dùng cho các lần sau Ví dụ 1.2: Viết chương trình con tạo trễ 200ms dùng timer 1. Giả sử fOSC = 12MHz. Giải: fOSC = 12MHz → chu kỳ máy s1f 12T OSC M μ== Nếu dùng timer 1 ở chế độ 1 thì thời gian định thời tối đa là 65536μs < 200.000μs = 200ms → phải dùng thêm vòng lặp ngoài. Để đơn giản, mỗi vòng lặp sẽ delay 50.000μs → số lần lặp là 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 Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 4 Ví dụ 1.3: Viết chương trình dùng timer tạo sóng vuông đối xứng có tần số 1KHz trên chân P1.0. Giải: f = 1KHz → chu kỳ s1000s10 10 1 f 1T 33 μ==== − → tH = tL = 500μs Tần số thạch anh: fOSC = 12MHz → chu kỳ máy s1f 12T OSC M μ== → tH = tL = 500TM Chương trình: (sử dụ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. Chế độ 2 - Xác lập M1M0 = 10 - Là chế độ định thời 8 bit tự động nạp lại. + TLx: bộ đếm 8 bit → khoảng đếm tối đa là 256 chu kì máy. + THx: lưu giá trị bắt đầu đếm được cài đặt. - Mỗi khi timer tràn từ FFH xuống 00H, không chỉ cờ tràn được đặt lên 1 mà giá trị lưu trong THx còn được tự động nạp vào cho TLx (không cần dừng timer) và việc đếm sẽ tiếp tục từ giá trị này cho đến khi xảy ra lần tràn kế tiếp rồi lặp lại Ví dụ 1.4: Viết chương trình con delay 100μs dùng timer. Giả sử fOSC = 12MHz. Giải: Do khoảng thời gian tạo trễ là 100 μs = 100 TM < 256 → có thể dùng timer ở chế độ 2. Chương trình: DELAY_100US: MOV TMOD,#02H ; khởi động timer 0 ở chế độ 2 MOV TH0,#-100 ; nạp giá trị bắt đầu đếm –100 vào TH0 MOV TL0,TH0 SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET tH tL T Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 5 Lưu ý: thông thường lệnh khởi động chế độ timer được đặt trong chương trình chính. Ví dụ 1.5: Viết chương trình dùng timer 1 để tạo sóng vuông đối xứng, tần số f = 10KHz tại chân P1.7 (giả sử fOSC = 6MHz). Giải: f = 10KHz → chu kỳ s100s10 10.10 1 f 1T 43 μ==== − → tH = tL = 50μs Tần số thạch anh: fOSC = 6MHz → chu kỳ máy s2 f 12T OSC M μ== → tH = tL = 25TM 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. Chế độ 3 - Xác lập M1M0 = 11 - Là chế độ tách timer: timer 0 16-bit được chia thành 2 timer 8-bit riêng lẽ TL0 và TH0 với cờ tràn tương ứng là TF0 và TF1 (TF1 lúc này không còn là cờ tràn của timer 1 nữa). - Timer 1 không hoạt động ở chế độ 3 nhưng có thể được dùng trong các chế độ khác (không sử dụng cờ tràn TF1). Chú ý: Các kỹ thuật thường được dùng để tạo các khoảng thời gian định thời khác nhau Khoảng thời gian (chu kỳ máy) Kỹ thuật ≈ 10 Điều chỉnh phần mềm 256 Bộ định thời 8 bit tự động nạp lại 65536 Bộ định thời 16 bit Không giới hạn Bộ định thời 16 bit + các vòng lặp II. PORT NỐI TIẾP 1. Giới thiệu - Chức năng cơ bản của port nối tiếp là chuyển đổi dữ liệu từ song song thành nối tiếp khi phát và từ nối tiếp thành song song khi thu. - Truy xuất port nối tiếp thông qua 2 chân: + RxD (P3.0): chân thu của port nối tiếp. + TxD (P3.1): chân phát của port nối tiếp. - Có khả năng hoạt động song công (full duplex), tức là thu và phát đồng thời. Ngoài ra port nối tiếp còn có chức năng đệm dữ liệu khi thu cho phép một ký tự được nhận và lưu giữ trong bộ đệm thu trong khi ký tự tiếp theo được nhận vào. Nếu vi điều khiển đọc ký tự thứ nhất trước khi ký tự thứ hai được thu đầy đủ, dữ liệu sẽ không bị mất. - Các thanh ghi liên quan đến port nối tiếp: + SCON: chứa các bit trạng thái và các bit điều khiển port nối tiếp. + SBUF: là bộ đệm của port nối tiếp. Thực tế, port nối tiếp gồm 2 bộ đệm riêng cho phát và thu. Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 6 - Tần số hoạt động của port nối tiếp, hay còn gọi là tốc độ baud (baud rate), có thể cố định hoặc thay đổi. Khi dùng tốc độ baud thay đổi, timer 1 được lập trình để cung cấp xung clock tốc độ baud phù hợp. Hình 4.3 2. Thanh ghi điều khiển port nối tiếp SCON MSB LSB SM0 SM1 SM2 REN TB8 RB8 TI RI - Địa chỉ 99H. - Định địa chỉ bit. - Chức năng các bit: + SM0, SM1: chọn chế độ hoạt động của port nối tiếp SM0 SM1 Chế độ (Mode) Mô tả 0 0 0 Thanh ghi dịch 0 1 1 UART 8 bit tốc độ thay đổi 1 0 2 UART 9 bit tốc độ cố định 1 1 3 UART 9 bit tốc độ thay đổi + SM2: chọn chế độ hoạt động của port nối tiếp. SM2 = 1: cho phép truyền thông đa xử lý ở các chế độ 2 và 3; bit RI sẽ không được tích cực nếu bit thứ 9 nhận được là 0. + REN: bit cho phép thu. REN = 1: cho phép thu. REN = 0: không cho phép thu. + TB8: bit phát thứ 9 (ở chế độ 2 và 3), có thể đặt và xóa bằng phần mềm. + RB8: bit thu thứ 9 (ở chế độ 2 và 3), có thể đặt và xóa bằng phần mềm. SBUF Q (write-only) CLK D Thanh ghi dịch CLK SBUF (read-only) TXD (P3.1) RXD (P3.0) Xung clock tốc độ baud (thu) Xung clock tốc độ baud (phát) Bus nội 8051 Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 7 + TI: cờ ngắt phát. Cờ này được đặt lên 1 bằng phần cứng khi phát xong 1 ký tự (để báo bộ đệm phát đã rỗng), được xóa bằng phần mềm. + RI: cờ ngắt thu. Cờ này được đặt lên 1 bằng phần cứng khi thu xong 1 ký tự (để báo bộ đệm thu đã đầy), được xóa bằng phần mềm. 3. Các chế độ hoạt động của port nối tiếp a. Chế độ 0 (thanh ghi dịch 8 bit) - Xác lập SM0 SM1 = 0 0 - Dữ liệu nối tiếp được thu/phát thông qua chân RxD. - Chân TxD phát xung clock để dịch bit. - Khi thu/phát dữ liệu 8 bit, bit LSB được thu/phát trước tiên. - Tốc độ baud cố định và bằng 1/12 tốc độ dao động trên chip (f = fM = fOSC /12). Một ứng dụng khả thi của chế độ 0 là mở rộng thêm các ngõ ra cho 8051. Một vi mạch thanh ghi dịch nối tiếp-song song có thể được nối với các chân TxD và RxD của 8051 để cung cấp thêm 8 đường xuất. Các thanh ghi dịch khác có thể ghép cascade với thanh ghi dịch đầu tiên để mở rộng thêm nữa. Hình 4.4 b. Chế độ 1 (UART 8 bit tốc độ baud thay đổi) - Xác lập SM0 SM1 = 0 1 - Port nối tiếp hoạt động như một bộ thu/phát bất đồng bộ (universal asynchronous receiver/transmitter) UART 8 bit có tốc độ baud thay đổi được. - Truyền 10 bit: 1 bit Start + 8 bit data + 1 bit Stop (luôn mức 0) (bit LSB trước) (luôn mức 1) - Tốc độ baud = (tốc độ tràn của timer 1) / 32 (nếu bit SMOD = 0) = (tốc độ tràn của timer 1) /16 ( nếu bit SMOD = 1) * Khi phát: - Trước tiên, dữ liệu được ghi vào SBUF (phát). - Dữ liệu được dịch bit để xuất ra trên đường TxD sẽ bắt đầu bằng bit Start , tiếp theo là 8 bit dữ liệu với LSB phát trước và cuối cùng là bit Stop. Bit Start và Stop do phần cứng tự động chèn vào. Thời gian của mỗi bit là nghịch đảo của tốc độ baud. - Cờ ngắt TI sẽ được tự động đặt bằng 1 bởi phần cứng ngay khi bit Stop xuất hiện trên đường TxD (tức là đã phát xong 1 ký tự dữ liệu) để báo bộ đệm phát đã rỗng. * Khi thu: - Việc thu được khởi động bởi sự chuyển trạng thái từ 1 xuống 0 trên đường RxD (bắt đầu bit Start). - Khi 1 bit Start hợp lệ được phát hiện, bit Start được bỏ qua và 8 bit dữ liệu được nhận tuần tự vào thanh ghi dịch bit của port nối tiếp. Sau khi thu xong cả 8 bit, các điều sau sẽ xảy ra: + Bit thứ 9 (bit Stop) được đưa đến bit RB8 trong SCON. 8051 TXD (P3.1) RXD (P3.0) CLOCK Data Thanh ghi dịch 8 ngõ ra mở rộng Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 8 + 8 bit data được nạp vào SBUF (thu). + Cờ ngắt thu RI được đặt lên 1 bởi phần cứng. Tuy nhiên các điều trên chỉ xảy ra nếu tồn tại các điều kiện sau: + REN = 1 + RI = 0 (báo bộ đệm thu chưa đầy). + SM2 = 0 hoặc SM2 = 1 và bit Stop nhận được bằng 1. c. Chế độ 2 (UART 9 bit, tốc độ baud cố định) - Xác lập SM0 SM1 = 1 0 - Port nối tiếp hoạt động ở chế độ UART 9 bit có tốc độ baud cố định. - Truyền 11 bit: 1 bit Start + 8 bit data + bit data thứ 9 + 1 bit Stop (luôn mức 0) (bit LSB trước) (lập trình được) (luôn mức 1) - Tốc độ baud = fOSC / 64 (nếu bit SMOD = 0) hay fOSC / 32 (nếu bit SMOD = 1) - Khi phát, bit data thứ 9 là bit bất kỳ đặt ở TB8 trong thanh ghi SCON. - Khi thu, bit data thứ 9 nhận được sẽ đặt vào RB8 trong thanh ghi SCON. d. Chế độ 3 (UART 9 bit, tốc độ baud thay đổi được) - Xác lập SM0 SM1 = 1 0 - Port nối tiếp hoạt động ở chế độ UART 9 bit có tốc độ baud thay đổi được, tương tự như chế độ 2 nhưng tốc độ baud được lập trình và được cung cấp bởi timer 1. - Tốc độ baud = (tốc độ tràn của timer 1) / 32 (nếu bit SMOD = 0) = (tốc độ tràn của timer 1) / 16 (nếu bit SMOD = 1) * Giải thuật chương trình con thu và phát một byte: * Chương trình: INCHAR: ; CT con thu 1 byte OUTCHAR: ; CT con phát 1 byte JNB RI,$ JNB TI,$ CLR RI CLR TI MOV A,SBUF MOV SBUF,A RET RET 4. Tốc độ baud cho port nối tiếp Ở chế độ 1 và 3, tốc độ baud cho port nối tiếp được lập trình bởi timer 1: Tốc độ baud = (tốc độ tràn timer 1) / 32 (SMOD = 0) / 16 (SMOD = 1) INCHAR RI = 1 ? Xóa cờ RI Đọc SBUF RET OUTCHAR TI = 1 ? Xóa cờ TI Ghi ra SBUF RET Y Y NN Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 9 → tốc độ tràn timer 1 (ftràn) = tốc độ baud x 32 (hay x16) → thời gian tràn timer 1 (Ttràn) = 1 / (tốc độ tràn timer 1) tràn M M tràn f f T T 1 timer cho nạp cần Số == Ví dụ: Viết 1 đoạn chương trình tạo tốc độ baud 2400 (với fOSC = 12MHz, SMOD = 0) ftràn timer 1 = 2400 x 32 = 76800 Hz → Ttràn timer 1 = 1/76800 = 13,021μs fOSC = 12MHz → TM = 1μs → Thời gian tràn timer 1 = 13,021/1 ≈ 13μs → sai số: (13,021 – 13)/13 = 0,16% MOV TMOD,#00100000B ; khởi động timer 1 ở mode 2 MOV TH1,#-13 ; thời gian tràn là 13TM SETB TR1 Ví dụ: Tạo tốc độ baud 9600 (với fOSC = 12MHz, SMOD = 0) 3≈=×== 3,255329600 12MHz/12 f f 1 timer cho nạp cần Số tràn M → sai số: (3,255 – 3) / 3 = 8,5% : khá lớn. Ví dụ: Tạo tốc độ baud 1200 (với fOSC = 12MHz, SMOD = 0) 2626,042 321200 12MHz/12 f f 1 timer cho nạp cần Số tràn M ≈=×== → sai số: (26,042 – 26) / 26 = 0,16% Bảng tóm tắt một số tốc độ baud Tốc độ baud Tần số thạch anh SMOD Giá trị nạp cho TH1 Tốc độ baud thực tế Sai số 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 → Cần truyền với tốc độ chính xác thì sử dụng thạch anh 11,059MHz. 5. Các ví dụ Ví dụ 2.1: Viết chương trình phát 1 chuỗi mã ASCII kết thúc bằng ký tự null (có mã ASCII là 00H) ra port nối tiếp (không gởi ký tự null). Biết rằng chuỗi mã ASCII nằm trong RAM ngoài bắt đầu tại địa chỉ 2000H. Giả sử truyền UART 8 bit, tốc độ baud 2400, fOSC = 12MHz. Giải: ORG 0 ; khởi động port nối tiếp MOV SCON,#01010010B ; port nối tiếp ở mode 1 MOV TMOD,#20H ; timer 1 ở mode 2 MOV TH1,#-13 ; tốc độ baud = 2400 SETB TR1 ; cho phép timer 1 chạy để tạo xung clock tốc độ baud Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 10 ; phát chuỗi mã ASCII MOV DPTR,#2000H ; trỏ đến địa chỉ RAM ngoài 2000H LOOP: MOVX A,@DPTR ; lấy nội dung ô nhớ RAM ngoài vào A CJNE A,#00H,CONT ; kiểm tra xem có phải ký tự null không SJMP EXIT ; nếu đúng, kết thúc chương trình CONT: ; nếu không, phát ký tự đó ACALL OUTCHAR ; gọi chương trình con OUTCHAR INC DPTR ; tăng nội dung con trỏ SJMP LOOP ; lặp lại việc phát ký tự ; chương trình con OUTCHAR phát 1 byte dữ liệu (1 ký tự) OUTCHAR: JNB TI,$ ; chờ cờ TI bằng 1 báo bộ đệm phát rỗng CLR TI ; xóa cờ TI MOV SBUF,A ; chuyển nội dung thanh ghi A ra SBUF RET EXIT:NOP ; thêm lệnh NOP do END không phải là lệnh của 8051 END Ví dụ 2.2: Viết chương trình nhập 1 chuỗi mã ASCII từ port nối tiếp và cất vào RAM nội bắt đầu từ địa chỉ 30H. Chuỗi mã ASCII kết thúc bằng ký tự CR (có mã ASCII là 13H). Cất cả ký tự CR vào RAM nội và kết thúc chuỗi bằng cách thêm ký tự null. Giả sử truyền UART 8 bit, tốc độ baud 2400, fOSC = 12MHz, bit SMOD = 0. Giải: ORG 0 ; khởi động port nối tiếp MOV SCON,#01010010B ; port nối tiếp ở mode 1 MOV TMOD,#20H ; timer 1 ở mode 2 MOV TH1,#-13 ; tốc độ baud = 2400 SETB TR1 ; cho phép timer 1 chạy để tạo xung clock tốc độ baud ; nhập chuỗi mã ASCII MOV R0,#30H ; trỏ đến ô nhớ RAM nội 30H LOOP: ACALL INCHAR ; nhập 1 byte từ port nối tiếp vào A MOV @R0,A ; cất byte ký tự vào ô nhớ RAM nội INC R0 ; tăng nội dung con trỏ CJNE A,#13H,LOOP ; kiểm tra ký tự thu được có phải là CR không, ; nếu không thì lặp lại MOV @R0,#0 ; nếu đúng, kết thúc và chèn thêm ký tự null SJMP EXIT INCHAR: JNB RI,$ CLR RI MOV A,SBUF RET EXIT:NOP END Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 11 Ví dụ 2.3: Viết chương trình con gởi liên tục các ký tự chữ thường ra port nối tiếp. Giải: - Phần khởi động port nối tiếp được viết ở chương trình chính. - Sử dụng chương trình con OUTCHAR đã trình bày ở trên để xuất 1 btye ra port nối tiếp. SEND: MOV A,#‘a’ ; chuyển mã ASCII của ký tự ‘a’ vào thanh ghi A LOOP: ACALL OUTCHAR ; xuất ký tự từ thanh ghi A ra port nối tiếp INC A ; tăng lên mã ASCII của ký tự kế CJNE A,#‘z’+1,LOOP ; so sánh (A) với mã ASCII của ‘z’+1 RET ; nếu chưa bằng thì lặp lại, nếu bằng thì thoát Ví dụ 2.4: Viết chương trình nhập các ký tự từ port nối tiếp rồi xuất ra port nối tiếp liên tục. Nếu ký tự nhập vào là ký tự điều khiển (có mã ASCII từ 00H ÷ 1FH và 7FH) thì xuất ra ký tự ‘.’để thay thế. Giả sử tốc độ baud = 1200, UART 8 bit, fOSC = 12MHz. Giải: ORG 0 ; khởi động port nối tiếp MOV SCON,#01010010B ; port nối tiếp ở mode 1 MOV TMOD,#20H ; timer 1 ở mode 2 MOV TH1,#-26 ; tốc độ baud = 1200 SETB TR1 ; cho phép timer 1 chạy để tạo xung clock tốc độ baud ; nhập ký tự và so sánh LOOP: ACALL INCHAR ; nhập ký tự từ port nối tiếp CJNE A,#7FH,CONT ; so sánh với 7FH SJMP CTRL ; nếu bằng, nhảy đến nhãn xuất CTRL CONT: ; nếu không, so sánh tiếp CJNE A,#20H,CONT1 ; ký tự có bằng 20H CONT1: JC CTRL ; nếu nhỏ hơn 20H thì nhảy đến nhãn CTRL SJMP OUT ; nếu không, xuất ký tự ra port nối tiếp CTRL: MOV A,#‘.’ ; chuyển mã ASCII của ký tự ‘.’ vào thanh ghi A OUT: ACALL OUTCHAR ; xuất ký tự ra port nối tiếp SJMP LOOP ; lặp lại INCHAR: JNB RI,$ CLR RI MOV A, SBUF RET OUTCHAR: JNB TI,$ CLR TI MOV SBUF,A RET END Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 12 III. INTERRUPT (NGẮT) 1. Giới thiệu - Interrupt (Ngắt): là việc ngưng thực hiện chương trình hiện hành do sự tác động của bên ngoài hay bên trong để nhảy tới thực hiện 1 chương trình khác, được gọi là chương trình phục vụ ngắt ISR (Interrupt Service Routine). Khi thực hiện xong chương trình ISR, chương trình trước đó được tiếp tục thực thi tại nơi bị tạm dừng. - 8031/8051 có 5 nguồn ngắt: + 2 ngắt ngoài: ngắt ngoài 0: qua chân 0INT (P3.2) ngắt ngoài 1: qua chân 1INT (P3.3) + 3 ngắt trong: ngắt timer 0 ngắt timer 1 ngắt port nối tiếp 2. Các thanh ghi liên quan đến ngắt a. Thanh ghi cho phép ngắt IE (Interrupt Enable) MSB LSB EA - (ET2) ES ET1 EX1 ET0 EX0 - Được định địa chỉ bit. - Chức năng từng bit: EA: cho phép toàn bộ ET2: cho phép ngắt timer 2 (nếu có) ES: cho phép ngắt port nối tiếp ET1: cho phép ngắt timer 1 EX1: cho phép ngắt ngoài 1 ET0: cho phép ngắt timer 0 EX0: cho phép ngắt ngoài 0 - Để cho phép 1 nguồn ngắt, cần phải có: + EA = 1 + Bit cho phép ngắt tương ứng bằng 1. Ví dụ: Khởi động thanh ghi IE cho phép ngắt timer 0 và ngắt ngoài 0 MOV IE, #10000011B Hay: SETB EA SETB ET0 SETB EX0 b. Thanh ghi ưu tiên ngắt IP (Interrupt Priority) MSB LSB - - (PT2) PS PT1 PX1 PT0 PX0 - Được định địa chỉ bit. - Bit = 1: mức ưu tiên cao Bit = 0: mức ưu tiên thấp Mặc nhiên sau khi reset, tất cả các ngắt ở mức ưu tiên thấp. Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 13 - Nếu 2 ngắt với mức ưu tiên khác nhau xuất hiện đồng thời, ngắt có mức ưu tiên cao sẽ được phục vụ trước. Đồng thời, ngắt có mức ưu tiên cao cũng có thể tạm dừng chương trình phục vụ ngắt của ngắt có mức ưu tiên thấp. - Nếu các ngắt có cùng mức ưu tiên xuất hiện đồng thời, việc xác định ngắt nào được phục vụ trước sẽ theo thứ tự: ngoài 0, timer 0, ngoài 1, timer 1, port nối tiếp, timer 2 (đố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 năng các bit liên quan đến ngắt (interrupt): + IEx: cờ ngắt ngoài x (IEx = 1 → tạo ngắt ngoài x) + ITx: bit xác định loại tác động ngắt ngoài x ƒ ITx = 0 : tác động mức 0 ƒ ITx = 1 : tác động cạnh xuống (thường dùng) 3. Các ngắt của 8031/8051 a. Các ngắt ngoài (ngoài 0 và ngoài 1): - Khi có xung cạnh xuống ( ) (bit ITx = 1) hay mức 0 (bit ITx = 0) tác động vào chân INTx (chân P3.2 hoặc P3.3) của 8051, cờ ngắt IEx tương ứng sẽ được đặt bằng 1 → vi điều khiển thực hiện chương trình phục vụ ngắt của ngắt ngoài tương ứng. - Khi một ngắt ngoài được tạo ra, cờ ngắt sẽ được tự động xóa bởi phần cứng khi vi điều khiển chuyển đến chương trình phục vụ ngắt nếu ngắt thuộc loại tác động cạnh xuống. Còn nếu ngắt thuộc loại tác động mức, nguyên nhân ngắt ngoài sẽ điều khiển mức của cờ thay vì phần cứng. b. Các ngắt timer (timer 0 và timer 1) - Khi timer x tràn, cờ TFx được đặt lên 1→ vi điều khiển thực hiện chương trình phục vụ ngắt của timer x. - Cờ TFx được tự động xóa về 0 bởi phần cứng khi vi điều khiển chuyển đến chương trình phục vụ ngắt. c. Các ngắt port nối tiếp - Khi TI = 1 (phát xong 1 byte) hay RI = 1 (thu xong 1 byte)→ vi điều khiển thực hiện chương trình phục vụ ngắt của port nối tiếp. - Cờ TI hay RI không được xóa tự động bởi phần cứng khi chuyển đến chương trình phục vụ ngắt → người lập trình phải xóa cờ TI hay RI về 0 bằng phần mềm. 4. Thiết kế chương trình dùng các ngắt * Vector ngắt (Interrupt vector): là địa chỉ bắt đầu của 1 chương trình phục vụ ngắt. Mỗi loại ngắt khác nhau được dành riêng một vector ngắt. Khi một ngắt được chấp nhận, địa chỉ vector ngắt tương ứng được nạp vào thanh ghi PC. Bảng các vector ngắt: Nguyên nhân ngắt Cờ Địa chỉ vector ngắt Reset hệ thống RST 0000H Ngắt ngoài 0 IE0 0003H Ngắt timer 0 TF0 000BH Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 14 Ngắt ngoài 1 IE1 0013H Ngắt timer 1 TF1 001BH Ngắt port nối tiếp RI hoặc TI 0023H Lưu ý: việc reset hệ thống cũng được xem như là một ngắt với địa chỉ vector tương ứng là 0000H. a. Chương trình phục vụ ngắt có kích thước nhỏ (≤ 8 byte) Chương trình phục vụ ngắt có thể được viết ngay tại địa chỉ vector ngắt nếu nó có kích thước không quá 8 byte. Khuôn mẫu chương trình sau có thể được sử dụng: ORG 0000H ; điểm nhập sau khi reset LJMP MAIN ; nhảy đến chương trình chính, bỏ qua vùng vector ngắt ORG 0003H ; điểm nhập của trình phục vụ ngắt ngoài 0 EXT0_ISR: RETI ; thoát khỏi trình phục vụ ngắt, quay về chương trình chính ORG 000BH ; điểm nhập của trình phục vụ ngắt timer 0 T0_ISR: RETI ; thoát khỏi trình phục vụ ngắt, quay về chương trình chính ORG 0030H ; bắt đầu CT chính tại 0030H để tránh đè lên vùng vector ngắt MAIN: END ; kết thúc chương trình b. Chương trình phục vụ ngắt có kích thước lớn (> 8 byte) Nếu chương trình phục vụ ngắt có kích thước dài hơn 8 byte, cần phải di chuyển chương trình này đến một nơi khác trong bộ nhớ chương trình hay có thể lấn qua vùng của ngắt khác nếu ngắt đó không dùng. Thông thường, ISR được bắt đầu với một lệnh nhảy đến một vùng khác của bộ nhớ chương trình, ở đó chương trình được trải rộng nếu cần. Khuôn mẫu chương trình sau có thể được sử dụng: ORG 0000H LJMP MAIN ; nhảy đến chương trình chính ORG 0003H ; điểm nhập của trình phục vụ ngắt ngoài 0 LJMP EXT0_ISR ; nhảy đến chương trình phục vụ ngắt ngoài 0 ORG 000BH ; điểm nhập của trình phục vụ ngắt timer 0 LJMP T0_ISR ; nhảy đến chương trình phục vụ ngắt timer 0 ORG 0030H ; bắt đầu chương trình chính tại 0030H MAIN: ;SJMP $ ; các chương trình con Thường là các khởi động ban đầu, các lệnh gọi chương trình con, Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 15 CTCON_1: RET CTCON_2: RET ; các chương trình phục vụ ngắt EXT0_ISR: RETI T0_ISR: RETI END 5. Các ví dụ Ví dụ 3.1: Viết chương trình sử dụng ngắt timer 0 để tạo một sóng vuông đối xứng tần số 10KHz trên chân P1.0. Giả sử fOSC = 12 MHz. Giải: - Sóng vuông f = 10KHz → T = 0,1ms = 100μs → tL = tH = 50μs → cho timer đếm 50μs → sử dụng timer 0, chế độ 2 (8 bit tự động nạp lại). - Mỗi lần tràn, timer 0 tạo ra một ngắt (TF0 = 1). Chương trình phục vụ ngắt chỉ cần lấy bù giá trị ở chân P1.0 (do đối xứng) → sử dụng chương trình phục vụ ngắt có kích thước nhỏ. Chương trình: ORG 0 ; điểm nhập khi reset LJMP MAIN ; nhảy đến chương trình chính ORG 000BH ; vector ngắt timer 0 T0_ISR: ; chương trình phục vụ ngắt timer 0 CPL P1.0 ; lấy bù chân P1.0 RETI ; trở về chương trình chính ORG 0030H ; điểm nhập chương trình chính MAIN: ; chương trình chính MOV TMOD,#02H ; khởi động timer 0, chế độ 2 MOV TH0,#-50 ; cho timer 0 đếm 50μs SETB TR0 ; cho phép timer 0 chạy MOV IE,#82H ; cho phép ngắt timer 0 SJMP $ ; không làm gì, chỉ chờ ngắt END Ví dụ 3.2: Viết chương trình sử dụng các ngắt timer để tạo đồng thời 2 sóng vuông đối xứng có tần số là 7KHz và 500Hz trên các chân P1.7 và P1.6. Giả sử fOSC = 12 MHz. Giải: Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 16 - Hai sóng vuông có tần số khác nhau: + f1 = 7KHz → T1 ≈142μs → tL1 = tH1 = 71μs → dùng timer 0, chế độ 2 (8 bit tự động nạp lại) tạo ngắt lấy bù giá trị trên chân P1.7. + f2 = 500Hz → T2 = 2ms = 2000μs → tL2 = tH2 = 1000μs → dùng timer 1, chế độ 1 (16 bit) tạo ngắt lấy bù giá trị trên chân P1.6. - Sử dụng chương trình phục vụ ngắt kích thước lớn vì khi dùng timer 1 ở chế độ 1, trong chương trình phục vụ ngắt phải nạp lại giá trị cho các thanh ghi TH1 và TL1 → chương trình sẽ vượt quá 8 byte. Chương trình: ORG 0 LJMP MAIN ORG 000BH ; vector ngắt timer 0 LJMP T0_ISR ORG 001BH ; vector ngắt timer 1 LJMP T1_ISR ORG 0030H MAIN: MOV TMOD,#12H ; khởi động timer 0 ở chế độ 2 và timer 1 ở chế độ 1 MOV TH0,#-71 MOV TH1,#HIGH(-1000) MOV TL1,#LOW(-1000) SETB TR0 SETB TR1 MOV IE,#8AH ; cho phép ngắt timer 0 và timer 1 SJMP $ T0_ISR: ; chương trình phục vụ ngắt timer 0 CPL P1.7 RETI T1_ISR: ; chương trình phục vụ ngắt timer 1 CLR TR1 MOV TH1,#HIGH(-1000) MOV TL1,#LOW(-1000) SETB TR1 CPL P1.6 RETI END Ví dụ 3.3: Viết chương trình sử dụng ngắt để liên tục phát đi tập mã ASCII (bỏ qua các mã điều khiển) đến 1 thiết bị đầu cuối nối với 8051 qua port nối tiếp. Giả sử truyền UART 8 bit, tốc độ baud là 1200, bit SMOD = 1. Giải: - Có 128 mã ASCII 7-bit trong bảng mã ASCII. Các mã này bao gồm 95 mã đồ hoạ (từ 20H đến 7EH) và 33 mã điều khiển (từ 00H đến 1FH và 7FH). Ở đây ta chỉ xuất các mã đồ họa (từ 20H đến 7EH). - Sử dụng ngắt port nối tiếp để phát ký tự: khi có ngắt TI = 1 (báo bộ đệm phát đã rỗng) → vào chương trình phục vụ ngắt để gởi mã đồ họa tiếp theo ra bộ đệm phát. Trước khi gởi, cần phải kiểm tra xem đã hết tập mã ASCII chưa, nếu hết thì phát lại từ đầu. Chương trình: ORG 0 LJMP MAIN Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 17 ORG 0023H LJMP SP_ISR ; vector ngắt port nối tiếp ORG 0030H MAIN: ; chương trình chính MOV TMOD,#20H ; khởi động timer 1, chế độ 2 MOV TH1,#-26 ; tốc độ baud của port nối tiếp là 1200 SETB TR1 ; cho timer 1 chạy để tạo xung clock tốc độ baud MOV SCON,#42h ; port nối tiếp ở chế độ 1 (UART 8 bit, tốc độ thay đổi), ; cho TI = 1: buộc ngắt để gởi ký tự đầu tiên MOV A,#20H ; ký tự đầu tiên là 20H MOV IE,#90H ; cho phép ngắt port nối tiếp SJMP $ SP_ISR: ; chương trình phục vụ ngắt port nối tiếp CJNE A,#7FH,SKIP ; nếu chưa hết tập mã đồ họa ASCII thì phát ký tự kế MOV A,#20H ; nếu hết thì phát lại từ mã đồ họa đầu tiên (20H) SKIP: MOV SBUF,A ; gởi ký tự đến bộ đệm phát INC A ; tăng lên ký tự kế CLR TI ; xóa cờ ngắt phát, chuẩn bị cho lần phát kế tiếp RETI END Ví dụ 3.4: Điều khiển lò nung Giả sử có một bộ cảm biến nhiệt được nối với chân INT0 (P3.2) và INT1 (P3.3) cung cấp hai tín hiệu HOT và COLD như sau: HOT = 0 nếu nhiệt độ > 210C COLD= 0 nếu nhiệt độ < 190C Lò được điều khiển bật/tắt thông qua chân P1.7 : P1.7 = 1 bật lò, P1.7 = 0 tắt lò. Viết chương trình sử dụng các ngắt để điều khiển lò nung sao cho nhiệt độ lò được duy trì ở 200C ± 10C. Giải: Chương trình sẽ bật lò (P1.7 = 1) khi nhiệt độ < 190C và tắt lò (P1.7 = 0) khi nhiệt độ >210C. Khi nhiệt độ trong [190C, 210C], các ngõ vào HOT và COLD đều là 1. Khi nhiệt độ < 190C, HOT = 0 hay nhiệt độ > 210C, COLD= 0 → tạo xung cạnh xuống kích vào chân ngắt ngoài INT0 hay INT1 . Như vậy trong chương trình phục vụ các ngắt ngoài này chỉ cần đặt hay xóa bit P1.7. 8051 INT0 (P3.2) P1.7 INT1(P3.3) Bật/tắt lò HOT COLD Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 18 Chương trình: ORG 0 LJMP MAIN ORG 0003H EXT0_ISR: CLR P1.7 ; tắt lò RETI EXT1_ISR: SETB P1.7 ; bật lò RETI ORG 0030H MAIN: MOV IE,#85H ; cho phép ngắt ngoài 0 và 1 SETB IT0 ; tác động cạnh xuống SETB IT1 SETB P1.7 ; ban đầu, bật lò JB P3.2,SKIP ; nếu nhiệt độ > 210C CLR P1.7 ; thì tắt lò SKIP:SJMP $ ; không làm gì END Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 19 BÀI TẬP CHƯƠNG 4 Phần timer (Giả sử hệ thống dùng thạch anh 12MHz) 4.1. Viết chương trình dùng timer tạo trễ 200μs. 4.2. Viết chương trình dùng timer tạo trễ 50ms. 4.3. Viết chương trình dùng timer tạo một xung mức cao trên chân P1.7 trong 1s. 4.4. Viết chương trình dùng timer tạo sóng vuông đối xứng có tần số f = 500Hz trên chân P1.0. 4.5. Viết chương trình dùng timer tạo sóng vuông đối xứng trên chân P1.0 có tần số f = 500Hz, duty cycle = 30% (thời gian mức cao = 30% thời gian của chu kì xung). 4.6. Giả sử có một hệ thống đếm số người đi vào một siêu thị như trong hình vẽ B4.6. Bộ cảm biến sẽ tạo ra 1 xung (kích cạnh xuống) đưa vào chân T1 của 8051 (P3.5) khi có 1 người đi vào siêu thị. Một bóng đèn được điều khiển bởi chân P1.7 sẽ sáng khi P1.7 = 1 và tắt nếu P1.7 = 0. Hãy viết chương trình dùng timer để đếm số người và bật đèn báo hiệu khi có người thứ 10.000 đi vào siêu thị. 4.7. Viết chương trình dùng timer 0 đo thời gian mức cao của xung đưa vào chân INT0 (P3.2) của 8051. Thời gian đo được (tính bằng μs) được lưu vào ô nhớ 30H (byte thấp) và 31H (byte cao). Hình B4.6 Phần port nối tiếp 4.8. Viết một đoạn chương trình khởi động port nối tiếp để thu dữ liệu ở chế độ UART 8 bit, tốc độ baud là 4800. Giả sử hệ thống dùng thạch anh 12MHz và bit SMOD = 0. 4.9. Viết chương trình nhập một chuỗi mã ASCII dài 80 byte từ port nối tiếp và cất vào RAM ngoài bắt đầu từ địa chỉ 2000H. Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 2400, fOSC=12MHz và bit SMOD = 0. 4.10. Viết chương trình gởi liên tiếp các ký tự hiển thị được trong tập mã ASCII (có mã từ 20H đến 7EH) đến thiết bị gắn với port nối tiếp của 8051. Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 1200, fOSC =12MHz và bit SMOD = 0. 4.11. Viết chương trình nhập các ký tự từ bàn phím vào port nối tiếp và xuất ra thiết bị gắn với port nối tiếp, chuyển các ký tự thường thành ký tự hoa. Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 1200, fOSC =12MHz và bit SMOD = 0. 4.12. Tương tự bài 11 nhưng chuyển các ký tự hoa thành ký tự thường. 4.13. Giả sử có một chuỗi mã ASCII 20 byte chứa trong RAM nội bắt đầu từ ô nhớ 30H. Hãy viết chương trình phát chuỗi dữ liệu này ra port nối tiếp với điều kiện chỉ truyền các ký tự hoa. Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 2400, fOSC = 8MHz và bit SMOD = 0. 8051 T1 P1.7 Bộ cảm biến Đèn báo Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51 20 Phần ngắt (interrupt) 4.14. Viết chương trình dùng ngắt tạo sóng vuông đối xứng có tần số f = 400Hz trên chân P1.7. Giả sử hệ thống dùng thạch anh 12MHz. 4.15. Viết chương trình dùng ngắt để phát liên tiếp các ký tự hoa ra port nối tiếp. Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 2400, fOSC = 12MHz và bit SMOD = 0. 4.16. Làm lại bài 4.9 của phần port nối tiếp nhưng dùng ngắt. 4.17. Làm lại bài 4.13 của phần port nối tiếp nhưng dùng ngắt. 4.18. Làm lại bài 4.6 của phần timer nhưng dùng ngắt, lúc này xung từ bộ cảm biến đưa vào chân INT1 (P3.4) thay vì chân T1. 4.19. Viết chương trình dùng ngắt để phát liên tiếp các ký tự hiển thị được trong tập mã ASCII (mã từ 20H đến 7EH) ra port nối tiếp, mỗi lần phát cách nhau 50ms. Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 2400, fOSC = 12MHz và bit SMOD = 0. 4.20. Giả sử có một hệ thống đếm sản phẩm như hình B4.20. Cứ mỗi sản phẩm chạy qua bộ cảm biến sẽ tạo ra một xung vuông (kích cạnh xuống) đưa vào chân INT0 (P3.2) của 8051. Hãy viết chương trình dùng các ngắt để đếm số sản phẩm, mỗi khi đủ 100 sản phẩm thì xóa bộ đếm và tạo một xung mức cao trên chân P1.7 trong thời gian 1 giây, sau đó lặp lại. Hình B4.20 4.21. Giả sử có một hệ thống báo động như hình B4.21. Bộ cảm biến cửa mở sẽ tạo ra một xung vuông (kích cạnh xuống) đưa vào chân INT0 (P3.2) của 8051. Hãy viết chương trình dùng các ngắt để tạo ra âm hiệu có tần số 400Hz trên loa (nối với chân P1.7) trong thời gian 3 giây nếu cửa bị mở. Giả sử hệ thống dùng thạch anh 12MHz. Hình B4.21 8051 INT0 P1.7 Bộ cảm biến 8051 INT0 P1.7 Bộ cảm biến cửa mở 74LS04

Các file đính kèm theo tài liệu này:

  • pdfCh4.pdf