You are on page 1of 38

Watchdog Timer?

Mt thit b thi gian m n c thit lp mt khong thi gian nh trc v


mt s kin phi xy ra trong khong thi gian ngc li thit b s to ra tn
hiu time-out v li ca s kin trong khong thi gian ch s kin .
Trong hot ng ca s kin th Watchdog timer bi cm cm Watchdog timer
to tn hiu time-out v reset.
Time-out s lm cho vi x l bt u mt chng trnh con hoc reset chng
trnh li t u

V d:

Gi s mt tc v phi hon thnh trong khong thi gian 100 ms.


Watchdog timer s b v hiu ha v dng li bi chng trnh trong trng hp
cc tc v hon thnh trong khong thi gian 100 ms.
Trong trng hp tc v khng hon thnh, watchdog timer to ra ngt sau 100
ms v thc hin mt chng trnh con c lp trnh chy khi c li tc v
khng hon thnh trong khong thi gian d kin.

ng dung:

Mt ng dng trong in thoi di ng l tt mn hnh hin th l trong trng


hp khng c tng tc din ra trong mt khong thi gian theo di( v d 15s,
20s..) gip tit kim cng sut.

Simulator and Emulator Comparise?


Simulator:

Simulator l cng c phn mm chy trn my tnh v m phng hot ng ca


b vi x l v b nh.
Simulator bit c kin trc v tp lnh ca vi x l cn m phng.
Chng trnh vit cho vi x l s c c bi Simulator v thc thi tp lnh,
Simulator theo di v ghi li cc gi tr thanh ghi v b nh ca vi x l.
M phng cho php chy chng trnh tng bc gip g gi cho chng trnh.
M phng khng th c s dng nu cc h thng nhng s dng phn cng
c bit m khng th c m phng v cch duy nht kim tra chng
trnh l thc hin n h thng thc.
Mc d m phng khng chy cng mt tc nh h thng thc, nhng m
phng cung cp chi tit thi gian thc thi m lnh, da vo c th xc nh
c thi gian chy trn h thng thc.

Emulator:

Emulator l mt cng c phn cng gip th nghim v g li cc chng trnh.


B x l ca h thng thc c tho ra khi mch v Emulator c kt ni
vo ch ca n. Tn hiu Emulator li mch nh mt vi x l thc v do
Emulator ny dng nh l mt b vi x l nm trn phn cng nh cc thnh
phn khc ca h thng nhng.
Emulator cng cung cp cc tnh nng nh chy tng bc g li chng
trnh.

Chng trnh giao thng chu k 50s:20-5-25;25-20-5;tng ng l cc khong thi


gian xanh-vng- v -xanh-vng cho ng t.

