You are on page 1of 12

http://www.picvietnam.com/forum/showthread.php?

t=357
Ch ng trnh ny lm nh p nhy con led Code:
#include<16F877A.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) main() { while(true) { output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0); delay_ms(1000); } }

chn RB0 1s sng, 1s t t.

Trn y: Code:
#include<16F877A.h>

Khai bo con PIC b n s d ng, file ny ch ng trnh vi t s n nh m khai bo cc bit, thanh ghi quan tr ng trong con pic ny.Cc b n c th vo th m c ci t C:\Program Files\PICC\Devices\16F877A.h xem n khai bo c nh ng g trong ! Code:
#fuses NOWDT,PUT,HS,NOPROTECT

Thi t l p cc config Code:


#use delay(clock=10000000)

Khai bo t n s dao Code:

ng c p cho PIC

output_high(PIN_B0)

Xu t ra chn RB0 m c logic 1 (t c 5V), do khi th c hi n hm ny bao hm lun vi c tc ng ln thanh ghi TRISB (dng ch n chn I/O) do v y ta khng c n vi t l nh ch n chn I/O n a. Code:
output_low(PIN_B0)

Ng c l i Code:
delay_ms(1000)

T o tr kho ng th i gian theo mili giy l 1000 (t c 1s) Ch hm ny ch c tc d ng khi c khai bo t n s dao

ng c p cho PIC

Delay 1s portB c.. c.. ang post th b cp i n,b c c mnh... V y l cu tr l i cho vi c delay led Code:
#include<16F877A.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) #use fast_io(b) #byte portb=0x6 main() { while(true) { set_tris_b(0); portb=255; //all led on delay_ms(1000); portb=0; //all led off delay_ms(1000); } }

portB 1s

Code:
#byte portb=0x6

Khai bo a ch portB, khng nh trong MPLAB nh ngh a lun ci ny cho ta, n u khng c dng ny ch ng trnh s bo l i ch a nh ngh a portB Code:
set_tris_b(0)

T t c cc chn c a portB l output, mu n set t t c cc chn l input th trong ngo c l 255,.... Trong HELP h ng d n l nh ny nh sau: "These functions allow the I/O port direction (TRI-State) registers to be set. This must be used with FAST_IO and when I/O ports are accessed as memory such as when a #BYTE directive is used to access an I/O port. Using the default standard I/O the built in functions set the I/O direction automatically." R rng khi set byte lm I/O n u ta thm khai bo: Code:
#use fast_io(b)

Dng khai bo ny th CCS s ch th c hi n ng m t l nh cho vi c I/O cc chn trn port t ng, n u ko n ph i m t kho ng 3 hay 4 l nh g .

ng

Ph n I/O + Delay t m th i xong nh v y, bc no c ph n h i th ti p t c th o lu n.Xong ph n ny c th vi t v xu t led 7 o n, qut phm, LCD,....Bc no vi t th c post ln cho b con th o lu n nh ! H n g p l i vi hm n a bi Timer/Counter ! Cho!

File Km Theo Delay 1s portB.rar (12.5 KB, 2078 l n t i)

tui d t ti ng anh qu, m i ng #FUSES NOWDT #FUSES XT #FUSES NOPUT #FUSES NOPROTECT #FUSES BROWNOUT #FUSES LVP #FUSES NOCPD #FUSES NOWRT #FUSES NODEBUG y l nh ng tn vi t t t .h). Ti khng d ch (v nh ng t

i c th d ch nh ng t d

i ra ti ng vi t

c ko? thanhk!

c nh ngh a s n b i trnh bin d ch (th l vi t t t) m s gi i thch:

ng thng qua t p tin include

NOWDT - Khng dng watchdog timer (ci ny khng nn d ch ra) XT - Dng m c XT (m c cng su t trung bnh) cho b dao ng v i th ch anh ngoi NOPUT - Khng dng power up timer (lm tr khi b t ngu n) NOPROTECT - Khng b o v code (khng c m c n i dung flash) BROWNOUT - Dng ch c n ng b o v ch ng th p p LVP - Cho php ch n p ch ng trnh i n p th p NOCPD - Khng b o v EEPROM d li u (khng c m c n i dung EEPROM) NOWRT - Khng c m ghi vo flash NODEBUG - Khng dnh ring cc chn RB6 v RB7 cho debug

y l 1 v d nh v ADC,chn RA0 l y tn hi u Analog t bi n tr v xu t gi tr s bi n i t ng ng qua tm led n i portB Code:


#include <16F877.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=8 #use delay(clock=10000000) Int8 adc; main() { setup_adc(adc_clock_internal); setup_adc_ports(AN0); set_adc_channel(0); delay_ms(10); while(true) { adc=read_adc(); output_B(adc); } }

