You are on page 1of 14

B chuyn i t tng t sang s l mt khi mch in t quan trng, c mt

trong rt nhiu thit k in t. Cc b ADC thc t c ng gi trong nhng IC


chuyn dng, do nhiu hng sn xut. im quan trong cn lu cc b ADC
ny l phn gii v tc ly mu tn hiu. phn gii ca b ADC c th l
8bt, 10bt, 12bt, 16bt, 24bt Tc ly mu ca ADC c th nhanh hay
chm, ty tng ng dng m ta chn tc thch hp.
Vi iu khin PIC l mt trong nhng dng Vi iu khin c phn giao tip ngoi
vi mnh v a dng. Bn trong PIC c tch hp sn mt b ADC c phn
gii ti a l 10bt (ty chon l 8bit hay 10bit). Vi b ADC trong PIC ta c th
lm c kh nhiu cng vic, di y ti trnh by mt ng dng ca b ADC
trong vic thit k mch o nhit s dng sensor nhit LM335.
Di y l phn code mch o nhit d, hin th trn LCD.

//================================================= =======
// Ten chuong trinh : Mach do nhiet do
// Mo ta phan cung : Dung PIC16F877A thach anh 20MHz
// : LCD giao tiep voi PORTD
// : Dau ra LM335 dua vao chan AN0
//
// Chu thich : hoac cac chu thich khac
// : dung che do Power On Reset
// : chuong trinh viet cho PIC Tutorial
//================================================= =======
#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,
NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD
int8 low,high,key,mode,min,max,mode1,i;
int1 do_F;
void convert_bcd(int8 x);
void bao_dong();
void test();
//
void main()

