You are on page 1of 32

NG DNG B KIT 16F877A

1. CHC NNG C BN CA B KIT: 1.1.Khi x l trung tm :

PIC 16F877A: - Giao tip vi 8255 v LCD thng qua PORT D - Cho php LED7x4 qua ALED (3:0) ( RB4:RB1) - RA2:RA0 s dng lm chn ADC - Kt ni vi b m thi gian thc DS1307 v b nh ngoi 24C64 - Ngoi ra cn c cng np, iu khin ng c, giao tip RS232 v RS485 8255: - iu khin gi tr hin th ln LED7x4 qua PORT B - Kt ni vi keypad 4x4 qua PORT C

1.2. Khi giao tip USB : S dng PIC 18F4550 c tch hp sn giao tip USB Flash 2.0

2. Giao tip qua 8255: 2.1.Gii thiu v 8255 : - C 3 cng ( 8 bit ) truy cp ring bit : A, B v C u c th c lp trnh l u ra hay u vo - Ring Port C c kh nng lp trnh theo na byte cao v na byte thy hoc lp trnh trn tng bit - Port D ng chuyn d liu gia 8255 v PIC - RD v WR l 2 tn hiu iu khin tch cc thp - RESET c tch cc mc cao, dng xa thanh ghi iu khin - A0, A1 la chn cng ring bit, CS tch cc mc thp cho php 8255 lm vic
CS 0 0 0 0 1 A1 0 0 1 1 x A0 0 1 0 1 X Chn cng Cng A Cng B Cng C Thanh ghi iu khin ( W ) 8255 ko c chn

2.2.Chn ch 8255 : - Mode 0 : y l ch vo ra n gin, cc cng A,B,C c th c lp trnh nh u vo hoc u ra, khng iu khin theo tng bit ( y l ch ph bin nht v c cp n trong phn ny ) - Mode 1 : cc cng A,B c th c lp trnh nh u vo hoc u ra vi kh nng bt tay, tn hiu bt tay c cp bi cc bit cng C - Mode 2 : cng A c s dng nh cng vo ra 2 chiu vi kh nng bt tay v tn hiu bt tay cp bi cc bit cng C. Cng B c dng nh ch vo ra n gin hoc ch bt tay mode 1 - BSR : cc bit ring r cng C c th lp trnh Lp trnh ch vo ra n gin : - Ch ny do thanh ghi iu khin quyt nh
D7 1 = I/O mode 0 = BSR D6 D5 00 = mode 0 01 = mode 1 10 = mode 2 D4 Port A 1 = input 0 = output D3 Port CH 1 = input 0 = output D2 D1 0 = mode Port B 0 1 = input 0 = output D0 Port CL 1 = input 0 = output

- Da vo bng trn, ta c th chn ch vo ra mong mun Chc nng v ghp ni 8255 vi PIC 16F877A : - Chc nng : hin th LED thng qua port B, kt ni vi keypad 4x4 thng qua port C - Ghp ni vi PIC 16F877A : PORT D ca PIC truyn nhn d liu vi 8255 qua PORT ca 8255 RE2 ni vi chn CS ca 8255 c nhim v cho php 8255 lm vic RE1 ni vi WR v RE0 ni vi RD RA4 ni vi A0, RA5 ni vi A1 c nhim v chn port
//8255 Procedure void ppiInit(void); void switch_port(char ch); void ppiWrite(unsigned char data, unsigned char ch); unsigned char ppiRead(unsigned char ch); void ppiInit(void) // khoi tao che do cua 8255 { ppiWrite(0x89,'W'); // PA, PB are Outputs, PC is Inputs } void switch_port(char ch) { switch(ch) { case 'A': A0 = 0; A1 = 0; break; case 'B': A0 = 1; A1 = 0; break; // chon port

// PortA

//PortB

case 'C': A0 = 0; A1 = 1; break; case 'W': A0 = 1; A1 = 1; break; } }

// PortC

// control register

void ppiWrite(unsigned char data, char ch) { TRISD = 0; RD = 1; enLCD = 0; ppiEn = 0; switch_port(ch); PORTD = data; Wr = 0; Wr = 1; en8255 = 1; TRISD = 0xff; } unsigned char ppiRead(char ch) { unsigned char data; TRISD = 0xff; WR = 1; enLCD = 0; ppiEn = 0; switch_port(ch); RD = 0; RD = 1; data = PORTD; ppiEn = 1; return data; }

// ghi du lieu // port D cua PIC lam output // khong cho phep read // cho phep 8255 lam viec // chon port // ghi data vao port D // cho phep write // khong cho phep write // khong cho phep 8255 lam viec // port D lam input

// doc du lieu

// port D la input

// luu gia tri doc duoc vao port D

3. Mt s chng trnh v d : 3.1.iu khin LED Cc linh kin s dng : PIC 16F877A, 8255, LED7x4( LS401 ) Gii thiu v LED7x4

ALED 03 cho php 4 LED hot ng, tch cc mc thp PB 07 iu khin 7 thanh trong b LED Yu cu : Hin th hng nghn, hng trm, hng chc v hng n v : 1. Yu cu ghi d liu vo 8255, t PORT B ca 8255, iu khin LED hin th hng nghn, trm, chc, n v. 2. Cc hm con cn thit :
unsigned char data, buffer; //Chuong trinh chuyen doi sang ma led 7 thanh unsigned char convert_led7s(unsigned char val) { unsigned char buffer; switch(val) { case 0: buffer = 0b11101011; break; case 1: buffer = 0b00101000; break; case 2: buffer = 0b10110011; break; case 3: buffer = 0b10111010; break; case 4: buffer = 0b01111000; break; case 5: buffer = 0b11011010; break; case 6: buffer = 0b11011011; break; case 7: buffer = 0b10101000; break; case 8: buffer = 0b11111011; break; case 9: buffer = 0b11111010; break;

