Professional Documents
Culture Documents
//================================================= =======
// 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;
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
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
// 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()
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 .
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
+ 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 ) ;
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
}
}
}