Để giải bài này, ta cần phân tích đoạn code và tính toán thời gian delay:
- TMOD, #02H: Timer 0 được cấu hình ở Mode 2 (8-bit auto-reload).
- TH0, # -50: Giá trị ban đầu của TH0 là -50, tương đương 256 - 50 = 206. Vậy bộ đếm sẽ đếm từ 206 đến 255, tức là 255 - 206 + 1 = 50 xung clock.
- TR0: Bắt đầu đếm.
- JNB TF0, LOOP: Chờ đến khi cờ TF0 được set (khi tràn bộ đếm).
- CLR TF0: Xóa cờ TF0.
- CPL P1.0: Đảo bit P1.0.
- SJMP LOOP: Quay lại LOOP.
Như vậy, mỗi lần tràn bộ đếm, bit P1.0 sẽ đảo trạng thái. Chu kỳ của sóng vuông trên P1.0 sẽ bằng hai lần thời gian tràn bộ đếm.
Giả sử tần số clock của vi điều khiển là 12MHz (thường gặp). Khi đó, chu kỳ của một xung clock là 1/12MHz = 1/(12 * 10^6) giây.
Vì Timer 0 ở Mode 2, nó sẽ tự động nạp lại giá trị TH0 khi tràn. Thời gian để Timer 0 tràn là 50 * (1/12MHz) = 50 / (12 * 10^6) giây.
Chu kỳ của sóng vuông trên P1.0 là 2 * (50 / (12 * 10^6)) = 100 / (12 * 10^6) giây = 100 / 12 µs ≈ 8.33 µs. Tuy nhiên, đề bài không cho tần số clock, ta xét đến các yếu tố khác.
Nếu ta giả sử tần số clock là 12MHz và mỗi lệnh máy tốn 1 chu kỳ máy thì thời gian thực hiện mỗi vòng lặp LOOP sẽ là thời gian delay cộng với thời gian thực hiện các lệnh JNB, CLR, CPL, SJMP. Tuy nhiên, câu hỏi chỉ tập trung vào tính delay.
Quan trọng nhất, ta thấy rằng giá trị TH0 được nạp là #-50 (tương đương 206). Khi bộ đếm đếm từ 206 đến 255 thì TF0 sẽ được set. Sau đó TF0 sẽ được clear và P1.0 được đảo bit. Do đó, cứ sau 50 xung clock thì P1.0 sẽ đảo trạng thái. Vì vậy, chu kỳ của sóng vuông tạo ra trên P1.0 tỉ lệ với 50 * 2 = 100.
Nếu tần số hoạt động là 12MHz thì sẽ có chu kỳ nhỏ, nhưng do không có thông tin về tần số clock và xem xét các đáp án đưa ra, đáp án C (100mS) có vẻ hợp lý nếu tần số clock đủ nhỏ.
Để chính xác, cần có thông tin về tần số clock của vi điều khiển.
Tuy nhiên, vì không có đáp án nào tính toán trực tiếp từ tần số 12MHz (nếu có) nên ta sẽ chọn đáp án gần đúng nhất dựa trên logic đếm của timer.