Chào các bạn
trong bài đăng trước mình đã hướng dẫn các bạn về timer0 và trong bài đăng này
mình sẽ tiếp tục hướng dẫn các ban về timer1 của PIC16F877A. Timer 1 và 0 là 2
loại timer mà chúng ta rất hay sử dụng vì vậy các bạn phải nắm chất về 2 bộ
timer này nha. Ok bây giờ mình sẽ đi vào vấn đề chính ngay.
1. Đặc điểm của timer 1.
- Là timer/counter 16bit gồm 2 thanh ghi TMR1H và TMR1L có thể đọc và ghi.
- Timer 1 có thể hoạt động ở chế độ định thời hay đếm được lựa
chọn bởi bit TMR1CS.
- Trong chế độ định thời T1 tăng giá trị ở mỗi chu kỳ lệnh,
chế độ đếm bộ đếm tăng mỗi khi có cạch clock ngõ vào prescale bên ngoài.
- Có bộ prescale chia tần.
- Xảy ra hiện tượng ngắt khi tràn từ FFFFh -> 0000h.
2. Sơ đồ khối timer 1.
Mình chỉ giới thiệu sơ lược thôi nha ai muốn tìm hiểu sâu hơn về timer 1 thì lên mạng tìm hiểu thêm nha !
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
unsigned int Count = 0;
void main(void) {
TRISCbits.TRISC0 = 0;
TMR1 = 15535;
T1CONbits.TMR1CS = 0;
T1CONbits.T1CKPS1 = 1;
T1CONbits.T1CKPS0 = 0;
T1CONbits.T1SYNC = 1;
T1CONbits.TMR1ON = 1;
while (1)
{
if(PIR1bits.TMR1IF == 1)
{
PIR1bits.TMR1IF = 0;
TMR1 = 15535;
Count++;
if(Count==5)
{
Count =0;
PORTCbits.RC0 ^= 1; //toggle the LED
}
}
}
}
1 nhận xét:
Write nhận xétCho mình hỏi là tại sao trong vòng lặp mình phải khai báo lại TMR1 = 15535 ngay sau khi có tín hiệu cờ Timer vậy?
ReplyEmoticonEmoticon