You are on page 1of 3

Câu 1 :

MAIN:

SETB P1.0

ACALL DELAY300US

CLR P1.0

ACALL DELAY700US

SJMP MAIN

DELAY3000US:

MOV TMOD , #01H

MOV TH0, #HIGH(-300) hoặc MOV TH0, #0F4H

MOV TL0, #LOW(-300) hoặc MOV TL0, #48H

SETB TR0

JNB TF0, $

CLR TR0

CLR TF0

RET

DELAY7000US:

MOV TMOD , #01H

MOV TH0, #HIGH(-700) hoặc MOV TH0, #0E4H

MOV TL0, #LOW(-700) hoặc MOV TL0, #0A8H

SETB TR0

JNB TF0, $

CLR TR0

CLR TF0

RET

END

Câu 2

#include <8051.h>
// Định nghĩa các hằng số
#define XTAL_FREQ 12000000UL // Tần số thạch anh (12MHz)
#define PWM_FREQ 500 // Tần số sóng vuông (500Hz)

// Hàm trễ (delay) sử dụng để đảm bảo chu kỳ làm việc đúng
void delay(unsigned int count) {
while (count--);
}

void main() {
// Thiết lập chân P1.0 là ngõ ra
P1_0 = 0; // Xác định trạng thái ban đầu là 0
P1_0 = 1; // Xác định trạng thái ban đầu là 1

// Cấu hình Timer 0 để tạo sóng vuông


TMOD &= 0xF0; // Xóa các bit của chế độ Timer 0
TMOD |= 0x02; // Chọn chế độ 8-bit cho Timer 0
TH0 = 0xFF - (XTAL_FREQ / (PWM_FREQ * 2 * 256)); // Tính toán giá trị
đặt trước cho Timer 0
TL0 = TH0; // Sao chép giá trị đặt trước vào thanh ghi thấp
TR0 = 1; // Khởi động Timer 0

while (1) {
// Kiểm tra xem nếu giá trị Timer 0 lớn hơn hay bằng 128, thì đảo trạng thái
của ngõ ra P1.0
if (TF0) {
TF0 = 0; // Đặt lại cờ tràn
P1_0 = !P1_0; // Đảo trạng thái của ngõ ra
}
}
}

You might also like