Chào các bạn trong bài đăng này mình sẽ giới thiệu với các bạn về chế độ Counter của TIMER 1 PIC16F877A. Chúng ta sẽ đi tìm các lệnh để cấu hình cho TIMER 1 như sau :
1. CÁC LỆNH CỦA TIMER – COUNTER TRONG NGÔN NGỮ PIC-C
Các lệnh của ngôn ngữ lập trình C liên quan đến timer/counter bao gồm:
- Lệnh SETUP_TIMER_X()
- Lệnh SET_TIMER_X()
- Lệnh SETUP_COUNTERS()
- Lệnh SETUP_WDT()
- Lệnh RESTART_WDT()
- Lệnh GET_TIMER_X()
2. LỆNH SETUP_TIMER_1(MODE)
- Cú pháp: setup_timer_1(mode)
- Thông số: mode có thể là 1 hoặc 2 hằng số định nghĩa trong file device.h. Các thông số gồm
T1_DISABLED, T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC
TC_CLK_OUT, T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8.
Các hằng số từ nhiều nhóm khác nhau thì có thể or với nhau.
- Chức năng:
- Khởi tạo cho TIMER1.
- Với tần số thạch anh là 20MHz và khởi tạo T1_DIV_BY_8 thì timer sẽ tăng giá trị sau
mỗi khoảng thời gian 1.6µs. Timer sẽ tràn sau 104.8576 ms.
- Có hiệu lực: cho tất cả các vi điều khiển PIC có timer 1.
3. LỆNH SET_TIMERx(value)
- Cú pháp: set_timerX(value) ; x là 0, 1, 2
- Thông số: value là hằng số nguyên 8 hoặc 16 bit dùng để thiết lập giá trị mới cho timer.
- Chức năng: thiết lập giá trị bắt đầu cho TIMER.
- Có hiệu lực: cho tất cả các vi điều khiển PIC có timer.
4. LỆNH GET_TIMERx()
- Cú pháp: value = get_timerX() ; x là 0, 1, 2
- Thông số: không có.
- Chức năng: đọc giá trị của TIMER/COUNTER.
- Có hiệu lực: cho tất cả các vi điều khiển PIC có timer.
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#INCLUDE <16F877a.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=16000000)
CONST UNSIGNED CHAR MA7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT16 DEM;
UNSIGNED CHAR DONVI,CHUC, TRAM, NGHIN;
VOID TACHSO (INT16 COUNT)
{
NGHIN = COUNT/1000;
TRAM = (COUNT - NGHIN*1000)/100;
CHUC = (COUNT - NGHIN*1000 - TRAM*100)/10;
DONVI = COUNT - NGHIN*1000 - TRAM*100 - CHUC*10;
}
VOID DISPLAY ()
{
OUTPUT_B(MA7SEG[NGHIN]);
OUTPUT_HIGH(PIN_D0);
DELAY_MS(5);
OUTPUT_LOW(PIN_D0);
OUTPUT_B(MA7SEG[TRAM]);
OUTPUT_HIGH(PIN_D1);
DELAY_MS(5);
OUTPUT_LOW(PIN_D1);
OUTPUT_B(MA7SEG[CHUC]);
OUTPUT_HIGH(PIN_D2);
DELAY_MS(5);
OUTPUT_LOW(PIN_D2);
OUTPUT_B(MA7SEG[DONVI]);
OUTPUT_HIGH(PIN_D3);
DELAY_MS(5);
OUTPUT_LOW(PIN_D3);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
OUTPUT_B(0);
OUTPUT_D(0);
SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1);
SET_TIMER1(0);
WHILE(1)
{
DEM = GET_TIMER1();
TACHSO(DEM);
DISPLAY();
IF(DEM==1500)
{
SET_TIMER1(0);
DEM=0;
}
}
}
- Link download project Click here
EmoticonEmoticon