Cho chương trình sau:
DELAY:
MOV TMOD, #01H
LOOP:
MOV TH0, #HIGH(-50000)
MOV TL0, #LOW(-50000)
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
CPL P1.1
SJMP LOOP
END
Chương trình này dùng để:
Trả lời:
Đáp án đúng: D
Chương trình sử dụng Timer 0 ở chế độ 1 (TMOD = 01H) để tạo thời gian trễ. Giá trị -50000 được nạp vào TH0 và TL0. Vì Timer 0 là bộ đếm 16 bit, nên nó sẽ đếm từ -50000 đến 65535 (0xFFFF). Số lượng xung clock cần thiết để tràn Timer 0 là 65536 - 50000 = 15536. Giả sử tần số clock của vi điều khiển là 12MHz, thì chu kỳ của một xung clock là 1/12MHz. Thời gian trễ tạo ra bởi Timer 0 là 15536 * (1/12MHz) * 12 (do sử dụng hệ số chia 12 bên trong)= 0.012946667 s ≈ 12.95 ms. (Giá trị này có thể khác nhau tùy thuộc vào tần số clock của vi điều khiển). Tuy nhiên, do ta đảo trạng thái P1.1 mỗi khi Timer 0 tràn, nên thời gian cho một nửa chu kỳ của sóng vuông là khoảng 12.95ms. Do đó, chu kỳ đầy đủ của sóng vuông là 2 * 12.95ms ≈ 25.9 ms. Giá trị này gần nhất với đáp án 50ms. Tuy nhiên, do code dùng lệnh SJMP LOOP nên chương trình lặp lại vô hạn, tạo ra sóng vuông liên tục.
Tuy nhiên, cần lưu ý là các giá trị tính toán trên chỉ là ước tính và giá trị thực tế có thể khác nhau do các yếu tố khác như thời gian thực thi các lệnh khác. Việc tính toán chính xác cần dựa trên tần số clock thực tế và thời gian thực thi mỗi lệnh.
Vì vậy, đáp án chính xác nhất là B. Tạo dòng sóng vuông có chu kỳ 50mS trên chân P1.1





