Wednesday, January 27, 2016

BÀI 32 : ĐẾM TỪ 0 ĐẾN 9999 SỬ DỤNG TIMER 1 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 1 của PIC16F877A và trình biên dịch Mplab XC8 để viết chương trình. Trong bài này chúng ta sử dụng Timer 1 để định thời quét LED, như vậy thời gian quét LED của chúng ta sẽ tùy thuộc hoàn toàn vào phụ thuộc vào Timer 1, thường thì khi không sử dụng Timer thì khi quét LED thì thời gian đếm sẽ rất nhanh đôi khi chúng ta không thấy được sự thay đổi của nó, vì vậy chúng ta sẽ sử dụng Timer để quét LED. Và cách cấu hình Timer 1 như sau :
TMR1 = 15535;
T1CONbits.TMR1CS = 0;
T1CONbits.T1CKPS1 = 1;
T1CONbits.T1CKPS0 = 0;
T1CONbits.T1SYNC = 1;
T1CONbits.TMR1ON = 1;
Chất không cần giải thích về đoạn code trên đâu nha ! Nếu có gì không hiểu thì xem lại bài trước nha.
- Đây là ảnh mô phỏng protues.
đếm từ 0 đến 9999 sử dụng timer 1 pic16f877a
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000
#include <xc.h>
// CONFIG
#pragma config FOSC = HS        // 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)
{
    TMR1 = 15535;
    T1CONbits.TMR1CS = 0;
    T1CONbits.T1CKPS1 = 1;
    T1CONbits.T1CKPS0 = 0;
    T1CONbits.T1SYNC = 1;
    T1CONbits.TMR1ON = 1;
    TRISB = 0X00;
    PORTB = 0X00;
    TRISC = 0X00;
    while (1)
    {
        display();
        if(PIR1bits.TMR1IF == 1)
        {
            PIR1bits.TMR1IF = 0;
            TMR1 = 15535;
            Count++;
            if(Count==3)
            {
                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;
}
- Link download project Click here

No comments:

Post a Comment