Professional Documents
Culture Documents
Bai 005 VXL Pic Timer Libre
Bai 005 VXL Pic Timer Libre
GI I THIU
KH O ST TIMER/COUNTER
KH O ST TIMER/COUNTER T0
KH O ST TIMER/COUNTER T1
KH O ST TIMER T2
CC CH NG TRNH
NG D NG TIMER /COUNTER
CC TON T
FILE DEVICE
I.
Nguyen nh Phu
GI I THIU
44
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2-0
Nguyen nh Phu
Bit l a chn
000
001
010
011
100
101
110
111
T l TMR0
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256
T l WDT
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128
Ng t c a Timer0:
Khi gi tr m trong thanh ghi TMR0 trn t FFh v 00h th pht sinh ngt, c bo ngt TMR0IF
(INTCON<2>) i tr ng thi t 0 ln 1. Ngt c th ngn bng cch xa bit cho php ngt TMR0IE
(INTCON<5>).
Trong ch ng trnh con ph c v ngt Timer0 ph i xa c bo ngt TMR0IF. Ngt c a TMR0 khng
th kch CPU thot kh i ch ng v b nh th i s ngng khi CPU ch ng .
b.
45
Nguyen nh Phu
c.
tr ng thi m c cao
c:
NH TH I TIMER1:
46
Nguyen nh Phu
Cu trc c a Timer1:
Bit 7-6
Bit 5-4
Bit 3
Bit 2
Ch a s d ng n u c s c gi tr 0.
T1CKPS1:T1CKPS0: cc bit l a chn b chia - Timer1 input Clock Prescale Select bits
11=1:8 gi tr chia.
10=1:4 gi tr chia.
01=1:2 gi tr chia.
00=1:1 gi tr chia.
T1OSCEN: bit K cho php b dao ng Timer1 - Timer1 Oscillator Enable Control bit
1= b dao ng c php.
0= Tt b dao ng.
T1SYNC: bit K ng b ng vo xung clock bn ngoi c a timer1
Khi TMR1CS = 1
1= khng th ng b ng vo clock t bn ngoi.
47
Bit 1
Bit 0
a.
Nguyen nh Phu
0= ng b ng vo clock t bn ngoi.
Khi TMR1CS = 0
Bit ny b b qua. Timer1 dng xung clock bn trong khi TMR1CS = 0.
TMR1CS: bit l a chn ngu n xung clock c a timer1
1= Chn ngu n xung clock t bn ngoi chn RC0/T1OSO/T1CKI (c nh ln).
0= Chn xung n i bn trong (FOSC/4).
TMR1ON: bit i u khi n Timer14
1= Cho php Timer1 m.
0= Timer1 ngng m.
Timer1
ch nh th i:
Hnh 5-5. T1 o t n n t i.
b.
Timer1
ch m xung ngo i:
N u bit TMR1CS bng 1 th T1 ho t ng m xung ngo i. Xung ngo i c 2 ngu n xung ph thu c
vo bit T1OSCEN:
N u bit T1OSCEN bng 1 th T1 m xung ngo i t m ch dao ng c a T1 - xem hnh 5-6.
N u bit T1OSCEN bng 0 th T1 m xung ngo i a n ng vo T1CKI - xem hnh 5-7.
48
Nguyen nh Phu
Timer1 tng gi tr khi c xung c nh ln. Counter ch tng gi tr m sau khi nhn 1 xung c nh xu ng
c minh ho hnh 5-8.
Ho t ng c a Timer1
ch Counter ng b :
ch Counter:
Ho t ng c a Timer1
ch ng b ,
ch Counter b t ng b :
Timer T1 cho php c gi tr cc thanh ghi TMR1H hoc TMR1L khi timer ang m xung bt ng
b bn ngoi.
Khi ghi th nn ngng timer l i r i m i ghi gi tr mong mu n vo cc thanh ghi. N u ghi m timer
ang m vn c nh ng c th t o ra m t gi tr m khng d on c hay khng chnh xc.
f.
B dao ng c a Timer1:
49
Nguyen nh Phu
Hnh 5-9. K t ni t an t o ao n.
B dao ng l dao ng cng sut thp, t c 200 kHz. B dao ng vn ti p t c ch y khi CPU
ch ng . B dao ng ch dng v i t th ch anh 32 kHz. B ng sau trnh by cch l a chn t cho b dao
ng Timer1.
g.
ch
so snh
t o ra xung kch
Ch : xung kch t kh i CCP1 v CCP2 s khng lm bit c ngt TMR1IF (PIR1<0>) bng 1.
Timer1 ph i nh cu hnh ch nh th i hoc b m ng b t o ti n ch cho cu trc ny.
N u Timer1 ang ho t ng ch m bt ng b th ho t ng Reset khng th th c hi n c.
Reset cp thanh ghi TMR1H, TMR1L c a Timer1:
h.
c reset v 00h
Reset lc cp ngu n POR hoc khi Brown-out Reset s xa thanh ghi T1CON v timer T1
ngng (OFF) v h s chia tr c l 1:1. Cc reset khc th thanh ghi khng b nh h ng.
tr ng thi
3.
50
NH TH I TIMER2:
Bai 5: Timer/counter cua PIC va lap trnh C.
Nguyen nh Phu
c kh i t o gi tr FFH.
Ng ra c a TMR2 i qua b chia sau (postscaler) 4 bit tr c khi pht sinh yu cu ngt lm c
TMR2IF (PIR1<1>) ln 1. Khi bit TMR2ON bng 0 th tt Timer2 gi m cng sut tiu th .
Bit 7
Bit 6-3
Bit 2
Bit 1-0
Ch a s d ng n u c s c gi tr 0.
TOUTPS3:TOUTPS0: cc bit l a chn ng ra b chia sau (Postscaler) c a Timer2
0000=1:1
0001=1:2
0010=1:3
.
.
1111=1:16
TMR2ON: Bit i u khi n cho php/cm Timer2
1= cho php timer2 m.
0= Timer2 ngng m.
T2CKPS1:T2CKPS0: bit l a chn h s chia tr c cho ngu n xung clock c a timer2
00= h s chia l 1.
01= h s chia l 4.
51
Nguyen nh Phu
a.
B m chia tr
TMR2 khng b
Ng ra c a TMR2:
b.
Ng ra c a TMR2
III.
1.
C php:
setup_timer_0(mode)
Thng s :
RTCC_DIV_16,
RTCC_DIV_32,
SETUP_TIMER_0 (RTCC_DIV_2|RTCC_EXT_L_TO_H);
// COUNTER
Bai 5: Timer/counter cua PIC va lap trnh C.
SET_TIMER0(0);
DEM=GET_TIMER0();
Nguyen nh Phu
2.
C php:
setup_timer_1(mode)
Thng s :
Ch c nng:
kh i t o cho TIMER1.
V i tn s th ch anh l 20MHz v kh i t o T1_DIV_BY_8 th timer s tng gi tr sau m i
kho ng th i gian 1.6s. Timer s trn sau 104.8576 ms.
SETUP_TIMER_1 (T1_DISABLED);
SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_4);
SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_8);
SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1);
SET_TIMER1(0);
DEM=GET_TIMER1();
3.
C php:
Thng s :
Ch c nng:
kh i t o cho TIMER2.
Mode ch nh ki u b chia c a timer t tn s c a m ch dao ng.
Gi tr c a timer c th c hoc ghi dng l nh GET_TIMER2() v SET_TIMER2().
TIMER2 l timer 8 bit.
m i
4.
C php:
set_timerX(value)
; x l 0, 1, 2
Thng s :
53
Ch c nng:
Nguyen nh Phu
SET_TIMER2 (0);
//reset timer2
C php:
value = get_timerX() ; x l 0, 1, 2
Thng s :
khng c.
Ch c nng:
c gi tr c a TIMER/COUNTER.
DEM=GET_TIMER0();
C php:
Thng s :
Ch c nng:
C hi u l c:
Yu cu:
V d :
7.
setup_wdt (mode)
For PCB/PCM parts: WDT_18MS, WDT_36MS, WDT_72MS,
WDT_144MS,WDT_288MS, WDT_576MS, WDT_1152MS, WDT_2304MS
For PIC18 parts: WDT_ON, WDT_OFF
Thi t lp cho b nh th i watchdog.
B nh th i watchdog c s d ng reset phn c ng n u phn m m lp trnh b sa ly
nh ng vng lp v tn hoc m t s ki n no ch chng x y ra nh ng chng l i khng
bao gi x y ra, chm d t vi c ch i ny th ta ph i s d ng b nh th i watchdog.
Tr c khi ti n hnh vo vng lp th ta ph i cho php b nh th i watchdog m v i
kho ng th i gian lp trnh tr c v n u s ki n khng x y ra th b nh th i watchdog
s h t th i gian lp trnh s reset phn c ng thot kh i vng lp.
PCB/PCM
PCH
Enable/Disable
#fuses
setup_wdt()
Timeout time
setup_wdt()
#fuses
Restart
restart_wdt()
restart_wdt()
Cho tt c cc thi t b
#fuses, hng s c nh ngha trong file devices .h
#fuses WDT1 // PIC18 example, See restart_wdt for a PIC18 example
main() {
// WDT1 means 18ms*1 for old PIC18s and 4ms*1 for new PIC18s
// setup_wdt(WDT_ON);
while (TRUE) {
restart_wdt();
perform_activity();
}
}
C php:
Thng s :
Ch c nng:
54
//c gi tr c a timer0
restart_wdt()
Khng c
Kh i t o l i b nh th i watchdog. N u b nh th i watchdog c cho php th l nh ny
s kh i t o l i gi tr nh th i ngn chn khng cho b nh th i reset CPU v s ki n ch
i x y ra.
PCB/PCM
PCH
Enable/Disable #fuses
setup_wdt()
Timeout time setup_wdt()
#fuses
restart
restart_wdt() restart_wdt()
Bai 5: Timer/counter cua PIC va lap trnh C.
Nguyen nh Phu
// PCB/PCM example
// See setup_wdt for a PIC18 example
main() {
setup_wdt(WDT_2304MS);
while (TRUE) {
restart_wdt();
perform_activity();
}
}
55
Nguyen nh Phu
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT
UNSIGNED CHAR
56
Nguyen nh Phu
//TAM=123
//LAY HANG TRAM=1
//LAY HANG VA DONVI =23
//LAY HANG CHUC=2
//LAY DONVI=3
57
Nguyen nh Phu
OUTPUT_B(MDONVI);
OUTPUT_D(MCHUC);
OUTPUT_C(MTRAM);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
SET_TRIS_C(0x00);
//PORTB OUT
// PORTD OUT
// PORTC OUT
Nguyen nh Phu
DISPLAY();
}
}
NG TRNH
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT
UNSIGNED CHAR
59
Nguyen nh Phu
{
CHUC = TAM/10;
DONVI= TAM %10;
MCHUC = MALED7DOAN[CHUC];
MDONVI= MALED7DOAN[DONVI];
}
VOID DISPLAY ()
{
OUTPUT_B(MDONVI);
OUTPUT_D(MCHUC);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
SETUP_TIMER_1 (T1_EXTERNAL | T1_DIV_BY_1);
SET_TIMER1(0);
//PORTB OUT
// PORTD OUT
// KHOITAOTIMER
// GIA TRI BAT DAU
WHILE(1)
{
DEM=GET_TIMER1();
DIV_DECODE(DEM);
IF (DEM==100) SET_TIMER1(1);
DISPLAY();
}
}
2.
60
Nguyen nh Phu
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
61
Nguyen nh Phu
}
VOID DELAY_HIENTHI()
{
FOR (I=0; I<250;I++)
{
OUTPUT_B(MDONVI);
OUTPUT_D(0xFE);
OUTPUT_B(MCHUC);
OUTPUT_D(0xFD);
}
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
WHILE(1)
{
FOR (DEM=0; DEM<100; DEM++)
{
DIV_BCD(DEM);
DELAY_HIENTHI();
}
}
}
DELAY_MS(1);
DELAY_MS(1);
Nguyen nh Phu
OUTPUT_C(DEM);
DIV_BCD(DEM);
HIENTHI();
}
}
}
BI 5-8: IU KHIN LED 7 ON QUT M T 0000 N 9999 HIN TH LED QUT
DNG PB IU KHIN CC ON A,B,C,D,E,F,G,DP. PD IU KHIN CC TRANS
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT16
DEM;
INT
DONVI, CHUC, TRAM, NGAN, I;
UNSIGNED CHAR MDONVI, MCHUC, MTRAM, MNGAN;
VOID DIV_BCD (INT16 TAM)
{
NGAN
=
TAM/1000;
TAM
=
TAM%1000;
TRAM
=
TAM/100;
TAM
=
TAM%100;
CHUC
=
TAM /10;
DONVI
=
TAM%10;
MNGAN
MTRAM
MCHUC
MDONVI
=
=
=
=
MALED7DOAN[NGAN];
MALED7DOAN[TRAM];
MALED7DOAN[CHUC];
MALED7DOAN[DONVI];
}
VOID HIENTHI()
{
FOR (I=0; I<2;I++)
{
OUTPUT_B(MDONVI);
OUTPUT_B(MCHUC);
OUTPUT_B(MTRAM);
OUTPUT_B(MNGAN);
}
}
OUTPUT_D(0B11111110);
OUTPUT_D(0B11111101);
OUTPUT_D(0B11111011);
OUTPUT_D(0B11110111);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
WHILE(1)
{
FOR (DEM=0;DEM<10000;DEM++)
{
DIV_BCD(DEM);
HIENTHI();
}
}
}
Bai 5: Timer/counter cua PIC va lap trnh C.
63
Nguyen nh Phu
MNGAN
=
MALED7DOAN[NGAN];
MTRAM
=
MALED7DOAN[TRAM];
MCHUC
=
MALED7DOAN[CHUC];
MDONVI
=
MALED7DOAN[DONVI];
IF
(MNGAN == 0XC0)
{
MNGAN=0XFF;
IF (MTRAM ==0XC0)
{MTRAM=0XFF;
IF (MCHUC == 0XC0)
{MCHUC =0XFF;
}
}
}
}
VOID HIENTHI()
{
FOR (I=0; I<2;I++)
{
OUTPUT_B(MDONVI);
OUTPUT_B(MCHUC);
OUTPUT_B(MTRAM);
OUTPUT_B(MNGAN);
}
}
OUTPUT_D(0B11111110);
OUTPUT_D(0B11111101);
OUTPUT_D(0B11111011);
OUTPUT_D(0B11110111);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
WHILE(1)
{
FOR (DEM=0;DEM<2000;DEM++)
{
DIV_BCD(DEM);
64
Nguyen nh Phu
HIENTHI();
}
}
}
65
Nguyen nh Phu
DEM,DONVI,CHUC,I,TRAM;
MDONVI,MCHUC,MTRAM;
// BIEN DEM
// BIEN CHUA MA 7 DOAN
OUTPUT_D(0B11111110);
OUTPUT_D(0B11111101);
OUTPUT_D(0B11111011);
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
//PORTB OUT
SET_TRIS_D(0x00);
// PORTD OUT
WHILE(1)
{
FOR (DEM=0;DEM<201;DEM++)
{
DIV_DECODE(DEM);
FOR (I=0;I<50;I++)
{
DISPLAY();
}
}
}
}
BI 5-11: IU KHIN LED 7 ON QUT M T 000 N 300 V XA S 0 V NGHA
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT16
INT
66
DEM;
DONVI,CHUC,I,TRAM;
UNSIGNED CHAR
MDONVI,MCHUC,MTRAM;
Nguyen nh Phu
MTRAM = MALED7DOAN[TRAM];
MCHUC = MALED7DOAN[CHUC];
MDONVI= MALED7DOAN[DONVI];
IF (TRAM == 0)
{
MTRAM=0XFF;
IF (CHUC == 0 )
{ MCHUC=0XFF;
}
}
// XOA SO 0 VO NGHIA
}
VOID DISPLAY ()
{
OUTPUT_B(MDONVI);
OUTPUT_D(0B11111110);
OUTPUT_B(MCHUC);
OUTPUT_D(0B11111101);
OUTPUT_B(MTRAM);
OUTPUT_D(0B11111011);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
//PORTB OUT
SET_TRIS_D(0x00);
// PORTD OUT
WHILE(1)
{
FOR (DEM=0;DEM<301;DEM++)
{
DIV_DECODE(DEM);
FOR (I=0;I<20;I++)
{
DISPLAY();
}
}
}
}
DELAY_MS(1);
DELAY_MS(1);
DELAY_MS(1);
67
Nguyen nh Phu
{
CHGIAY
DVGIAY
MCHGIAY
MDVGIAY
=
=
=
=
TAMG/10;
TAMG%10;
MALED7DOAN[CHGIAY];
MALED7DOAN[DVGIAY];
}
VOID HIENTHI()
{
FOR (I=0; I<2;I++)
{
OUTPUT_B(MDVGIAY);
OUTPUT_B(MCHGIAY);
OUTPUT_D(0B11111110);
OUTPUT_D(0B11111101);
DELAY_MS(1);
DELAY_MS(1);
OUTPUT_B(MDVPHUT);
OUTPUT_B(MCHPHUT);
OUTPUT_D(0B11110111);
OUTPUT_D(0B11101111);
DELAY_MS(1);
DELAY_MS(1);
}
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
WHILE(1)
{
FOR (PHUT=0;PHUT<60;PHUT++)
{
FOR (GIAY=0; GIAY <60; GIAY ++)
{
DIV_BCD_PHUT(PHUT);
DIV_BCD_GIAY(GIAY);
HIENTHI();
}
}
}
}
BI 5-13: I U KHI N LD 7 O N QUT M GI PHT GIY
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT
PHUT,GIAY ,DVPHUT,CHPHUT,DVGIAY,CHGIAY,I;
UNSIGNED CHAR MCHPHUT, MDVPHUT,MCHGIAY, MDVGIAY;
INT
GIO ,DVGIO,CHGIO;
UNSIGNED CHAR MCHGIO, MDVGIO;
VOID DIV_BCD_GIO (INT TAMGIO)
{
CHGIO
=
TAMGIO/10;
DVGIO
=
TAMGIO%10;
MCHGIO
=
MALED7DOAN[CHGIO];
MDVGIO
=
MALED7DOAN[DVGIO];
}
VOID DIV_BCD_PHUT (INT TAMP)
{
CHPHUT
=
TAMP/10;
DVPHUT
=
TAMP%10;
68
MCHPHUT
MDVPHUT
=
=
Nguyen nh Phu
MALED7DOAN[CHPHUT];
MALED7DOAN[DVPHUT];
}
VOID DIV_BCD_GIAY (INT TAMG)
{
CHGIAY
=
TAMG/10;
DVGIAY
=
TAMG%10;
MCHGIAY =
MALED7DOAN[CHGIAY];
MDVGIAY =
MALED7DOAN[DVGIAY];
}
VOID HIENTHI()
{
FOR (I=0; I<2;I++)
{
OUTPUT_B(MDVGIAY); OUTPUT_D(0B11111110);
OUTPUT_B(MCHGIAY); OUTPUT_D(0B11111101);
DELAY_MS(1);
DELAY_MS(1);
OUTPUT_B(MDVPHUT);
OUTPUT_B(MCHPHUT);
OUTPUT_D(0B11110111);
OUTPUT_D(0B11101111);
DELAY_MS(1);
DELAY_MS(1);
OUTPUT_B(MDVGIO);
OUTPUT_B(MCHGIO);
OUTPUT_D(0B10111111);
OUTPUT_D(0B01111111);
DELAY_MS(1);
DELAY_MS(1);
}
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
WHILE(1)
{
FOR(GIO=0;GIO<24;GIO++)
{
FOR (PHUT=0;PHUT<60;PHUT++)
{
FOR (GIAY=0; GIAY <60; GIAY ++)
{
DIV_BCD_GIO(GIO);
DIV_BCD_PHUT(PHUT);
DIV_BCD_GIAY(GIAY);
HIENTHI();
}
}
}
}
}
BI 5-14: TIMER0 M XUNG NGOI COUNTER0 T 000 N 255
HIN TH TRN 3 LED QUET
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
0x90};
INT
DEM, TRAM, CHUC, DONVI;
UNSIGNED CHAR MTRAM, MCHUC, MDONVI;
Bai 5: Timer/counter cua PIC va lap trnh C.
69
Nguyen nh Phu
MTRAM = MALED7DOAN[TRAM];
MCHUC = MALED7DOAN[CHUC];
MDONVI= MALED7DOAN[DONVI];
IF (TRAM == 0)
{
MTRAM=0XFF;
IF (CHUC == 0)
{ MCHUC=0XFF;
}
}
VOID DISPLAY ()
{
OUTPUT_B(MDONVI);
DELAY_MS(1);
// XOA SO 0 VO NGHIA
OUTPUT_LOW(PIN_D0);
OUTPUT_HIGH(PIN_D0);
OUTPUT_B(MCHUC);
DELAY_MS(1);
OUTPUT_LOW(PIN_D1);
OUTPUT_HIGH(PIN_D1);
OUTPUT_B(MTRAM);
DELAY_MS(1);
OUTPUT_LOW(PIN_D2);
OUTPUT_HIGH(PIN_D2);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
OUTPUT_D(0XFF);
SETUP_TIMER_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);// KHOITAOTIMER
SET_TIMER0(0);
// GIA TRI BAT DAU
WHILE(1)
{
DEM=GET_TIMER0();
DIV_DECODE(DEM);
DISPLAY();
}
}
BI 5-15: TIMER0 M S VNG QUAY 4 XUNG L 1 VNG COUNTER0 T 000 N 255
HIN TH TRN 3 LED QUET
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT
DEM, TRAM, CHUC, DONVI;
UNSIGNED CHAR MTRAM, MCHUC, MDONVI;
VOID DIV_DECODE (INT TAM)
{
TRAM = TAM/100;
TAM = TAM %100;
CHUC = TAM/10;
DONVI= TAM %10;
70
Nguyen nh Phu
MTRAM = MALED7DOAN[TRAM];
MCHUC = MALED7DOAN[CHUC];
MDONVI= MALED7DOAN[DONVI];
IF (TRAM == 0)
{
MTRAM=0XFF;
IF (CHUC == 0 )
{ MCHUC=0XFF;
}
}
}
VOID DISPLAY ()
{
OUTPUT_B(MDONVI);
DELAY_MS(1);
// XOA SO 0 VO NGHIA
OUTPUT_LOW(PIN_D0);
OUTPUT_HIGH(PIN_D0);
OUTPUT_B(MCHUC);
DELAY_MS(1);
OUTPUT_LOW(PIN_D1);
OUTPUT_HIGH(PIN_D1);
OUTPUT_B(MTRAM);
DELAY_MS(1);
OUTPUT_LOW(PIN_D2);
OUTPUT_HIGH(PIN_D2);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
//PORTB OUT
SET_TRIS_D(0x00);
// PORTD OUT
OUTPUT_D(0XFF);
SETUP_TIMER_0(RTCC_EXT_H_TO_L | RTCC_DIV_4);// KHOITAOTIMER
SET_TIMER0(0);
// GIA TRI BAT DAU
WHILE(1)
{
DEM=GET_TIMER0();
DIV_DECODE(DEM);
DISPLAY();
}
}
BI 5-16: TIMER0 M 0 N 100 HIN TH TRN 3 LED QUET
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT
DEM, TRAM, CHUC, DONVI;
UNSIGNED CHAR MTRAM, MCHUC, MDONVI;
VOID DIV_DECODE (INT TAM)
{
TRAM = TAM/100;
TAM = TAM %100;
CHUC = TAM/10;
DONVI= TAM %10;
MTRAM = MALED7DOAN[TRAM];
MCHUC = MALED7DOAN[CHUC];
MDONVI= MALED7DOAN[DONVI];
Bai 5: Timer/counter cua PIC va lap trnh C.
71
IF (TRAM == 0)
{
MTRAM=0XFF;
IF (CHUC == 0 )
{ MCHUC=0XFF;
}
}
}
VOID DISPLAY ()
{
OUTPUT_B(MDONVI);
DELAY_MS(1);
Nguyen nh Phu
// XOA SO 0 VO NGHIA
OUTPUT_LOW(PIN_D0);
OUTPUT_HIGH(PIN_D0);
OUTPUT_B(MCHUC);
DELAY_MS(1);
OUTPUT_LOW(PIN_D1);
OUTPUT_HIGH(PIN_D1);
OUTPUT_B(MTRAM);
DELAY_MS(1);
OUTPUT_LOW(PIN_D2);
OUTPUT_HIGH(PIN_D2);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
//PORTB OUT
SET_TRIS_D(0x00);
// PORTD OUT
OUTPUT_D(0XFF);
SETUP_TIMER_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);// KHOITAOTIMER
SET_TIMER0(0);
// GIA TRI BAT DAU
WHILE(1)
{
DEM=GET_TIMER0();
IF (DEM==101)
{SET_TIMER0(1);
}
DIV_DECODE(DEM);
DISPLAY();
}
}
THAY DOI
VOID MAIN()
{
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
//PORTB OUT
// PORTD OUT
SETUP_COUNTERS(RTCC_EXT_L_TO_H,WDT_18MS);// KHOITAOTIMER
SET_TIMER0(0);
// GIA TRI BAT DAU
WHILE(1)
{
DEM=GET_TIMER0();
DIV_DECODE(DEM);
DISPLAY();
}
}
BI 5-17: TIMER0 M XUNG NGOI COUNTER0 T 000 N 255 V XA S 0 V NGHA
#INCLUDE <16F877A.H>
72
Nguyen nh Phu
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT
UNSIGNED CHAR
MTRAM = MALED7DOAN[TRAM];
MCHUC = MALED7DOAN[CHUC];
MDONVI= MALED7DOAN[DONVI];
IF (TRAM == 0)
{
MTRAM=0XFF;
IF (CHUC == 0 )
{ MCHUC=0XFF;
}
}
}
VOID DISPLAY ()
{
OUTPUT_B(MDONVI);
DELAY_MS(1);
OUTPUT_LOW(PIN_D0);
OUTPUT_HIGH(PIN_D0);
OUTPUT_B(MCHUC);
DELAY_MS(1);
OUTPUT_LOW(PIN_D1);
OUTPUT_HIGH(PIN_D1);
OUTPUT_B(MTRAM);
DELAY_MS(1);
OUTPUT_LOW(PIN_D2);
OUTPUT_HIGH(PIN_D2);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
//PORTB OUT
SET_TRIS_D(0x00);
// PORTD OUT
SET_TRIS_C(0x00);
SETUP_COUNTERS(RTCC_EXT_L_TO_H,WDT_18MS);// KHOITAOTIMER
SET_TIMER0(0);
// GIA TRI BAT DAU
WHILE(1)
{
DEM=GET_TIMER0();
DIV_DECODE(DEM);
FOR (I=0;I<20;I++)
{
DISPLAY();
}
}
}
BI 5-18: TIMER1 M XUNG NGOI COUNTER T 00000 N 65535 V XA S 0 V
NGHA
#INCLUDE <16F877A.H>
Bai 5: Timer/counter cua PIC va lap trnh C.
73
Nguyen nh Phu
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
CONST UNSIGNED CHAR
MALED7DOAN[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90};
INT16 DEM;
INT
UNSIGNED CHAR
OUTPUT_LOW(PIN_D1);
OUTPUT_HIGH(PIN_D1);
OUTPUT_B(MTRAM);
DELAY_MS(1);
OUTPUT_LOW(PIN_D2);
OUTPUT_HIGH(PIN_D2);
OUTPUT_B(MNGAN);
DELAY_MS(1);
OUTPUT_LOW(PIN_D3);
OUTPUT_HIGH(PIN_D3);
OUTPUT_B(MCNGAN);
DELAY_MS(1);
OUTPUT_LOW(PIN_D4);
OUTPUT_HIGH(PIN_D4);
}
VOID MAIN()
{
SET_TRIS_B(0x00);
74
//PORTB OUT
Bai 5: Timer/counter cua PIC va lap trnh C.
Nguyen nh Phu
SET_TRIS_D(0x00);
//PORTD OUT
SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1);
// KHOITAOTIMER
SET_TIMER1(0);
// GIA TRI BAT DAU
WHILE(1)
{
DEM=GET_TIMER1();
DIV_DECODE(DEM);
DISPLAY();
}
}
NG D NG M XUNG N I - NH TH I
3.
BI 5-19 IU KHIN LED CHP TT THEO THI GIAN DNG TIMER1 M XUNG NI
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=16M)
INT16 DEM;
VOID MAIN()
{ SET_TRIS_A(0x00);
//PORTB OUT
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8); // KHOITAOTIMER
SET_TIMER1(0);
// GIA TRI BAT DAU
WHILE(1)
{ DEM=GET_TIMER1();
IF (DEM <35000)
OUTPUT_A(0X00);
ELSE
OUTPUT_A(0XFF);
}
}
BI 5-20: IU KHIN LED CHP TT THEO THI GIAN DNG TIMER1 M XUNG NI
DNG PHNG PHP KIM TRA C TRN TIMER1
#INCLUDE <16F877A.H>
#include <DEF_16F877A.h>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=16M)
INT16 DEM;
VOID MAIN()
{ SET_TRIS_A(0x00);
//PORTB OUT
DEM=0X0;
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8); // KHOITAOTIMER
SET_TIMER1(0);
// GIA TRI BAT DAU
75
Nguyen nh Phu
WHILE(1)
{ IF (tmr1if==1)
{
OUTPUT_A(DEM); DEM=0XFF-DEM;
tmr1if=0;
}
}
}
BI 5-21: IU KHIN LED CHP TT THEO THI GIAN DNG TIMER1 M XUNG NI
S DNG NGT TIMER1
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
INT16 DEM;
#int_timer1
void interrupt_timer1()
{
OUTPUT_TOGGLE(PIN_A0);
}
VOID MAIN()
{
SET_TRIS_A(0x00);
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8); // KHOITAOTIMER
SET_TIMER1(0);
// GIA TRI BAT DAU
enable_interrupts(GLOBAL);
enable_interrupts(int_timer1);
WHILE(1)
{
}
}
BI 5-22 IU KHIN LED CHP TT THEO THI GIAN DNG TIMER1 M XUNG NI
DNG NGT NH THI 100MS
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000)
INT16 DEM;
#int_timer1
void interrupt_timer1()
{
OUTPUT_TOGGLE(PIN_A0); SET_TIMER1(15536);
}
VOID MAIN()
{
SET_TRIS_A(0x00);
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8); // KHOITAOTIMER
76
SET_TIMER1(15536);
enable_interrupts(GLOBAL);
enable_interrupts(int_timer1);
WHILE(1)
{
}
Nguyen nh Phu
}
BI 5-23: IU KHIN LED CHP TT THEO THI GIAN DNG TIMER1 M XUNG NI
DNG NGT NH THI 1S
#INCLUDE <16F877A.H>
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=16M)
INT DEM;
#int_timer1
void interrupt_timer1()
{ DEM++;
SET_TIMER1(15536);
IF (DEM==10)
{ DEM=0;
OUTPUT_TOGGLE(PIN_A0);}
}
VOID MAIN()
{
SET_TRIS_A(0x00);
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8); // KHOITAOTIMER
SET_TIMER1(15536);
// GIA TRI BAT DAU
enable_interrupts(GLOBAL);
enable_interrupts(int_timer1);
DEM=0;
WHILE(1)
{
}
}
V.
+
+=
&=
&
&
^=
^
l=
CC TON T
Addition Operator
Addition assignment operator, x+=y,
is the same as x=x+y
Bitwise and assignment operator,
x&=y, is the same as x=x&y
Address operator
Bitwise and operator
Bitwise exclusive or assignment
operator, x^=y, is the same as x=x^y
Bitwise exclusive or operator
Bitwise inclusive or assignment
77
l
?:
-/=
/
==
>
>=
++
*
!=
<<=
<
<<
<=
&&
!
ll
%=
%
*=
*
~
>>=
>>
->
-=
sizeof
VI.
Nguyen nh Phu
FIL DEVICE
Nguyen nh Phu
//
PORT_x_PULLUPS(), INPUT(),
//
OUTPUT_LOW(), OUTPUT_HIGH(),
//
OUTPUT_FLOAT(), OUTPUT_BIT()
// Constants used to identify pins in the above are:
#define PIN_A0
#define PIN_A1
#define PIN_A2
#define PIN_A3
#define PIN_A4
#define PIN_A5
40
41
42
43
44
45
#define PIN_B0
#define PIN_B1
#define PIN_B2
#define PIN_B3
#define PIN_B4
#define PIN_B5
#define PIN_B6
#define PIN_B7
48
49
50
51
52
53
54
55
#define PIN_C0
#define PIN_C1
#define PIN_C2
#define PIN_C3
#define PIN_C4
#define PIN_C5
#define PIN_C6
#define PIN_C7
56
57
58
59
60
61
62
63
#define PIN_D0
#define PIN_D1
#define PIN_D2
#define PIN_D3
#define PIN_D4
#define PIN_D5
#define PIN_D6
#define PIN_D7
64
65
66
67
68
69
70
71
#define PIN_E0 72
#define PIN_E1 73
#define PIN_E2 74
////////////////////////////////////////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1
#define BYTE int
#define BOOLEAN short int
#define getc getch
#define fgetc getch
#define getchar getch
#define putc putchar
#define fputc putchar
#define fgets gets
Bai 5: Timer/counter cua PIC va lap trnh C.
79
Nguyen nh Phu
////////////////////////////////////////////////////////////////// Timer 0
// Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(),
//
SET_TIMER0() or SET_RTCC(),
//
GET_TIMER0() or GET_RTCC()
// Constants used for SETUP_TIMER_0() are:
#define RTCC_INTERNAL 0
#define RTCC_EXT_L_TO_H 32
#define RTCC_EXT_H_TO_L 48
#define RTCC_DIV_1
#define RTCC_DIV_2
#define RTCC_DIV_4
#define RTCC_DIV_8
#define RTCC_DIV_16
#define RTCC_DIV_32
#define RTCC_DIV_64
#define RTCC_DIV_128
#define RTCC_DIV_256
8
0
1
2
3
4
5
6
7
#define RTCC_8_BIT
Nguyen nh Phu
#define T1_DISABLED
0
#define T1_INTERNAL
0x85
#define T1_EXTERNAL
0x87
#define T1_EXTERNAL_SYNC 0x83
#define T1_CLK_OUT
#define T1_DIV_BY_1
#define T1_DIV_BY_2
#define T1_DIV_BY_4
#define T1_DIV_BY_8
0
0x10
0x20
0x30
////////////////////////////////////////////////////////////////// Timer 2
// Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2
// Constants used for SETUP_TIMER_2() are:
#define T2_DISABLED
0
#define T2_DIV_BY_1
4
#define T2_DIV_BY_4
5
#define T2_DIV_BY_16
6
////////////////////////////////////////////////////////////////// CCP
// CCP Functions: SETUP_CCPx, SET_PWMx_DUTY
// CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH
// Constants used for SETUP_CCPx() are:
#define CCP_OFF
0
#define CCP_CAPTURE_FE
4
#define CCP_CAPTURE_RE
5
#define CCP_CAPTURE_DIV_4
6
#define CCP_CAPTURE_DIV_16
7
#define CCP_COMPARE_SET_ON_MATCH
8
#define CCP_COMPARE_CLR_ON_MATCH
9
#define CCP_COMPARE_INT
0xA
#define CCP_COMPARE_RESET_TIMER
0xB
#define CCP_PWM
0xC
#define CCP_PWM_PLUS_1
0x1c
#define CCP_PWM_PLUS_2
0x2c
#define CCP_PWM_PLUS_3
0x3c
long CCP_1;
#byte CCP_1 =
0x15
#byte CCP_1_LOW=
0x15
#byte CCP_1_HIGH=
0x16
long CCP_2;
#byte CCP_2 =
0x1B
#byte CCP_2_LOW=
0x1B
#byte CCP_2_HIGH=
0x1C
////////////////////////////////////////////////////////////////// PSP
// PSP Functions: SETUP_PSP, PSP_INPUT_FULL(), PSP_OUTPUT_FULL(),
//
PSP_OVERFLOW(), INPUT_D(), OUTPUT_D()
// PSP Variables: PSP_DATA
// Constants used in SETUP_PSP() are:
#define PSP_ENABLED
0x10
#define PSP_DISABLED
0
#byte PSP_DATA=
////////////////////////////////////////////////////////////////// SPI
Bai 5: Timer/counter cua PIC va lap trnh C.
81
Nguyen nh Phu
////////////////////////////////////////////////////////////////// ADC
// ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
//
SET_ADC_CHANNEL(), READ_ADC()
// Constants used for SETUP_ADC() are:
#define ADC_OFF
0
// ADC Off
#define ADC_CLOCK_DIV_2 0x10000
#define ADC_CLOCK_DIV_4 0x4000
#define ADC_CLOCK_DIV_8 0x0040
#define ADC_CLOCK_DIV_16 0x4040
#define ADC_CLOCK_DIV_32 0x0080
82
Nguyen nh Phu
// Internal 2-6us
////////////////////////////////////////////////////////////////// INT
// Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(),
//
EXT_INT_EDGE()
//
// Constants used in EXT_INT_EDGE() are:
#define L_TO_H
0x40
#define H_TO_L
0
// Constants used in ENABLE/DISABLE_INTERRUPTS() are:
#define GLOBAL
0x0BC0
#define INT_RTCC
0x0B20
#define INT_RB
0xFF0B08
#define INT_EXT
0x0B10
#define INT_AD
0x8C40
#define INT_TBE
0x8C10
Bai 5: Timer/counter cua PIC va lap trnh C.
83
#define INT_RDA
#define INT_TIMER1
#define INT_TIMER2
#define INT_CCP1
#define INT_CCP2
#define INT_SSP
#define INT_PSP
#define INT_BUSCOL
#define INT_EEPROM
#define INT_TIMER0
#define INT_COMP
84
Nguyen nh Phu
0x8C20
0x8C01
0x8C02
0x8C04
0x8D01
0x8C08
0x8C80
0x8D08
0x8D10
0x0B20
0x8D40