Saturday, January 23, 2016

BÀI 31 : ĐẾM TỪ 0 ĐẾN 9999 SỬ DỤNG TIMER 0 PIC16F877A XC8

Chào các bạn trong bài đăng này mình sẽ hướng dẫn các bạn đếm từ 0 đến 9999 sử dụng Timer 0 của Vi Điều Khiển PIC16F877A. Và chúng ta sẽ sử dụng Timer 0 trong bài này để định thời quét LED, như vậy chúng ta có thể tùy chỉnh được thời gian delay nhanh chậm tùy thích. Bình thường thì nếu không sử dụng Timer để thực hiện bài này thì khi đếm giá trị LED sẽ tăng lên rất nhanh thậm chí chúng ta sẽ không thấy được sự thay đổi của nó, vì vậy chúng ta sẽ sử dụng Timer 0 để tạo thời gian delay phù hợp và để làm được điều đó chúng ta phải cấu hình cho Timer 0 như sau !
TMR0 = 55;
OPTION_REGbits.PSA = 0;
OPTION_REGbits.PS2 = 0;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS0 = 0;
OPTION_REGbits.T0CS = 0;
Và tiếp theo là chương trình ngắt :
if(INTCONbits.TMR0IF == 1)
{        
INTCONbits.TMR0IF = 0;
TMR0 = 55;
Count++;
if(Count == 15)
{
Count = 0;
dem++;
if(dem==1000)
{
dem=0;
}
}
}
- Đây là ảnh mô phỏng protues.

ĐẾM TỪ 0 ĐẾN 9999 SỬ DỤNG TIMER 0 PIC16F877A

- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#include <xc.h>
// 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;
unsigned int dem = 0,nghin,tram,chuc,donvi;
const unsigned char maled[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void display(void);
void main(void)
{
    TMR0 = 55;
    OPTION_REGbits.PSA = 0;
    OPTION_REGbits.PS2 = 0;
    OPTION_REGbits.PS1 = 1;
    OPTION_REGbits.PS0 = 0;
    OPTION_REGbits.T0CS = 0;
    TRISB = 0X00;
    PORTB = 0X00;
    TRISC = 0X00;
    while (1)
    {
        display();
        if(INTCONbits.TMR0IF == 1)
        {        
            INTCONbits.TMR0IF = 0;
            TMR0 = 55;
            Count++;
            if(Count == 15)
            {
                Count = 0;
                dem++;
                if(dem==1000)
                {
                    dem=0;
                }
            }
        }
    }
}
void display (void)
{
    nghin = dem/1000;
    tram = (dem - nghin*1000)/100;
    chuc = (dem - nghin*1000 - tram*100)/10;
    donvi = dem - nghin*1000 - tram*100 - chuc*10;
    
    PORTB = maled[nghin];
    RC0=0;
    __delay_ms(5);
    RC0=1;
    
    PORTB = maled[tram];
    RC1=0;
    __delay_ms(5);
    RC1=1;

    PORTB = maled[chuc];
    RC2=0;
    __delay_ms(5);
    RC2=1;

    PORTB = maled[donvi];
    RC3=0;
    __delay_ms(5);
    RC3=1;
}
Các bạn sữa lại tần số thạch anh là 4MHz nha !
- Link download project Click here

No comments:

Post a Comment