Bài này chúng ta sẽ đi vào một trong những ứng dụng rất phổ biến của timer là phát xung vuông với tần số cho trước. Các bạn có thể xem lại bài : Bộ định thời Timer và Counter của PIC, để biết cách thiết lập và tính toán số nạp cho timer.

timerpic

Ví dụ này sẽ phát xung vuông tần số 1Khz=1000Hz, sử dụng timer 0, xuất ra chân RB1 của vi điều khiển PIC 16F877A. chu kì của xung là 1ms =1000us xung vuông có duty cycle 50% do đó mỗi lần vào ngắt timer mất T/2=1000/2 =500us. Vậy ta phải dùng timer cho delay=500us.

Cài đặt timer 0 :

value = 2n -1 - delay*f/(4*Prescale) .

sử dụng timer 0, n=8, Prescale=64,  delay=500us thì giá trị  value là : 

value=28 - 1 - 500x12/(4*64) ≈ 231.

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)

#INT_TIMER0
void isr_timer0(void){
 set_timer0(231); //500us đặt lại số nạp cho timer 0
 output_toggle(PIN_B1); // Đảo chân sau khi vào ngắt timer
}
void main() {
 
   enable_interrupts(GLOBAL); // Cho phép tất cả các ngắt
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); // cài đạt lại Timer 0 với hệ số chia 64
   set_timer0(231); // Nạp số để tính delay
   enable_interrupts(INT_RTCC); // Cho phép ngắt Timer 0
 
  while(TRUE) {

   }
}
Các bạn mở Proteus và vẽ mạch như hình dưới đây để chạy mô phỏng :

Các bạn download project tại đây : Phát xung vuông dùng timer vi điều khiển PIC

Xem video mô phỏng tại đây :

Epicviet.com

Nếu bạn thấy hay hãy đăng ký , chia sẻ giúp tôi nhé chúng tôi sẽ thường xuyên cập nhật kiến thức mới về vi điều khiển PIC tại đây