{
float value;
on_off =1;
min =15; //nhiet do min default
max =35; //nhiet do max default
do_F =0 ;
i = 50 ;
mode =0 ;
mode1 = 0 ;
trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;
LCD_init();
Printf(LCD_putchar,Lop DT8 BKHN);
LCD_putcmd(0xC0);
Printf(LCD_putchar,Khoi tao...);
// Khoi tao cho ngat ngoai
enable_interrupts (INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
// Khoi tao che do cho bo ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
// Lay mau nhiet do lan dau tien
value=(float)read_adc();
value = (value 558.5)/2.048;
// For 5V supply
// value = (value 754.8)/2.048; // For 3.7V Supply
// value = (value 698.2)/2.048; // For 4V supply
convert_bcd((int8)value); // Tach so tram, chuc, donvi de hien thi len LED 7
delay_ms(1000);
LCD_putcmd(0xC0);
Printf(LCD_putchar,Khoi tao xong);
while(1)
{
if (i==50)
{
value = read_adc();

value=(value558.5)/2.048;
if (do_F==1) value=1.8*value+32;
convert_bcd((int8)value);
printf(\n\rNhiet do phong: %u,value);// Gui gia tri len may tinh
LCD_putcmd(0xC0);
printf(LCD_putchar, Temp = );
LCD_putchar(high); LCD_putchar(low);
if (do_F==0) printf(LCD_putchar, C);
else printf(LCD_putchar, F);
i=0;
}
i++;
if(((int8)value > 40) || ((int8)value < 15)) on_off=1;
else
{
on_off = 0;
LCD_Putcmd(0xCF);
LCD_putchar( );
blink=0;
}
if (on_off==1)
{
if (blink==0) {
LCD_Putcmd(0xCF);LCD_putchar(!);blink=1;delay_ms(250);}
else
{LCD_Putcmd(0xCF);LCD_putchar( );blink=0;delay_ms(250);}
}
}
}//end main
#INT_EXT
void test()
{
if (do_F == 1) do_F=0;
else
do_F=1;
}
void convert_bcd(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang tram va hang chuc
low = low + 0x30;

high = high + 0x30;


}
void bao_dong(){
int8 i;
if (blink == 0) blink = 1;
else
blink=0;
for(i=0;i<50;i++)
{
LCD_Putcmd(0xCF);
if (blink==0) LCD_putchar(!);
else
LCD_putchar( );
}
}
Di y l mt s dng PIC v LM335 o nhit , hin th trn LCD.
Trong chng trnh bn thy c hm chuyn i nhit t a tr K v
C. Nguyn nhn c hm l do con LM335 thay i 10mV/K, ta cn hin th l
C. Nhn thy 0oC = 273K, nh vy ti 0oC con LM335 s xut ra mt in p
l 2.73V v vi in p ny, ADC trong PIC s cho gi tr s l: (2.73*1023)/5 =
558 . 5585 . Nh vy khi tnh ton gi tr nhit ta cn tr i gi tr 558.558 ny.
Cng thc y l:
Do_C= [(adc_value)- 558.558] / 2.048
Gi tr 2.048 c l do ta dng ADC 10bit, in p ly mu l 5V, nh vy mi
mc lng t s tng ng vi 5V/1024 = 4.883mV.
LM335 thay di 10mV/K do ng vi s thay i 1 C s thay i 2.048 mc
lng t (10mV/4.883mV = 2.048). Cng thc trn l cho ADC 10bit, vi cc b
ADC 8bit hay 12bit vic tnh ton chuyn i gi tr cng tng t.

Mch o nhit LM335 hin th trn LCD 16x2

Bi 4: Chuyn i ADC - Cc Hm Vo/Ra trong CCS

I /X L ADC :
+ PIC c nhiu chn phc v x l ADC vi nhiu cch thc khc nhau . dng
ADC , bn phi c khai bo #DEVICE cho bit dng ADC my bit ( tu chip h
tr , thng l 8 hay 10 bit hoc hn) . Bn cn lu l: 1 VDK h tr ADC 10 bit
th gi tr vo lun l 10 bit , nhng chia cho 4 th cn 8 bit . Do 1 bin tr chit
p cp cho ng vo ADC m bn chn ch 10 bit th s rt nhy so vi ch 8
bit ( v 2 bit cui c thay i cng khng nh hng gi tr 8 bit cao v do kt
qu 8 bit ADC t thay i ) , nu chng trnh c ch kim tra ADC cp nht
tnh ton , hay dng ngt ADC , th n s chy hoi thi . Dng ADC 8 bit s hn
ch iu ny . Do m CCS cung cp chn la ADC 8 hay 10 bit ty mc ch
s dng .
Cu hnh b ADC :
+ Thng dng nht khi dng ADC l s dng 1 bin tr , iu chnh bi 1 nt vn ,
qua thu c 1 in p nh hn in p tham chiu ( Vref p max ) , a vo
chn bin i ADC , kt qu cho 1 gi tr s ADC 8 bit ( 0-255 ) hay ADC 10 bit
(0-1023 ) . Thng th p Vref ly bng Vdd ( 5V ).
+ Trn cc PIC c ng AVdd v AVss ( PIC 18 ) , thng th bn lun ni AVdd
ti Vdd , AVss ti Vss m bo hat ng cho lp trnh qua ICD 2 .
Cc hm sau phc v ADC :
1 / Setup_ADC ( mode ) :
+ Khng tr v tr . Dng xc nh cch thc hot ng b bin i ADC . Tham
s mode tu thuc file thit b *.h c tn tng ng tn chip bn ang dng , nm
trong th mc DEVICES ca CCS . Mun bit c bao nhiu tham s c th dng
cho chip , bn m file tng ng c , tm ti ch cc nh ngha cho chc nng
ADC dng cho chip tng ng vi hm ny . Sau y l cc gi tr mode ca
16F877 , ( 1 s khc c th khng c hoc c thm nh 16F877A c thm 1 s
th l ADC_CLOCK_DIV_2/4/8/16/32/64 . . .) :

ADC_OFF : tt hot ng ADC ( tit kim in , dnh chn cho hot ng khc )
.
ADC_CLOCK_INTERNAL : thi gian ly mu bng xung clock IC ( mt 2-6 us
) thng l chung cho cc chip .
ADC_CLOCK_DIV_2 : thi gian ly mu bng xung clock / 2 ( mt 0.4 us trn
thch anh 20MHz )
ADC_CLOCK_DIV_8 : thi gian ly mu bng xung clock / 8 ( 1.6 us )
ADC_CLOCK_DIV_32 : thi gian ly mu bng xung clock / 32 ( 6.4 us )