Timer Hi....! Trong Pic16f877a c 3 timer : + Timer0 : 8 bit + Timer1 : 16 bit + Timer2 : 8 bit Timer dng cho nhi u ng d ng : 1.Timer0 Thanh ghi tc Cc l nh: Code:
setup_TIMER_0(mode); setup_COUNTERS (rtcc_state, ps_state); // hay setup_WDT() set_TIMER0(value); // hay set_RTCC(value) :xc nh gi tr ban u (8bit) cho Timer0 get_TIMER0(); // hay get_RTCC() :tr v s nguyn (8bit) c a Timer0

nh th i, capture, pwm, ...

ng:

Trong mode l m t ho c hai constant (n u dng hai th chn d u "|" gi a) trong file 16F877A.h g m :

nh ngh a

RTCC_INTERNAL : ch n xung clock n i RTCC_EXT_L_TO_H : ch n bit c nh ln trn chn RA4 RTCC_EXT_H_TO_L : ch n bit c nh xu ng trn chn RA4 RTCC_DIV_2 :chia prescaler 1:2 RTCC_DIV_4 1:4 RTCC_DIV_8 1:8 RTCC_DIV_16 1:16 RTCC_DIV_32 1:32 RTCC_DIV_64 1:64 RTCC_DIV_128 1:128 RTCC_DIV_256 1:256 rtcc_state l m t trong nh ng constant sau: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L ps_state l m t trong nh ng constant sau: RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256 WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS Mnh c ng ch a hi u ngh a c a hm WDT_..., ko bi t c ph i khai bo nh trn th sau kho ng th i gian ms bao nhiu 2.Timer1 Thanh ghi tc ng: t sau WDT_ th s reset l i Pic ?????

Cc l nh: Code:
setup_TIMER_1(mode); set_TIMER1(value); get_TIMER1(); // xc nh gi tr ban u (16bit) cho Timer1 // tr v s nguyn (16bit) c a Timer1

mode g m (c th k t h p b ng d u "|"): T1_DISABLED : t t Timer1 T1_INTERNAL : xung clock n i (Fosc/4) T1_EXTERNAL : xung clock ngoi trn chn RC0 T1_EXTERNAL_SYNC : xung clock ngoi ng b T1_CLK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8 3.Timer2 Thanh ghi tc Cc l nh: Code:
setup_TIMER_2(mode, period, postscale); set_TIMER2(value); // xc nh gi tr ban u (8bit) cho Timer2 get_TIMER2(); // tr v s nguyn 8bit

ng:

V i mode g m (co the ket hop bang dau "|"): T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period l s nguyn t 0-255, xc nh gi tr xung reset postscale l s nguyn 1-16, xc nh reset bao nhiu l n tr c khi ng t.

Timer ! Help ! Cc bc c th ch r h n v timer ko? v d nh khi no timer s trn( reset ) . gi ng nh 8051( la TF =0)

V mu n nh kh an th i gian m cho timer ph i lm sao? V d nh : t o m t xung vung v i t n s 1Hx, cch tnh th i gian set timer nh th no ? gi tr n p cho timer l bao nhiu ? Cn timer 16 bit .. sau khi reset c c n ph i n p l i gia tr ban u ko?( gi ng nh 8051 v y ..).. Ai c the so sanh gi a 8051 va 16f877 k? Mong cc bc gip s m em mau bi t r h n ... Cam n cc bc !
Theo mnh th b n c n xem l i datasheet c a 16F877A T Trang 47-60. M nh th y n ni kh r m.

Intterupt INTERRUPT Cc l nh dng cho ng t: Code:


enable_interrupts(level); disable_interrupts(level); ext_int_edge(edge); //cho php ng t ki u level //c m ng t ki u level // ch n cch l y xung lo i edge

level bao g m: GLOBAL : ng t ton c c INT_RTCC : trn TMR0 INT_RB : c thay i tr ng thi m t trong cc chn RB4 INT_EXT : ng t ngoi INT_AD : chuy n i AD hon t t INT_TBE : b m chuy n RS232 tr ng INT_RDA : data nh n t RS232 s n sng INT_TIMER1 : trn TMR1 INT_TIMER2 : trn TMR2 INT_CCP1 : c capture hay compare trn CCP1 INT_CCP2 : c capture hay compare trn CCP2 INT_SSP : c ho t ng SPI hay I2C INT_PSP : c data vo c ng parallel slave INT_BUSCOL : xung t bus INT_EEPROM : ghi vo eeprom hon t t INT_TIMER0 : trn TMR0 INT_COMP : ki m tra b ng nhau comparator edge bao g m: L_TO_H : c nh ln

n RB7

H_TO_L : c nh xu ng Sau khai bo trn #INT_......... V d vo th c thi ng t ngoi, ta c o n code: Code:


#INT_EXT void ngat_ngoai() { //Ch ng trnh ng t t i }