#include <16F877A.h>
#include <def_16f877a.h>
#device pic16F877A*=16 ADC=8
#fuses
NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG,
NOBROWNOUT,NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=n,xmit=pin_C6,rcv=pin_C7)
#use rtos(timer=0, minor_cycle=5ms)
int8 dvi1,chuc1,tram1,ht1;
int8 dvi2,chuc2,tram2,ht2;
int32 n,m,i;
const
unsigned
mang[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int8 dem=51;
#task(rate=100ms,max=1ms)
void xuli()
{
dem--;
if(dem>25) //den do
{
ht1=dem-25;
if(ht1>4)
{
ht2=ht1-5;
portc=0x14;
}
if(ht1<=5)
{

char

ht2=ht1;
portc=0x0c;
}
}
if( dem==25 ) //den xanh
{
ht2=dem;
if(dem>4)
{
ht1=dem-5;
portc=0x22;
}
if(dem==5) //den vang
{
ht1=dem;
portc=0x21;
}
}
chuc1=ht1/10;
dvi1=ht1%10;
chuc2=ht2/10;
dvi2=ht2%10;

if(dem==0)
{
dem=51;
}
}
#task(rate=5ms,max=1ms)
void hienthi()
{
portd=0xfd;
portb=mang[chuc1];
delay_us(100);
portb=0xff;
portd=0xfe;
portb=mang[dvi1];
delay_us(100);
portb=0xff;

portd=0x7f;
portb=mang[chuc2];
delay_us(100);
portb=0xff;
portd=0xbf;
portb=mang[dvi2];
delay_us(100);
portb=0xff;
}
void main()
{
set_tris_c(0);
SET_TRIS_B( 0 );
set_tris_d(0);
rtos_run();
}
Phn cng

14
AN02
AN13
4
b

5
6
7

R9
1k

8
9
10
1

OSC1/CLKIN

RB0/INT

OSC2/CLKOUT

RB1
RB2

RA0/AN0

RB3/PGM

RA1/AN1

RB4

RA2/AN2/VREF-/CVREF

RB5

RA3/AN3/VREF+

RB6/PGC

RA4/T0CKI/C1OUT

RB7/PGD

RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD
RE1/AN6/WR
RE2/AN7/CS

RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA

MCLR/Vpp/THV

RC5/SDO
RC6/TX/CK
RC7/RX/DT

C1
1nF

RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

R3
R1
R4
220

33
34
35

l1
l2
l3

220

36

l4

R5
R6
220
R7
220
220

37
38
39

l5
l6
l7

220
220

40

d7
d6
d5
d4
d3
d2
d1
d0

U1
13

l1
l2
l3
l4
l5
l6
l7

R2

15

K1

16

K2

17

K3

18

k4

23

K5

24

K6

25

K7

26

K8

19

q0

20

q1

21

q2

22

q3

27

q4

28

q5

29

q6

30

q7

k6

R8

R12

k3

10k

K4

10k

R10

R13

k1

10k

K5

10k

R11

R14

k2

10k

10k

d0
NOT

q2

d1

d3

d2

d4

NOT

U4

U5

NOT

NOT

q0

q1

U2
U3

q4

q5
q6

q7

2.chng trnh c 2 knh ADC ln led 7 on

U9

NOT

q3

U6
U7

NOT

U8

d5

d6

d7

PIC16F877A

#include<16F877A.h>
#include<def_16f877a.h>
#device PIC16f877a*=16adc=8
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NOBROWNOUT,NOCPD
#use delay(clock=20000000)
#bit start=portc.0
char num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char pos[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
int16 dv0,ch0,tr0,dv1,ch1,tr1;
int i;
void hienthi()
{
int16 ADC0,ADC1;
set_TRis_d(0);
trisb=0;
setup_adc(adc_clock_internal);

setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
WHILE(1)
{

set_adc_channel(0);

delay_us(10);
ADC0=read_ADC();
set_ADC_channel(1);
delay_us(10);
ADC1=read_ADC();
tr0=ADC0/100;
ch0=(ADC0-100*tr0)/10;
dv0=(ADC0-100*tr0-10*ch0);
tr1=ADC1/100;
ch1=(ADC1-100*tr1)/10;
dv1=(ADC1-100*tr1-10*ch1);
portd=0xfe; // cho phep hang don vi sang
portb=num[dv0];

delay_us(100);
portb=255; // chong lem
portd=0xfd;
portb=num[ch0];
delay_us(100);
portb=255;
portd=0xfb;
portb=num[tr0];
delay_us(100);
portb=255;
portd=0xEF;
portb=num[dv1];
delay_us(100);
portb=255; // chong lem
portd=0xDf;
portb=num[ch1];

delay_us(100);
portb=255;
portd=0xBf;
portb=num[tr1];
delay_us(100);
portb=255;
}}
void main()
{
trisb=0;
trisd=0;
portb=0;
portd=0;
start=0;
port_b_pullups(1);
for(i=0;i<=20;i++)

{
hienthi();
}}
Phn cng;

AN02
AN13
4
b

5
6
7

R9
1k

8
9
10
1

OSC1/CLKIN

RB0/INT

OSC2/CLKOUT

RB1
RB2

RA0/AN0

RB3/PGM

RA1/AN1

RB4

RA2/AN2/VREF-/CVREF

RB5

RA3/AN3/VREF+

RB6/PGC

RA4/T0CKI/C1OUT

RB7/PGD

RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD

RC1/T1OSI/CCP2

RE1/AN6/WR

RC2/CCP1

RE2/AN7/CS

RC3/SCK/SCL
RC4/SDI/SDA

MCLR/Vpp/THV

RC5/SDO
RC6/TX/CK
RC7/RX/DT

C1
1nF

RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

R3
R1
R4
220

33
34
35

220

36

R5
R6
220
R7
220
220

37
38
39

220
220

40

l1
l2
l3
l4
l5
l6
l7

d7
d6
d5
d4
d3
d2
d1
d0

14

l1
l2
l3
l4
l5
l6
l7

U1
13

R2

15
16
17
18
23
24

U10

25
26
19

q0

20

q1

21

q2

22

q3

27

q4

28

q5

29

q6

30

q7

15.0

VOUT

AN0

LM35

PIC16F877A

U11

26.0

RV1

VOUT

AN1

51%

+2.55
Volts

#include<def_16f877a.h>
#device PIC16f877a*=16adc=8

NOT

q1

U2
U3

d0

NOT

U4

U5

NOT

NOT

q0

d1

U9

NOT

q2

d2

d3

U8

q3

q5

#include<16F877A.h>

q6

q7

3.Chng trnh c 2 knh ADC ra LCD

d4

d5

U6
U7

NOT

q4

d6

LM35

d7

3
1k

#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NOBROWNOUT,NOCPD
#use delay(clock=20000000)
const char code[10]={'0','1','2','3','4','5','6','7','8','9'} ;
const char t[4][21]={"NHIET DO 2 KENH ADC ",
"ADC0

",

"ADC1

"};

int8 dv0,ch0,tr0,dv1,ch1,tr1;
int8 i;
int8 j;
#define LCD portd
#define RS RB4
#define RW RB5
#define E RB6
int8 ADC0,ADC1;
void ghima()
{

RS=0;
RW=0;
E=1;
E=0;
delay_ms(10);
}
void hienthi()
{
RS=1;
RW=0;
E=1;
E=0;
delay_ms(10);
}
void khoitaoLCD()
{

portd=0x38;
ghima();
portd=0x0c;
ghima();
portd=0x01;
ghima();
portd=0x080;
ghima();
}
void dulieu()
{
set_adc_channel(0);
delay_us(10);
ADC0=read_ADC();
set_adc_channel(1);
delay_us(10);

ADC1=read_ADC();
tr0=ADC0/100;
ch0=(ADC0-100*tr0)/10;
dv0=(ADC0-100*tr0-10*ch0);
tr0=ADC1/100;
ch1=(ADC1-100*tr1)/10;
dv1=(ADC1-100*tr1-10*ch1);
}
void main()
{
setup_adc(ADC_clock_internal);
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
trisd=0;
trisb=0;
khoitaolcd();
for(i=0;i<4;i++)

for(j=0;j<20;j++)
{
LCD=t[i][j];
hienthi();
if((j==19)&&(i==0))
{
LCD=0xc0;
ghima();
}
if((j==19)&&(i==1))
{
LCD=0x94;
ghima();
}
if((j==19)&&(i==2))
{

//dau dong 2

LCD=0x44;
ghima();
} }
while(1)
{
dulieu();
LCD=0xD1;
ghima();
LCD=code[tr0];
hienthi();
LCD=code[ch0];
hienthi();
LCD=code[dv0];
hienthi();
LCD=0xA5;
ghima();

LCD=code[tr1];
hienthi();
LCD=code[ch1];
hienthi();
LCD=code[dv1];
hienthi();
}}

LCD2

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW
E

VSS
VDD
VEE

LM044L

R1
10k

AN02
AN1
3
4
b

5
6
7
8
9
10
1

RB0/INT

OSC2/CLKOUT

RB1
RB2

RA0/AN0

RB3/PGM

RA1/AN1

RB4

RA2/AN2/VREF-/CVREF

RB5

RA3/AN3/VREF+

RB6/PGC

RA4/T0CKI/C1OUT

RB7/PGD

RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD
RE1/AN6/WR
RE2/AN7/CS

RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA

MCLR/Vpp/THV

RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4

RD5/PSP5
RD6/PSP6
RD7/PSP7

RV1
PIC16F877A

51%

+2.55
Volts

1k

33
34

7
8
9
10
11
12
13
14

OSC1/CLKIN

RS 4
RW 5
E 6

14

1
2
3

U1
13

35
36
37

RS

38

RW

39

U2

U3

40
15
16

25.0

27.0

17
18
23

VOUT

AN0

VOUT

24
25
26
19
20
21
22
27
28
29
30

LM35

LM35

AN1

4.chng trnh qut phm. #include<16F877A.h>


#include<def_16f877a.h>
#device PIC16f877a*=16adc=8
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NOBROWNOUT,NOCPD
#define mask 0xf0
#use delay(clock=20000000)
const char code1[16]={1,2,3,'d',4,5,6,'u',7,8,9,'e','t',0,'=','b'};

int n;
int key;
int slq;
unsigned char slq,n,key;
void quetphim()
{
portc=0x01;
while(slq<80)

{
if((portc&mask)==0)
{
portc=(portc<<1);
key++;
if(key==4)
{
portc=0x01;
key=0;
}
slq=slq+1;
}
else
break;
delay_ms(20);
if(slq==80)

return('x');
else
{
for(n=0x10;n!=0;n<<=1)
{
if((portc&n)!=0)break;
key=key+4;
}
portc=0x0f;
while((portc&mask)!=0);
delay_ms(20);
return(code1[key]);
} } }
void main()
{
trisc=0xf0 //x la port muon ket noi

}
5.dch led sau 1s
#include<16F877A.h>
#include<def_16f877a.h>
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD
#use delay(clock=2000000)
int16 n;
int16 dich;
#int_timer1
// chuong trinh ngat
void interrupt_timer1()
{
set_timer1(3036);
++n;
if(n==10) // 1s
{

n=0;
portd==dich<<1;
}}
void main()
{
dich=1;
set_tris_d(0);
enable_interrupts(int_timer1);
setup_timer_1(RTCC_INTERNAL|RTCC_DIV_8);
//

set_timer1(3036);
enable_interrupts(GLOBAL);

while(1)
{ portD=dich;
}}
6.m t 1->100.hin th led 7on
#use delay(clock=20000000)

#bit start=portc.0
char num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char pos[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
int8 dv,ch,tr;
int8 t=1;
void hienthi()
{
portd=0xfe; // cho phep hang don vi sang
//portb=num[dv];
delay_us(100);
portb=255; // chong lem
portd=0xfd;
//portb=num[ch];
delay_us(100);
portb=255;
portd=0xfb;

//portb=num[tr];
delay_us(100);
portb=255;
}
void main()
{
tr=(t/100);
ch=((1-100*tr)/10)
dv=(t-(100*tr)-(10*ch));
if(t<=100)
{
t=t+1;
}}
Phn cng tng t bi giao thng
7.chng trnh s dng rtos hin th ngy.thng.nm
#include<16F877A.h>

#include<def_16f877a.h>
#include <ds1307.c>
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD
#use delay(clock=2000000)
const char code[10]={'0','1','2','3','4','5','6','7','8','9'} ;
int m,n,t,mch,mdv,nch,ndv,tch,tdv,hr,min,sec,l,lch,ldv,k,kch,kdv,f,fch,fdv;
int8 dv0,ch0,tr0,dv1,ch1,tr1;
int8 year,day,mth,dow;
#define LCD portd
#define RS RB2
#define RW RB1
#define E RB0
int8 i;
void ghima()
{

RS=0;
RW=0;
E=1;
E=0;
delay_ms(10);
}
void hienthi()
{
RS=1;
RW=0;
E=1;
E=0;
delay_ms(10);
}
void khoitaoLCD()
{

portd=0x38;
ghima();
portd=0x0c;
ghima();
portd=0x01;
ghima();
portd=0x080;
ghima();
}
void chuyendoi()
{
mch=m/10;
mdv=m%10;
nch=n/10;
ndv=n%10;
tch=t/10;

tdv=t%10;
fch=f/10;
fdv=f%10;
lch=l/10;
ldv=l%10;
kch=k/10;
kdv=k%10;
}
void main()
{
trisd=0;
trisb=0;
trise=0;
khoitaolcd();
ds1307_init();

ds1307_set_date_time(22,9,12,3,16,55,40);
while(1)
{

ds1307_get_time(hr,min,sec);
ds1307_get_date(day,mth,year,dow);
m=hr;
n=min;
t=sec;
l=year;
k=mth;
f=day;
chuyendoi();
LCD=0x80;
ghima();
LCD=code[mch];
hienthi();
LCD=code[mdv];

hienthi();
LCD=':';
hienthi();
LCD=code[nch];
hienthi();
LCD=code[ndv];
hienthi();
LCD=':';
hienthi();
LCD=code[tch];
hienthi();
LCD=code[tdv];
hienthi();
LCD=0xc0;
ghima();
LCD=code[kch];

hienthi();
LCD=code[kdv];
hienthi();
LCD=':';
hienthi();
LCD=code[fch];
hienthi();
LCD=code[fdv];
hienthi();
LCD=':';
hienthi();
LCD=code[lch];
hienthi();
LCD=code[ldv];
hienthi();
} }phn cng

LCD1
LM044L

RW

RS

10
1

RB5

RA3/AN3/VREF+

RB6/PGC

RA4/T0CKI/C1OUT

RB7/PGD

RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD
RE1/AN6/WR
RE2/AN7/CS

RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA

MCLR/Vpp/THV

RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

DB3

37

DB4

38

DB5

39

DB6

40

DB7

15
16
17
18

SCL

23

SDA

DS1307

24
25

D0
D1
D2
D3
D4
D5
D6
D7

RA2/AN2/VREF-/CVREF

DB2

36

7
8
9
10
11
12
13
14

L C D -C o n tro ll B u s

RB4

DB1

35

DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7

RA1/AN1

34

RS
RW
E

RB2
RB3/PGM

4
5
6

RB1

RA0/AN0

DB0

RS
RW
E

AN1

OSC2/CLKOUT

33

VSS
VDD
VEE

RB0/INT

1
2
3

AD C

14
AN0

OSC1/CLKIN

26
19

K1

20

K2

21

K3

22

K4

27

K5

28

K6

29

K7

30

K8

M a tra n p h im 8 x 8

13

L C D -D a ta B u s

U1

PIC16F877A

R1
R3
4.7k
4.7k

U3
SCL

SDA

SCL

X1

SDA

X1
7
3

CRYSTAL

SOUT
VBAT

X2

DS1307

BAT1
3V

Giao tip I2C gm c 2 dy:


Serial Data(SDA) :SDA l ng truyn d liu 2 hng.
Serial Clock (SCL):cn SCL l ng truyn xung ng theo 1 hng.

Mi dy SDA hay SCL u c ni vi in p dng ca ngun cp thng qua


mt in tr ko ln . S cn thit ca cc in tr ko ln ny l do chn giao tip
i2c ca cc thit b ngoi vi thng l mng cc h. Gi tr ca cc in tr ko ln
ty vo tng thit b v chun giao tip, thng dao ng t 1 K n 4.7 K.

y l chun truyn d liu dng ni tip gm hai dy l SDA (d liu) v SCL


(dy xung nhp).
Bn pht s to ra xung nhp (SCL) bn thu da vo tnh ton d liu trn
ng SDA.

Mt thit b hay mt IC khi kt ni vi bus I2C, ngoi mt a ch (duy nht)


phn bit, n cn c cu hnh l thit b ch (master) hay t (slave). Ti sao li
c s phn bit ny ? l v trn mt bus I2C th quyn iu khin thuc v thit
b ch (master). Thit b ch nm vai tr to xung ng h cho ton h thng, khi
gia hai thit b ch/t giao tip th thit b ch c nhim v to xung ng h v
qun l a ch ca thit b t trong sut qu trnh giao tip. Thit b ch gi vai tr
ch ng, cn thit b t gi vai tr b ng trong vic giao tip.
SPI (Serial Peripheral Bus) l mt chun truyn thng ni tip tc cao do hang
Motorola xut. y l kiu truyn thng Master-Slave, trong c 1 chip
Master iu phi qu trnh tuyn thng v cc chip Slaves c iu khin bi
Master v th truyn thng ch xy ra gia Master v Slave. SPI l mt cch truyn
song cng (full duplex) ngha l ti cng mt thi im qu trnh truyn v nhn c
th xy ra ng thi. SPI i khi c gi l chun truyn thng 4 dy v c 4
ng giao tip trong chun ny l SCK (Serial Clock), MISO (Master Input

Slave Output), MOSI (Master Ouput Slave Input) v SS (Slave Select). Hnh 1 th
hin mt kt SPI gia mt chip Master v 3 chip Slave thng qua 4 ng.
UART c th truyn khong cch 12 m.l mt mch vi in t c dng rng ri
cho vic truyn bt ni tip cng nh chuyn i song song/ni tip gia cc ng
truyn v bus my tnh.UART cho php lc chn gia cc ch truyn 1
chiu,hai chiu ng b hoc ko ng b.vic truyn ti c thc hin theo tng
k t 7 hoc 8 bit,dc b sung 2 bit u cui v 1 bit kim tra li chn l.
SPI v I2C ch truyn trong mch m thi
Truyn thng:
/Master

#include "16f877a.h"
#include "def_877a.h"
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG,
NOBROWNOUT,NOLVP, NOCPD, NOWRT

#use delay(clock=20000000)
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B)
#use fast_io(D)
#use fast_io(A)
#define REG_Write 0x80

#INT_SSP
void spi()
{
PORTD=spi_read(PORTB);
delay_ms(10);
}
void main()
{

port_b_pullups(TRUE);
setup_spi(spi_master|spi_l_to_h|spi_clk_div_16);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
SET_TRIS_B(0xff);
SET_TRIS_D(0x00);
SET_TRIS_A(0x00);
while(1)
{
delay_ms(100);
output_low(PIN_A5);//Chn C2 dng Select chip.
delay_ms(10);//Tao tre de Slave chuan bi.
spi_write(PORTB);
output_high(PIN_A5);
}

//Slaver

#include "16f877a.h"
#include "def_877a.h"
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG,
NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B)
#use fast_io(D)

#INT_SSP

void spi()
{
PORTD=spi_read(PORTB);//Vua nhan vua truyen.
delay_ms(10);
}

void main()
{
port_b_pullups(TRUE);
setup_spi(spi_slave|spi_l_to_h|spi_clk_div_16);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
TRISB=0xff;
TRISD=0x00;
while(1)

}
Phn cng

MASTER CHIP

4
5
6
7
8
9
10
1

RB1
RB2

RA0/AN0

RB3/PGM

RA1/AN1

RB4

RA2/AN2/VREF-/CVREF

RB5

RA3/AN3/VREF+

RB6/PGC

RA4/T0CKI/C1OUT

RB7/PGD

RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD

RC1/T1OSI/CCP2

RE1/AN6/WR

RC2/CCP1

RE2/AN7/CS

RC3/SCK/SCL
RC4/SDI/SDA

MCLR/Vpp/THV

RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

33

34

35

36

37

38

39

40

R1

M1

330

R2

M2

330
9

R3

M3

330

15

DIPSWC_8

R4

M4

16
17

330

18

R5

M5

23

DSW2

24
25

26

330

R6

M6

6
19

M1

20

M2

21

M3

22

M4

27

M5

28

M6

29

M7

30

M8

330

R7

M7

330
9
ON

RB0/INT

OSC2/CLKOUT

R8

M8

2
3
4
5
6
7
8
9
10
1

OSC2/CLKOUT

RB1
RB2

RA0/AN0

RB3/PGM

RA1/AN1

RB4

RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+

RB5
RB6/PGC

RA4/T0CKI/C1OUT

RB7/PGD

RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD
RE1/AN6/WR
RE2/AN7/CS

RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA

MCLR/Vpp/THV

R10
330

U2
14

R9
330

S2

RB0/INT

RC5/SDO
RC6/TX/CK
RC7/RX/DT

S3

33
34

R11
330

35
S4

36
37

R12
330

38
S5

39
40

S6

15
16

S7

23
24
S8

26

LED-YELLOW

D4

LED-YELLOW

D5

LED-YELLOW

D6

LED-YELLOW

D7

LED-YELLOW

D8

LED-YELLOW

D9

D10

LED-YELLOW

D11

LED-YELLOW

D12

LED-YELLOW

D13

LED-YELLOW

330

D14

R14
R15
330

25

D3

R13

330

17
18

LED-YELLOW

LED-YELLOW
S1

SLAVE CHIP

OSC1/CLKIN

D2

330
DIPSWC_8

PIC16F877A

13

D1

OFF

DSW1

OSC1/CLKIN

ON

14

OFF

U1
13

R16

LED-YELLOW

D15

LED-YELLOW

D16

LED-YELLOW

330
LED-YELLOW

RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
PIC16F877A

19

S1

20

S2

21

S3

22

S4

27

S5

28

S6

29

S7

30

S8

You might also like