You are on page 1of 4

Nguyễn Trọng Duy – CN20A – 2051120098

Bài Tập Timer :


Câu 1 : Viết chương trình tạo sóng vuông có tần số 1KHz ở ngõ ra P1.0
và có chu kỳ làm việc D=30%. Biết rằng tần số thạch anh là 12MHz và
bộ đinh thời 0

#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 1000 // Tần số sóng vuông (1kHz)
#define DUTY_CYCLE 30 // Chu kỳ làm việc (30%)

// 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 1 để tạo sóng vuông
TMOD = 0x10; // Chọn chế độ 16-bit cho Timer 1
TH1 = 0xFF - (XTAL_FREQ / (PWM_FREQ * 2 * 16)); // Tính toán giá trị đặt
trước cho Timer 1
TL1 = TH1; // Sao chép giá trị đặt trước vào thanh ghi thấp
TR1 = 1; // Khởi động Timer 1

while (1) {
// Kiểm tra xem nếu giá trị Timer 1 lớn hơn hay bằng chu kỳ làm việc, thì đảo
trạng thái của ngõ ra P1.0
if (TF1) {
TF1 = 0; // Đặt lại cờ tràn
P1_0 = !P1_0; // Đảo trạng thái của ngõ ra
delay((100 - DUTY_CYCLE) * 100); // Trễ để tạo chu kỳ làm việc
}
}
}
Câu 2 : Viết chương trình dùng Timer tạo sóng vuông f=500Hz. Biết rằng
tần số thạch anh là 12MHz và bộ đinh thời 0.
#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
}
}
}
Câu 3 : Thiết kế trên proteus hệ thống đèn giao thông 3 đèn xanh đỏ vàng
có thứ tự sáng lần lượt 30s, 20s, 3s

You might also like