vo o n ch

ng trnh ng t, khai bo:

cc cao th vui lng vi t 1 v d c th v ng t ngoi c khng??????? Em th vi t nh ng khng ch y c. Ch ng trnh c a em dng ng t ngoi RB_0 v hi n th ln port_C #include <16F877A.h> #byte portb = 0x06 #byte portc = 0x07 #use delay (clock = 20000000) int count=1; #INT_EXT void EXT_LED() { portc=count; count=count+1; delay_us(100); bit_clear(portb,0); } void main() { ext_int_edge(L_TO_H); enable_interrupts(INT_EXT); enable_interrupts(global); set_tris_b(0xff); set_tris_c(0x00); portc=0; bit_set(portb,0); while(1) { } }

Ng t Timer0

y l ch ng trnh dng ng t Timer0 nh th 1s. u tin led chn RB0 sng, sau 1s s d ch sang tri, ngh a l led 1 trn chn RB1 sng , l n l t nh v y cho cc led trn portB v l p l i mi mi. Code:
#include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #byte PORTB = 0x06 int16 count; int8 a; //Chuong trinh ngat TMR0 #int_timer0 void interrupt_timer0() { set_timer0(6); ++count; if(count == 2000) // 2000*500us = 500000us = 1s { count=0; rotate_left(&a,1); } } //Chuong trinh chinh void main(void) { set_tris_b(0); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); enable_interrupts(global); set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us a = 0x01; while(true) { PORTB = a; } }

File Km Theo Interrupt_Timer0.rar (22.3 KB, 2068 l n t i)


M t cch vi t khc tham kh o v i hy v ng vi t C sao cho d hi u :-)

#include <16F877A.h> #fuses NOWDT, PUT, XT, NOPROTECT #use delay(clock=4000000) #define INITIAL_VALUE 6 byte count;

byte led; void change_led(void); #int_timer0 void interrupt_timer0() { set_timer0(INITIAL_VALUE); count++; if (count == 2000) { count = 0; change_led(); } } void main() { set_tris_b(0); enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER0); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2); // set mod set_timer0(INITIAL_VALUE); // set initial value count = 0; led = 1; while (true) output_b(led); } void change_led() { led = led << 1; if (led == 0) led = 1; }

Cho h i t Em m i v thi, huynh gi i thch m y dng code sau cho em " set_timer0(6) " ; " ++count; " ; "if (count==2000) " c ko ?

N n m trong ct nhy led dng interrup v timer0. bi n count v a c tc d ng g ? t i sao ph i li a "a=a<<1" ?

#include<18F4450.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=20000000) #use fast_io(b) #byte portb=0x6 #define led pin_B0 int8 a; void ngat() { delay_ms(1000); a=a<<1; // dich trai a 1bit if(a==256) a=1; } main() { a=1; set_tris_b(0); while(true) { ngat(); output_b(a); } } Cch ny th PIC18F4550 c ng d ch leds v t . Nh ng m mu n dng TIMER0 nh c a bc nhh . Khi mnh lm khng hi u t i sao l i khng th ch y. Nh bc ch gio gim nh! #include <18F4550.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=20000000) . Mnh s a l i code c a nhh nh v y ph h p v i PIC18F4550, nh ng khng hi u sao v n khng ch y c. B n c th h ng d n k h n v Interrup v Timer khng, c m on b n nhi u.

i code c a b n sai r i n u mu n s d ng c ng t th trong hm main b n ph i th c hi n cho php ng t timer_0 v ng t ton c c (global) ho t ng, nh xung nh p cho timer, v hm ng t() ph i c t ngay bn d i ch th #int_timer0 trnh d ch c th hi u c y l hm ph c v ng t, hm ng t() ny b n khng th g i n gi ng nh m t hm thng th ng u c m n ch c my g i n khi c xu t hi n c trn timer_0, m khi s d ng ng t timer (t c ng t nh th i) th b n khng nn dng delay trong n (r t d ),v ng t timer c t o ra thay th hon h o cho delay, code c a b n mnh s a nh sau :

#include<18F4450.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=4000000) int16 count=0; int8 a=1; #int_timer0 void ngat(){ ++count; if(count==2000) {count=0;a=a<<1;} // dich trai a 1bit if(a==256) {a=1;count=0; }} void main(){ enable_interrupts(global); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //xung timer = xung my/2 while(true) { output_b(a); }} nh v y hm trn ta s th y sau m i l n trn ng t timer_0 (sau hai xung my) bi n m count s t ng ln 1 n v v c th cho n khi t gi tr 2000 ( y l gi tr m b n c n ph i tnh ch n ng th i gian c n lm lm tr ) khi bi n a s u c d ch bit sang tri,....r i ti p t c... ch c khc ny b n hi u r i h.

You might also like