2 / Setup_ADC_ports ( value )
+ Xc nh chn ly tn hiu analog v in th chun s dng . Ty thuc b tr
chn trn chip , s chn v chn no dng cho ADC v s chc nng ADC mi
chip m value c th c nhng gi tr khc nhau. Xem file tng ng trong th
mc DEVICES bit s chc nng tng ng chip . tng thch chng
trnh vit cho phin bn c , 1 s tham s c 2 tn khc nhau ( nhng cng chc
nng do nh ngha cng a ch ) , y dng phin bn 3.227 .Lu : Vref : p
chun , Vdd : p ngun .
Sau y l cc gi tr cho value ( ch dng 1 trong cc gi tr ) ca 16F877 :
ALL_ANALOGS .........: dng tt c chn sau lm analog : A0 A1 A2 A3 A5
E0 E1 E2 (Vref=Vdd)
NO_ANALOG ..............................................................: khng dng analog , cc
chn s l chn I /O .
AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF .: A0 A1 A2 A5 E0 E1 E2
VRefh=A3
AN0_AN1_AN2_AN3_AN4 .....................................: A0 A1 A2 A3 A5
( tn th ging nhau cho tt c thit b nhng 16F877 ch c portA c 5 chn nn
A0 , A1 , A2 , A5 c dng , A6 , A7 khng c )
AN0_AN1_AN3 .......................................................: A0 A1 A3 , Vref = Vdd
AN0_AN1_VSS_VREF ..............................................: A0 A1 VRefh = A3
AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF ......: A0 A1 A5 E0 E1 E2
VRefh=A3 , VRefl=A2 .
AN0_AN1_AN2_AN3_AN4_AN5 ............................: A0 A1 A2 A3 A5 E0
AN0_AN1_AN2_AN4_AN5_VSS_VREF .................. : A0 A1 A2 A5 E0
VRefh=A3

AN0_AN1_AN4_AN5_VREF_VREF .........................: A0 A1 A5 E0 VRefh=A3


VRefl=A2
AN0_AN1_AN4_VREF_VREF .................................. : A0 A1 A5 VRefh=A3
VRefl=A2
AN0_AN1_VREF_VREF ...........................................: A0 A1 VRefh=A3
VRefl=A2
AN0 ..............................................................................: A0
AN0_VREF_VREF ..................................................... : A0 VRefh=A3
VRefl=A2
VD : setup_adc_ports (AN0_AN1_AN3 ) ; // A0 , A1 , A3 nhn analog , p
ngun +5V cp cho IC s l in p chun .

3 / Set_ADC_channel ( channel ) :
+ Chn chn c vo gi tr analog bng lnh Read_ADC ( ) . Gi
tr channel tu s chn chc nng ADC mi chip .Vi 16F877 , channel c gi tr
t 0 -7 :
0-chn A0, 1-chn A1, 2-chn A2, 3-chn A3, 4-chn A5, 5-chn E0, 6-chn E1,
7-chn E2
+Hm khng tr v tr . Nn delay 10 us sau hm ny ri mi dng hm read_ADC
( ) bo m kt qu ng . Hm ch hot ng vi A /D phn cng trn chip.

4 / Read_ADC ( mode ) :
+ Dng c gi tr ADC t thanh ghi (/ cp thanh ghi ) cha kt qu bin i ADC
. Lu hm ny s hi vng c cho ti khi c ny bo hon thnh bin i
ADC ( s mt vi us ) th xong hm .
+ Nu gi tr ADC l 8 bit nh khai bo trong ch th #DEVICE , gi tr tr v ca
hm l 8 bit , ngc li l 16 bit nu khai bo #DEVICE s dng ADC 10 bit tr
ln .
+ Khi dng hm ny , n s ly ADC t chn bn chn trong
hm Set_ADC_channel( ) trc . Ngha l mi ln ch c 1 knh Mun i
sang c chn no , dng hm set_ADC_channel( ) ly chn . Nu khng c i
chn , dng read_ADC( ) bao nhiu ln cng c .
+ mode c th c hoc khng , gm c :
ADC_START_AND_READ : gi tr mc nh