//hien //hien //hien //hien //hien //hien //hien //hien //hien //hien

thi thi thi thi thi thi thi thi thi thi

so so so so so so so so so so

0 1 2 3 4 5 6 7 8 9

case '#':buffer= 0b00000000; break; default: buffer = 0b00000001; } return buffer; }

//khong hien thi

//chuong trinh hien thi gia tri hang nghin, hang tram, hang chuc v don vi len cac LED void dislay (unsigned int data) { unsigned char nghin,tram,chuc,dv; unsigned char buffer; //tach cac thanh phan cua data nghin = (unsigned char)(data/1000); tram = (unsigned char)((data%1000)/100); chuc = (unsigned char)(((data%1000)%100)/10); dv = (unsigned char)(data%10); // quet led for (int index = 0; index < 4; index++ ) { switch ( index ) { case 0 : { ALED0 = ALED1= ALED2 = 1; ALED3 buffer = convert_led7s(dv); ppiWrite(buffer,B); break; } case 1 : { ALED1 = ALED0= ALED3 = 1; ALED2 buffer = convert_led7s(chuc); ppiWrite(buffer,B); break; } case 2 : { ALED0 = ALED3= ALED2 = 1; ALED1 buffer = convert_led7s(tram); ppiWrite(buffer,B); break; } case 3 : { ALED3 = ALED1= ALED2 = 1; ALED0 buffer = convert_led7s(nghin); ppiWrite(buffer,B); break; } } } }

= 0;

= 0;

= 0;

= 0;

3. V d minh ha :
#include <16F877a.h> #include <def_877a.h> #include <Kit16F877a.h> void main() { unsigned int i=0; TRISD=0; PORTD=0; while(1) { display i; i++; if(i==100) i=0; } }

Chng trnh trn hin th ln LED t 0 n 100 ri quay li v 0

3.2.Keypad 4x4 Cc linh kin s dng : PIC 16F877A, 8255, keypad 4x4 Gii thiu v Keypad 4x4 Keypad 4x4 gm 16 nt n c b tr dng ma trn 4x4. M hnh keypad c th hin nh sau:

Hot ng : gi s nt 2 c n, ng 2 v C c ni vi nhau. Xc nh nt c n bng phng php qut keypad : Qut hng 1 : A = 0, B = C = D = 1, kim tra chn 1, 2, 3, 4 thu c kt qu : 1 = 2 = 3 = 4 = 1 Qut hng 2 : B = 0, C = D = A = 1, kim tra chn 1, 2, 3, 4 thu c kt qu : 1 = 2 = 3 = 4 = 1 Qut hng 3 : C = 0, D = A = B = 1, kim tra chn 1, 2, 3, 4 thu c kt qu : 1 = 3 = 4 = 1, 2 = 0 Qut hng 4 : D = 0, A = B = C = 1, kim tra chn 1, 2, 3, 4 thu c kt qu : 1 = 2 = 3 = 4 = 1 Cc trng hp nhiu nt c nhn cng lc, ta cho ra cng 1 k t (khng chp nhn kt qu phm bm) Hot ng : gi tr phm bm s c ghi vo PORT C ca 8255, kt qu c a v PIC 16F877A x l hoc hin th ln LCD qua PORT D ca 8255
unsigned unsigned unsigned unsigned char char char char colScan(unsigned char row); keyFilter(unsigned char num, unsigned char channel); keyScan(void); freeHand(void);