ADC_START_ONLY : bt u chuyn i v tr v
ADC_READ_ONLY : c kt qu chuyn i ln cui

#DEVCE 8 bit 10 bit 11 bit 16 bit


ADC=8 0-255 0-255 00-255 00-255
ADC=10 x 0-1023 x x
ADC=11 x x 0-2047 x
ADC=16 0-65280 0-65472 0-65504 0-65535
+ 16F877 ch h tr ADC 8 v 10 bit .
VD :
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while ( input(PIN_B0) )
{
delay_ms( 5000 );
value = read_adc();
printf("A/D value = %2x\n\r", value);
}
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
+ Lu : trn PIC 18 , cu trc ADC tng i phc tp , a nng hn nh l cho
php ly 2 mu cng lc , . . . cng s dng vi cc hm trn , c nhiu thng s
trong file *.h , s cp sau .
5 / _ V d :
+ Chng trnh sau ly ADC 8 bit , c v xut ra dy led port B , v xut ra
mn hnh my tnh .
+ Kt ni chn trn 16F877 : RA0 l chn ly Analog vo , p chun l ngun +5V
, mass=0 V

#include <16F877.h >


#use delay( clock=20000000 )
#device *= 16 ADC = 8 // s dng ADC 8 bit , gi tr ADC vo t 0-255
#use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7)
Int8 adc ;
Main( )
{
Setup_ADC ( ADC_internal ) ;
Setup_ADC_ports (AN0);
Set_ADC_channel ( 0 ) ;
Delay_us (10 ); // delay 10 us
While (true )
{ adc = read_adc ( ) ;
Output_B ( adc ) ; // xuat ra port B gia tri bien adc
Printf( gia tri adc la : %u , adc ) ; // in ra man hinh
}
}

// gi tr bin adc t 0-255 , dng chng trnh Serial port Monitor trong mc
Tools ca CCS
gim st gi tr . Nh thit lp tc l 19200 nh khai bo trn .

II / CC HM VO RA TRONG C :
+ Bao gm cc hm sau :
Output_low() Output_high()
Output_float() Output_bit()
Input() Ouput_X()
Input_X() port_b_pullups()
Set_tris_X()

1 / Output_low ( pin ) , Output_high (pin ) :


+ Dng thit lp mc 0 ( low, 0V ) hay m c 1 ( high , 5V ) cho chn IC , pin ch v
tr chn .
+ Hm ny s t pin lm ng ra , xem m asm bit c th .
+ Hm ny di 2-4 chu k my . Cng c th xut xung dng set_tris_X() v #use
fast_io.
VD : chng trnh sau xut xung vung chu k 500ms , duty =50% ra chn B0 ,ni
B0 vi 1 led s lm nhp nhy led .
#include <16F877.h>
#use delay( clock=20000000)
Main()
{ while(1)
{ output_high(pin_B0) ;
Delay_ms(250) ; // delay 250ms
Output_low (pin_B0);
Delay_ms (250 );
}
}

2 / Output_bit ( pin , value ) :


+ pin : tn chn value : gi tr 0 hay 1

+ Hm ny cng xut gi tr 0 / 1 trn pin , tng t 2 hm trn . Thng dng n


khi gi tr ra tu thuc gi tr bin 1 bit no , hay mun xut o ca gi tr ng
ra trc .
VD : Chng trnh xut xung vung chu k 500ms ,duty =50%
int1 x; // Khai bo x, mc nh = 0
Main() //Trong hm main :
{ while (1 )
{ output_bit( pin_B0 , !x ) ;
Delay_ms(250 );
}
}

3 / Output_float ( pin ) :
+ Hm ny set pin nh ng vo , cho php pin mc cao nh 1 cc thu h.

4 / Input ( pin ) :
+ Hm ny tr v gi tr 0 hay 1 l trng thi ca chn IC . Gi tr l 1 bit

5 / Output_X ( value ) :
+ X l tn port c trn chip . Value l gi tr 1 byte .

+ Hm ny xut gi tr 1 byte ra port . Tt c chn ca port u l ng ra .


VD :
Output_B ( 212 ) ; // xut gi tr 11010100 ra port B

6 / Input_X ( ) :
+ X : l tn port ( a, b ,c ,d e ) .
+ Hm ny tr v gi tr 8 bit l gi tr ang hin hu ca port .VD
: m=input_E();

7 / Port_B_pullups ( value ) :
+ Hm ny thit lp ng vo port B pullup ( in tr ko ln) . Value =1 s kch
hot tnh nng ny v value =0 s ngng .
+ Ch cc chip c port B c tnh nng ny mi dng hm ny .

8 / Set_tris_X ( value ) :
+ Hm ny nh ngha chn IO cho 1 port l ng vo hay ng ra. Ch c dng
vi #use fast_IO . S dng #byte to bin ch n port v thao tc trn bin ny
chnh l thao tc trn port .
+ Value l gi tr 8 bit . Mi bit i din 1 chn v bit=0 s set chn l ng vo,
bit= 1 set chn l ng ra .
VD : chng trnh sau cho php thao tc trn portB 1 cch d dng:
#include < 16F877.h >
#use delay(clock=20000000)
#use Fast_IO( B )
#byte portB = 0x6 // 16F877 c port b a ch 6h
#bit B0 = portB. 0 // bin B0 ch n chn B0
#bit B1=portB.1 // bin B1 ch n chn B1

#bit B2=portB.2 // bin B2 ch n chn B2


#bit B3=portB.3 // bin B3 ch n chn B3
#bit B4=portB.4 // bin B4 ch n chn B4

#bit B5=portB.5 // bin B5 ch n chn B5


#bit B6=portB.6 // bin B6 ch n chn B6
#bit B7=portB.7 // bin B7 ch n chn B7
Main()
{ set_tris_B ( 126 ) ; //portB=01111110 b
// B0 l ng vo , thng lm ngt ngoi
//B1 . . . B6 l ng ra , Vd lm 6 ng ra iu ch PWM
//B7 l ng vo , Vd l nhn tn hiu cho php chng hn
if ( B7 ) //nu ng vo chn B7 l 1 th xut 3 cp xung i nghch
{ B1 = 1 ;
B2 = 0 ;
B3 = 1 ;
B4 = 0 ;
B5 = 1 ;
B6 = 0 ;
}
Else B1=B2=B3=B4=B5=B6= 0;
}

+ Lu :
+ Set_tris_B (0 ) : port B =00000000 : tt c chn portB l ng ra
+ set_tris_B ( 1 ) : portB = 00000001 : ch B0 l ng vo , cn li l ng ra
+ set_tris_B ( 255 ) : portB=11111111: tt c chn portB l ng vo. Bn nn dng
gi tr dng nh phn cho d . VD : set_tris_B ( 00110001b ) ;

+ n y l bn c th vit nhiu chng trnh th v ri . Vd nh l dng


ADC iu chnh tc nhp nhy ca dy n led , truyn gi tr 8 bit t chip
ny sang chip khc , . . .
+ VD: Chng trnh sau dng ADC qua chn A0 iu chnh tc nhp nhy
dy n led ni vo portB, c th dng fast_io hay hm output_B () xut gi tr
u c . chng trnh dng hm. Nu ng vo chn C0 =0 th tip tc nhn ADC
v xut ra portB, C0=1 th khng xut
#include <16F877.h>

#device *=16 ADC= 8


#use delay( clock =20000000)
Int8 ADC_delay ;

Void hieu_chinh ( )
{ ADC_delay = read_adc ( 0 ) ;
Output_B ( 0) ; //portB=00000000
Delay_ms ( ADC_delay );
Output_B ( 255 ) ; // portB= 11111111
Delay_ms ( ADC_delay );
}

Main()
{
setup_adc_ports(AN0_AN1_AN3); // A0 , A1 v A3 l chn analog , ta ch cn
dng A0 ly
tn hiu
setup_adc(adc_clock_internal);
set_adc_channel ( 0 ); // chn c ADC t chn A0
while(1)
{ hieu_chinh ( ) ;
If ( input ( pin_C0 )
{ output_B (0 );
Break ; // thot khi vng lp while nh
}
}
}

You might also like