unsigned char colScan(unsigned char row) { unsigned char buffer,buff,i = 255; switch(row) { case 0: ppiWrite(0xE0,'C'); break; case 1: ppiWrite(0xD0,'C'); break; case 2: ppiWrite(0xB0,'C'); break; case 3: ppiWrite(0x70,'C'); } buffer = ppiRead('C')&0x0F;

//quet cot cua 1 hang

//chon hang

//lay gia tri cot

//kiem tra hien tuong nhieu phim an lien tuc if(buffer!=0x0F) //neu co phim an { while(i--){} buff = ppiRead('C')&0x0F; if(buffer!=buff) buffer = 0xEE;//kiem tra nhieu phim an lien tuc } else buffer = 0xFF; return buffer; } unsigned char keyFilter(unsigned char num, unsigned char channel)// loc phim { unsigned char buffer; switch(num) { case 14: buffer = 1; break; case 13: buffer = 2; break; case 11: buffer = 3; break; case 7 : buffer = 4; break; default: buffer = 0xEE; } if(buffer!=0xEE) { buffer = buffer+channel*3; } return buffer; // gia tri that cua phim nhan } unsigned char keyScan(void { unsigned char buffer, buff, i, n; i = 0; while(i<4) { buffer = colScan(i); if(buffer!=0xff) { n = i; i = 5; } else i++; } //quet phim // khong phim nao duoc an

if(i==5) { i = n+1; while(i<4) { buff = colScan(i); if(buff!=0xff) { i = 5; buffer = 0xee; } else i++; } }

// khi co phim an // tiep tuc quet cac phim khac

//neu co phim khac duoc an //thoat vong lap

//luu lai gia tri phim an neu chi co 1 phim duoc an if((buffer!=0xff)&&(buffer!=0xee)) buffer = keyFilter(buffer,n); return buffer; } unsigned char freeHand(void) { ppiWrite(0x00,'C'); buffer = ppiRead('C')&0x0F; if(buffer==0x0F) return 1; else return 0; }

//tra gia tri 1 neu khong co phim an //tra gia tri 0 neu co phim an

V d minh ha :
#include <16F877a.h> #include <def_877a.h> #include <Kit16F877a.h> void main() { unsigned char keybuff, buffer; TRISD=0; PORTD=0; while(1) { keybuff = keyScan(); while(keybuff==255) keybuff = keyScan(); //cho den phim an buffer = convert_led7s(keybuff); //chuyen sang dang BCD ppiWrite(buffer,B); //ghi ra PORT B cua 8255 while(freeHand()==0){} //cho den khi nha phim } }

khi

co

3.3.S dng ngt thi gian : 3.3.1. S dng Timer 0: Cc thanh ghi lin quan n Timer0 bao gm: OPTION_REG(81h, 181h) : iu khin hot ng ca Timer0

bit 5 TOCS la chn ngun clock 1=Clock ngoi t chn T0CKI 0=Clock trong Focs/4 bit 4 T0SE bit la chn sn xung clock 1=Timer 0 tng khi chn T0CKI t cao xung thp(sn xung) 0=Timer 0 tng khi chn T0CKI t thp ln cao(sn xung) bit 3 PSA bit gn b chia xung u vo 1=gn b chia Prescaler cho WDT 0=gn b chia Prescaler cho Timer 0 bit 2:0 PS2:PS1 la chn h s chia h s xung theo bng sau:
PS2:PS0 000 001 010 011 100 101 110 111 Timer0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

TMR0(01h, 101h) : cha gi tr ca b nh thi Timer0 INTCON(0Bh, 8Bh, 10Bh, 18Bh): cho php ngt hot ng Thanh ghi cha cc bit iu khin v cc bt c hiu khi timer0 b trn, ngt ngoi vi RB0/INT v ngt interrupt_on_change ti cc chn ca PORTB.

Bit 7 GIE Global Interrupt Enable bit GIE = 1 cho php tt c cc ngt. GIE = 0 khng cho php tt c cc ngt. Bit 6 PEIE Pheripheral Interrupt Enable bit PEIE = 1 cho php tt c cc ngt ngoi vi. PEIE = 0 khng cho php tt c cc ngt ngoi vi. Bit 5 TMR0IE Timer0 Overflow Interrupt Enable bit TMR0IE = 1 cho php ngt Timer0. TMR0IE = 0 khng cho php ngt Timer0. Bit 4 RBIE RB0/INT External Interrupt Enable bit

RBIE = 1 cho php tt c cc ngt ngoi vi RB0/INT RBIE = 0 khng cho php tt c cc ngt ngoi vi RB0/INT Bit 3 RBIE RB Port change Interrupt Enable bit RBIE = 1 cho php ngt RB Port change RBIE = 0 khng cho php ngt RB Port change Bit 2 TMR0IF Timer0 Interrupt Flag bit TMR0IF = 1 thanh ghi TMR0 b trn (phi xa c hiu bng chng trnh). TMR0IF = 0 thanh ghi TMR0 cha b trn. Bit 1 INTF BR0/INT External Interrupt Flag bit INTF = 1 ngt RB0/INT xy ra (phi xa c hiu bng chng trnh). INTF = 0 ngat RB0/INT cha xay ra. Bit 0 RBIF RB Port Change Interrupt Flag bit RBIF = 1 t nht c mt chn RB7:RB4 c s thay i trng thi. Bt ny phi c xa bng chng trnh sau khi kim tra li cc gi tr chn ti PORTB. RBIF = 0 khng c s thay i trng thi cc chn RB7:RB4. Thit lp gi tr ban u cho Timer 0 :
void Timer0_init() { TMR0=0; TMR0IE=1; TMR0IF=0; OPTION=0x01; GIE=1; PEIE=1; } //dat gia tri bat dau dem cho timer 0 //cho phep ngat timer 0 hoat dong //xoa interrupt flag timer 0 //chon che do cho timer 0 //cho phep tat ca cac ngat hoat dong //cho phep ngat ngoai vi

Thc hin cng vic khi xy ra ngt Timer 0:


void interrupt isr() { if(TMR0IF && TMR0IE) { TMR0IF=0; TMR0=0; i++; if(i==500) { i=0; RD7=!RD7 } } } void main() { Timer0_init(); while(1); }

Sau mi nhp ca vi iu khin, TMR0 s tng ln 1. Gi tr ban u ca TMR0 = 0 nn sau 256 nhp, TMR0IF s c set ( xy ra hin tng trn), ng thi i c +1. Khi i = 100, led ti chn RD7 s thay i trng thi 1 ln. Vy led s sng, ti lin tc vi chu k : 256*0.2*4*500=0.1024(s) ( ta chn gi tr PS2:PS0=001 >>> prescaler = 1:4 nn phi nhn 4 trong cng thc trn, chn thch anh c tn s 20MHz nn thi gian cho 1 nhp vi iu khin = 4/20 = 0.2 us ) 3.3.2. S dng Timer 1: Cc thanh ghi lin quan n Timer1 bao gm: INTCON (a ch 0Bh, 8Bh, 10Bh, 18Bh): cho php ngt hot ng (2 bit GIE v PEIE). PIR1 (a ch 0Ch): cha c ngt Timer1 (TMR1IF). PIE1 (a ch 8Ch): cho php ngt Timer1 (TMR1IE). TMR1L (a ch 0Eh): cha gi tr 8 bt thp ca b m Timer1. TMR1H (a ch 0Eh): cha gi tr 8 bt cao ca b m Timer1. Hai thanh ghi TMR1L v TMR1H l 2 thanh ghi cha d liu 16 bit (ln lt cha 4 bit thp v 4 bit cao) ca b m Timer1 T1CON (a ch 10h): xc lp cc thng s chi Timer

Hnh 10: Cu trc thanh ghi T1CON iu khin hot ng ca Timer1 bit 7,6 khng s dng
bit 5,4 T1CKPS1: T1CKPS0 la chn h s chia xung vo. T1CKPS1 T1CKPS0 00 01 10 11

1:1 1:2 1:4 1:8

bit 3 T1OSCEN bit iu khin b dao ng Timer1 1= B dao ng hot ng 0= B dao ng khng hot ng bit 2 bit iu khin xung clock ngoi ng b khi TMR1CS=1 =0 ng b clock ngoi =1 khng ng b clock ngoi khi TMR1CS=0 bit ny khng c tc dng bit 1 TMR1CS bit la chn ngun xung clock vo TMR1CS=1 clock t chn RC0/T1OSO/T1CKI (sn ln) TMR1CS=0 clock trong Fosc/4 bit 0 bit bt tt Timer1 =1 Timer 1 enable =0 Timer 1 disable

Thit lp gi tr ban u cho Timer 1

void Timer1_init() { //nap gia tri 16 bit cho timer 1 TMR1L=0x00; TMR1H=0x80; T1CON=0x0F; ngoai, bat timer1 TMR1IE=1; TMR1IF=0; PEIE=1; GIE=1; } //chon che do:cho phep dao dong, khong dong bo clock

Thc hin cng vic khi xy ra ngt Timer 1


void interrupt isr() { if(TMR1IF && TMR1IE) { TMR1IF=0; TMR1L=0; TMR1H=0x80; } }

3.3.3. S dng Timer 2: Cc thanh ghi lin quan : TMR2(11h) : cha gi tr ca Timer 2 PR2(92h) : Timer 2 s m t 00h n PR2 ( mc nh gi tr cho PR2 l FFh) Thanh ghi T2CON: iu khin hot ng ca Timer2

bit 7 khng s dng bit 6-3 TOUTPS3: TOUTPS0 bit la chn h s u ra Timer 2 0000=1:1 0001=1:2 0010=1:3 1111=1:16 bit 2 TMR2ON bit bt tt hot ng Timer 2 1= enable 0= disable bit 1- 0 T2CKPS1:T2CKPS0 chn h chia u vo 00 = 1:1 01 = 1:4 1x=1:16 Cch s dng timer 2 tng t 2 timer trn

3.4.PWM : thc hin chc nng PWM, ta cn ci t nh sau : - Thit lp thi gian 1 chu k ca xung iu ch cho PWM ( period ) bng cch a gi tr vo thanh ghi PR2 - Thit lp rng xung cn iu ch ( duty cycle) bng cch a gi tr vo thanh ghi CCPRxL v cc bit CCP1CON<5:4> - iu khin cc chn ca CCP l out put bng cch clear cc bit tng ng trong thanh ghi TRISC - Thit lp gi tr b chia tn s prescaler ca Timer 2 v cho php Timer 2 hot ng bng cch a gi tr thch hp vo thanh ghi T2CON - Cho php CCP hot ng ch PWM Cng thc tnh period : PWM period = [(PR2)+1]*4*TOSC*(gi tr b chia tn s ca TMR2). Cng thc tnh duty cycle PWM duty cycle = (CCPRxL:CCPxCON<5:4>)*TOSC*( gi tr b chia tn s ca TMR2)
unsigned long adc_val=0; void main() { //cau hinh port TRISC1 = 0; TRISC2 = 0; PORTC = 0; TRISA=0x04; PORTA=0;

// chan CCP2 la output // chan CCP1 la output // chan AN2 la input

// cau hinh ADC ADFM = 1; PCFG3 = PCFG2 = PCFG1 = 1; PCFG0 = 0; ADCS2 = ADCS1 = ADCS0 = 0 ; GODONE = 0 ; ADON = 1; // cau hinh timer 2 T2CON = 0; // prescaler TMR2ON = 1; PR2 = 199; // Thoi gian // = 1us * 1 // => tan so while(1) { delay_us(5); GODONE = 1; while(GODONE);

//10 bit //chon kenh ADC //chon xung cho bo ADC

= 1:1; postscaler = 1:1 timer tran: T = Tosc * prescaler * (PR2+1) * 200 = 200us PWM = 1/T = 5KHz

// cho ADC lay mau // bat dau chuyen doi ADC // cho ADC chuyen doi xong

adc_val = ADRESL; adc_val |= (unsigned int)ADRESH << 8; adc_val = adc_val * 400 / 1023;

if(adc_val<200) { CCP1CON = 0x0C; CCP2CON = 0; // CCPR1L = 200 - adc_val; } else { CCP2CON = 0x0C; CCP1CON = 0; // CCPR2L = adc_val-200; } delay_ms(50); } }

// cau hinh CCP1 la PWM tat CCP2, chan RC1 do PORTC dieu khien // set duty cho CCP1

// cau hinh CCP2 la PWM tat CCP1, chan RC2 do PORTC dieu khien // set duty cho CCP2

Chng trnh trn thc hin cng vic ly gi tr analog t AN2 ri chuyn sang digital, so snh vi gi tr 200 xut ra chn CCP1 v CCP2 gi tr PWM

3.5.ADC : Qu trnh chuyn i gm cc bc sau : - Thit lp thng s cho b ADC Chn ng vo analog, chn in p mu ( ADCON1 ) Chn knh chuyn i ( ADCON0 ) Chn xung clock cho knh chuyn i ( ADCON0 ) Cho php b chuyn i hot ng ( ADCON0 ) - Thit lp c ngt ADIF = 0 ADIE = 1 PEIE = 1 GIE = 1 - i ti khi kt qu ly mu hon tt - Bt u qu trnh chuyn i - Kim tra qu trnh chuyn i hon tt qua GO/DONE = 0 >>> qu trnh chuyn i hon tt Kim tra c ngt - c kt qu chuyn i v xa c ngt, set GO/DONE nu cn tip tc chuyn i - Tip tc thc hin cc bc 1,2 cho cc qu trnh chuyn di tip theo C 2 cch lu kt qu : - ADFM = 1 : right justified - ADFM = 0 : left justified Cc thanh ghi lin quan : - INTCON ( 0Bh, 8Bh, 10Bh, 18Bh) : cho php ngt ( GIE, PEIE ) - PIR1 ( 0Ch ) : c ngt ( ADIF ) - PIE1 ( 8Ch ) : bit iu khin ( ADIE ) - ADRESH ( 1Eh ) v ADRESH ( 9Eh ) : cha kt qu chuyn i - ADCON1 ( 9Fh )
ADFM =1: right justified ADCS2 Kt hp vi ADCS1, PCFG3:PCFG0 iu khin vic chn cu hnh hot ng cc

=0: left justigied

ADCS0 iu khin xung clock cho ADC

cng ca ADC

Trong : A : ng vo Analog, D : ng vo Digital, C/R : s ng vo Analog/s in p mu - ADCON0 ( 1Fh ) :


ADCS1:ADCS0 Kt hp vi ADCS2 iu khin xung clock cho ADC CHS2:CHS0 Chn knh chuyn i ADC 000 : AN0 111 : AN7 GO/DONE =1:khi ng ADC v t xa khi qu trnh chuyn i kt thc =0:A/D khng hot ng ADON =1:turn on ADC =0:turn off ADC

void ADC_init() { ADFM = 1; PCFG3 = PCFG2 = PCFG1 = 1; PCFG0 = 0;

//10 bit //chon kenh ADC

ADCS2 = ADCS1 = ADCS0 = 0 ; GODONE = 0 ; ADON = 1; ADIE = 1; ADIF = 0; PEIE = 1; GIE = 1; }

//chon xung cho bo ADC

//Cho phep ngat

void interrupt adc(void) { if(ADIF) { value =(ADRESH<<8)|ADRESL; ADIF = 0; } } void main() { unsigned int i=0; ADC_init(); while(1) { if(i<10) i++ else { GODONE=1; i=0; } } }

Chng trnh trn thc hin nhim v c sau khi nhn c tn hiu analog t bn ngoi 10 ln th ly mu 1 ln 3.6.Giao tip truyn thng : 3.6.1. USART: Bt ng b : Cc bc thc hin truyn d liu : - To xung truyn baud (RSBRG) v mc tc (BRGH) - Cho php bt ng b (SYNC = 0, PSEN = 1) - Nu cn s dng ngt truyn (TXIE = 1) - Nu nh dng d liu cn truyn 9 bit (TX = 1) - Cho php truyn d liu (TXEN = 1) >>> TXIF = 1 - Nu nh dng d liu 9 bit, a bit th 9 vo TX9D - a 8 bit d liu vo TXREG - Nu s dng ngt truyn, kim tra GIE, PEIE (INTCON) Cc bc thc hin nhn d liu : - Thit lp tc baud (SPBRG, BRGH) - Cho php bt ng b (SYNC = 0, SPEN = 1)

Nu cn s dng ngt nhn (RCIE = 1) Nu d liu nh dng 9 bit (RX9 = 1) Cho php nhn d liu (CREN = 1) >>> RCIF = 1 >>> ngt c kch hot Nu d liu nh dng 9 bit, c bit 9 yaij RCSTA v kim tra qu trnh nhn d liu c b li khng - c 8 bit t RCREG - Nu qu trnh c li, xa li (CREN = 0) - Nu s dng ngt nhn th GIE = PEIE = 1
void USART_init(void) { SPEN = 1; //cho phep giao tiep USART SYNC = 0; //khong dong bo BRGH = 1; //toc do cao SPBRG = 77; //Baud = 9600; Baud Rate = Fosc/(16(X+1)) TXEN = 1; TX9 = 0 ; TXIE = 0; RCIE = 1; RX9 = 0; CREN = 1; PEIE = 1; GIE = 1; } void uart_putc(char c) { while(!TXIF); TXREG = c; } void uart_puts(const char* s) { while(*s != '\0') { uart_putc(*s); s++; } } char uart_getc() { while(!RCIF); return RCREG; } char uart_data_ready() { if(RCIF) return 1; else return 0; } //cho phep truyen du lieu //truyen du lieu 8 bit //khong cho phep ngat truyen //cho phep ngat nhan //nhan du lieu 8 bit //cho pheo nhan du lieu

void uart_gets(char *s) { *s = uart_getc(); while(*s!='\0') { s++; *s = uart_getc(); } } void main(void) { bit flag; unsigned char i; USART_init(); while(1) { i++; if(i == 0xff) i = 0; delay(0xffff);delay(0xffff); if(usart_data_ready) { usart_putc(send); } else putchar(i); } }

3.6.2. I2C:
void i2c_start(){ SEN = 1; while(SEN); } void i2c_stop(){ PEN = 1; while(PEN); } unsigned char i2c_read(unsigned char ack){ RCEN = 1; while(RCEN); ACKDT = ack; ACKEN = 1; while(ACKEN); return SSPBUF; } unsigned char i2c_write(unsigned char d) { WCOL = 0; SSPIF = 0; SSPBUF = d; delay_us(3); if(WCOL) return 2; // write collision else

{ while(!SSPIF); if(ACKSTAT) return 1; // not acknowledge return 0; // everything is ok } } void i2c_init() { RC3 = 1; RC4 = 1; TRISC3 = 1; TRISC4 = 1; //

control by mssp

SSPADD = 9; // Baudrate = Fosc/4/(SSPADDR+1) SMP = 1; // slew rate control disabled for 100KHz baudrate SSPCON2 = 0; SSPCON = 0x28; //I2C Master Hardware mode }

3.6.3. RS232: ci t thng s cho truyn thng RS232, ta lm nh sau : #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) baud = 9600 parity = N : khng dng parity xmit = PIN_C6 : set transmit pin rcv = PIN_C7 : set receive pin bits = 8 : truyn d liu 8 bit Mt v d v vic s dng truyn thng RS232 :
#include <16F877.H> #use delay(clock=11059200) #fuses HS,NOWDT,NOPROTECT,NOLVP #use rs232(baud=9600, xmit=PIN_C7, rcv=PIN_C6)

void main() { int8 sec,min,hour,day,date,month,year; sec=1; // read second min=2; // read minute hour=3; // read hour day=4; // read day date=5; // read date month=6; // read month year=7; // read year while(true) { putc(0x0c); printf("Time : %02X:%02X:%02X\r\n",hour,min,sec); printf("Day : %02X\r\n",day); printf("Date : %02X/%02X/20%02X\r\n",date,month,year); delay_ms(100); }

3.7.B m thi gian thc DS 1307 L 1 IC thi gian thc vi ngun cung cp nh, dng cp nht thi gian v ngy thng vi 56 bytes SRAM. a ch v d liu c truyn ni tip qua 2 ng bus 2 chiu. ng h c th hot ng wor dng 12h vi ch th AM/PM v 24h. DS1307 cn c mt mch cm bin in p dng d cc in p li v t ng ng ngt vi ngun pin cung cp. Hot ng ca cc chn : - Vcc, GND : khi c cung cp 5V : thit b c truy cp hon chnh, c th c v vit Khi c cung cp 3 V v nh hn 1.25Vbat th qu trnh c v ghi ko c thc thi, nhng chc nng timekeeper ko b nh hng. Khi Vcc nh hn Vbat th Ram v timekeeper s c ngt ti ngun cp trong. - Vbat : c gi t 2.5 3 V m bo hot ng bt cho thit b - SCL : dng ng b s truyn d liu trn ng dy ni tip - SDA : l chn vo ra cho 2 ng dy ni tip, i hi c in tr ko trong khi hot ng - SQW/OUT : khi c thit lp ( = 1 ), chn ny pht i 1 trong 4 tn s : 1Hz, 4Hz, 8Hz, 32Hz, hot ng khi Vcc v Vbat cng c cp - X1, X2 : c ni vi thch anh tn s 32,768kHz S a ch Ram v RTC :
Seconds Minutes Hours Day Date Month Year Control RAM 58x8 00h

07h 08h 3Fh

Thng tin v thi gian v ngy thng c ly ra bng cch c cc byte thanh ghi thch hp, v cng c thit lp thng qua cc byte thanh ghi ( vit vo bng m BCD ). Thanh ghi thi gian thc c m t nh sau :
Bit 7 X X X X X X 10 YEAR OUT Bit 6 Bit 5 10 SECONDS 10 MINUTES 12 24 10 HR (A/P) X X X 10 DATE X X X X Bit 4 Bit 3 Bit 2 SECONDS MINUTES HOURS X DAY DATE MONTH YEAR X X Bit 1 Bit 0

10 HR X 10 MONTH SQWE

RS1

RS0

CH ( clock halt ) : = 0 cho php DS1307 hot ng DS1307 hot ng 2 ch sau : - Ch slave nhn ( DS1307 ghi) :

Ch slave pht (DS1307 c) :

V chi tit th c th c thm data sheet ca DS1307 Chng trnh minh hc giao tip vi DS1307
#use delay(clock=11059200) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define DS1307_SDA #define DS1307_SCL RC4 RC3

#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL) #define #define #define #define #define lcdRs lcdRw lcdEn RE0 RE1 RC0

BG_LCD RB5 data_lcd PORTD

//LCD Procedure void lcdWrCmd(unsigned char ch); void lcdInit(void); void lcdWrDat(unsigned char ch); void lcdWrInt(unsigned int val); void lcdGoHome (void); void lcdGoLeft (void); void lcdGoRight (void); void lcdGoPos (unsigned char line, unsigned char pos_of_line); void lcdDownLine(void); void lcdClr(void);

void lcdWrStr(unsigned char s[]); void setup_sys(); void delay(unsigned int16 d); void hienthi_time(unsigned char hour, unsigned char min, unsigned char sec); void hienthi_date(unsigned char day, unsigned char month, unsigned char year); void init_DS1307(); void write_DS1307(byte address, BYTE data); BYTE read_DS1307(byte address); unsigned int8 sec,min,hour,day,date,month,year; void lcd_realtime(); void main() { int8 sec,min,hour,day,date,month,year; delay_ms(50); init_ds1307(); sec=read_ds1307(0); write_ds1307(0,sec & 0x7F); // cai dat ngay thang nam write_ds1307(0,0); delay_ms(10); write_ds1307(1,45); delay_ms(10); write_ds1307(2,12); delay_ms(10); write_ds1307(3,21); delay_ms(10); write_ds1307(4,11); delay_ms(10); write_ds1307(5,10); delay_ms(10); while(1) { sec=read_ds1307(0); // read second min=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour day=read_ds1307(3); // read day date=read_ds1307(4); // read date month=read_ds1307(5); // read month year=read_ds1307(6); // read year putc(0x0c); printf("Time : %02X:%02X:%02X\r\n",hour,min,sec); printf("Day : %02X\r\n",day); printf("Date : %02X/%02X/20%02X\r\n",date,month,year); delay_ms(1000); } } void lcd_realtime() { lcdClr(); hienthi_time(hour,min,sec);

// initial DS1307 // enable oscillator(bit 7=0)

// sec // min // hour // date // month // year

hienthi_date(date,month,year); } //HAM HIEN THI : GIO: PHUT: GIAY void hienthi_time(unsigned int8 gio,unsigned int8 phut,unsigned int8 giay) { unsigned int8 chuc_phut,dv_phut,chuc_giay,dv_giay,chuc_gio,dv_gio; unsigned char m[]="TIME:"; chuc_phut=phut/10; dv_phut=phut%10; chuc_giay=giay/10; dv_giay=giay%10; chuc_gio=gio/10; dv_gio=gio%10;

lcdWrCmd(0x80); lcdWrStr(m); lcdWrDat(chuc_gio+0x30); lcdWrDat(dv_gio+0x30); lcdWrDat(':');

// hien thi tu dong 1

lcdWrDat(chuc_phut+0x30); lcdWrDat(dv_phut+0x30); lcdWrDat(':'); lcdWrDat(chuc_giay+0x30); lcdWrDat(dv_giay+0x30); } //HAM HIEN THI : NGAY:THANG:NAM void hienthi_date(unsigned int8 ngay,unsigned int8 thang,unsigned int8 nam) { unsigned int8 chuc_ngay,dv_ngay,chuc_thang,dv_thang,chuc_nam,dv_nam; unsigned char m[] = "DATE:"; chuc_ngay=ngay/10; dv_ngay=ngay%10; chuc_thang=thang/10; dv_thang=thang%10; chuc_nam=nam/10; dv_nam=nam%10; lcdWrCmd(0xc0); lcdWrStr(m); lcdWrDat(chuc_ngay+0x30); lcdWrDat(dv_ngay+0x30); lcdWrDat(':'); lcdWrDat(chuc_thang+0x30); lcdWrDat(dv_thang+0x30); lcdWrDat(':'); lcdWrDat('2'); lcdWrDat('0'); lcdWrDat(chuc_nam+0x30); lcdWrDat(dv_nam+0x30); // hien thi tu dong 2

} //==================================================================== void setup_sys() { ADCON1 = 0x07; TRISA = 0; //config ports are output TRISE = 0; TRISC = 0; TRISB = 0; TRISD = 0; } //================================DS1307=================================== // initial DS1307 //========================== void init_DS1307() { output_float(DS1307_SCL); output_float(DS1307_SDA); } //========================== // write data one byte to // DS1307 //========================== void write_DS1307(byte address, BYTE data) { short int status; i2c_start(); i2c_write(0xd0); //dia chi mac dinh cua DS1307 i2c_write(address); //dia chi thanh ghi i2c_write(data); //du lieu can ghi i2c_stop(); i2c_start(); status=i2c_write(0xd0); while(status==1) //chua nhan duoc du lieu { i2c_start(); //tiep tuc gui den khi nhan duoc du lieu status=i2c_write(0xd0); } } //========================== // read data one byte from DS1307 //========================== BYTE read_DS1307(byte address) { BYTE data; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_start(); i2c_write(0xd1); data=i2c_read(0); i2c_stop(); return(data); }

3.8. LCD :

Chc nng cc chn : VSS : chn ni t VDD : chn ni ngun 5V VEE : iu chnh tng phn LCD RS : = 0 : s dng thanh ghi lnh IR ch ghi hoc s dng b m a ch ch c, = 1 : s dng thanh ghi d liu DR R/W : = 0 : ghi, = 1 : c E : chn cho php LCD hot ng, cc lnh ch c chp nhn khi c xung cho php ca chn E ch ghi : d liu bus s c chuyn vo LCD ( chp nhn ) thanh ghi bn trong n khi pht hin 1 xung L-H ca tn hin chn E ch c : d liu s c LCD xut ra DB0 DB7 khi pht hin cnh ln ( L-H ) chn E v c gi bus n khi no chn E xung mc thp DB0 DB7 : bus d liu, c 2 ch 8 bit v 4 bit ( DB4 DB7 ) Cc thanh ghi : c 2 thanh ghi 8 bit quan trng : IR ( Instructor Register ) v thanh ghi d liu DR ( Data Register ) IR : iu khin LCD, chng ta phi ra lnh thng qua DB7 DB0 Bng lnh nh sau :

- DR : dng cha d liu ghi vo vng RAM DDRAM hoc CGRAM ch ghi hoc cha d liu t 2 vng RAM ny gi ra MCU ch c. Bng cch iu khin chn RS v R/W, ta c th chuyn qua li gia 2 thanh ghi ny trong khi giao tip vi MCU

- Busy Flag : khi thc hin cc hot ng bn trong chip, cn 1 khong thi gian thc hon tt nn khi ang thc hin cc hot ng, LCD s b qua mi giao tip bn ngoi v bt BF ( thng qua chn DB7 khi c RS = 0, R/W = 1 ). Khi xong vic, BF t ng bng 0
//LCD Procedure void lcdWrCmd(unsigned char ch); void lcdInit(void); void lcdWrDat(unsigned char ch); void lcdWrInt(unsigned int val); void lcdGoHome (void); // Move cursor go to home; void lcdGoLeft (void); // Move cursor left void lcdGoRight (void); // Move cursor right void lcdGoPos (unsigned char line, unsigned char pos_of_line); void lcdDownLine(void); void lcdClr(void);

void lcdWrStr(unsigned char s[]); void delay(unsigned int d); void lcdWrCmd(unsigned char ch) // ghi lenh { TRISD = 0; ppiEn = 1; delay(180); Rs = 0; Rw = 0; PORTD = ch; lcdEn = 1; lcdEn=0; TRISD = 0xff; } void lcdWrDat(unsigned char ch) // ghi du lieu { TRISD = 0; ppiEn = 1; delay(180); Rs = 1; Rw = 0; PORTD = ch; lcdEn = 1; lcdEn=0; TRISD = 0xff; } void lcdWrStr(unsigned char s[]) // ghi chuoi { unsigned char i = 0; while(s[i]!='\0') lcdWrDat(s[i++]); } void lcdInit(void) { TRISD = 0; delay(0xffff); RD = 0; WR = 0; enLCD = 1; PORTD = 0x38; enLCD = 1; delay(100); enLCD = 0; delay(100); lcdWrCmd(0x0C); delay(10); lcdWrCmd(0x01); delay(10); lcdWrCmd(0x80); delay(100); TRISD = 0xff; } // khoi tao LCD

// // // //

Instruction Register Write to Enable LCD 2 lines, matrix 5x7

// Display ON, Cursor off, no blink // Clear Display // Set Cursor to top left

void lcdWrInt(unsigned int val) { unsigned char i, j, num[5]; i = 0; while(val > 9) { num[i] = val%10 + 0x30; val = val/10; i++; } num[i] = val + 0x30; for(j = 0; j <= i; j++) { lcdWrDat(num[i - j]); } } void lcdGoHome (void) { lcdWrCmd (0x02); } void lcdGoLeft (void) { lcdWrCmd (0x10); } void lcdGoRight (void) { lcdWrCmd (0x14); } // Move cursor go to home; // Cursor go home

// Move cursor left // Cursor go left

// Move cursor right // Cursor go right

void lcdGoPos (unsigned char line, unsigned char pos_of_line) // Move cursor to posistion of a line { unsigned char addr; if (line==0) addr = pos_of_line; else addr = 0x40+pos_of_line; lcdWrCmd (0x80+addr); } void lcdDownLine(void) { lcdWrCmd(0xC0); } void lcdClr(void) { lcdWrCmd (0x01); lcdGoHome(); } void delay(unsigned int d) { while(d--){}; }

//

Cursor go home

3.9.STEP MOTOR : - ng c bc gm 4 cun dy A , B , C , D phn b u trn stato . Rto lm bng nam chm vnh cu . ng c hot ng , ta cp in cho tng cun dy mt ( ch 1 pha ) , hoc tng cp cun dy mt ( ch 2 pha ) . - Khi cp in 1 pha , ng c quay thun th th t cp in l Step1, Step2, Step3, Step4 . ng c quay ngc th th t cp in l Step4, Step3, Step2, Step1 Chng trnh sau minh ho vic iu khin ng c bc ch 1 pha.

#define #define #define #define

Step1 Step2 Step3 Step4 1

RC1; RB0; RC2; RB5;

#define CW1

#define CW2

void delay(unsigned int t); void Stepmotor(unsigned char step,unsigned char CW); void main() { unsigned int d; ADCON1 = 0x07; TRISA = 0; TRISB = 0; TRISC = 0; TRISD = 0; TRISE = 0; d = 10; while(1) { Stepmotor(100,CW1); delay(0xffff); //quay thuan 100 buoc Stepmotor(200,CW2); delay(0xffff); //quay nguoc 200 buoc } } void Stepmotor(unsigned char step,unsigned char CW) { unsigned char i,st; if(CW==CW1) //quay thuan { st=1; for(i=0;i<step;i++) { switch (st) { case 1: { Step1=0;Step2=1;Step3=1;Step4=1;delay(0x8ff);st=2;break; } case 2: { Step1=1;Step2=0;Step3=1;Step4=1;delay(0x8ff);st=3; break; } case 3: { Step1=1;Step2=1;Step3=0;Step4=1;delay(0x8ff);st=4; break; } case 4: { Step1=1;Step2=1;Step3=1;Step4=0;delay(0x8ff);st=1;break; } default:st=0; }; } } else if(CW==CW2) {

//quay nguoc

st=1; for(i=0;i<step;i++) { switch (st) { case 1: { Step1=1;Step2=1;Step3=1;Step4=0;delay(0x8ff);st=2;break; } case 2: { Step1=1;Step2=1;Step3=0;Step4=1;delay(0x8ff);st=3; break; } case 3: { Step1=1;Step2=0;Step3=1;Step4=1;delay(0x8ff);st=4; break; } case 4: { Step1=0;Step2=1;Step3=1;Step4=1;delay(0x8ff);st=1;break; } default:st=0; }; } } } //--------------------------------------void delay(unsigned int t) { while(t--){}; }

You might also like