Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
1/32
TUT01.01.PVN
Gửiđến:
www.picvietnam.com
Nộidung:
LậptrìnhchoPICbằngCCS ver3.242
MICROSOFTWORD
Tómtắt:
TàiliệuhướngdẫnsửdụngtrìnhbiêndịchCCScholậptrìnhPIC.TìmhiểutôngquanvềCCS
vàcáchtạomộtProjecttrongCCS.
ChươngtrìnhmẫuchoPIC16F877
Cácvídụlậptrìnhđơngiản:quétLED,ADC,RS232…
1. TổngquanvềCCS
1.1. VìsaotasửdungCCS?
Sựrađờicủamộtloạiviđiềukhiểnđikèmvớiviệcpháttriểnphầnmềm ứngdụngcho
việclậptrìnhchoconviđiềukhiểnđó.Viđiềukhiểnchỉhiểuvàlàmviệcvớihaiconsố0
và1.BanđầuđểviệclậptrìnhchoVĐKlàlàmviệcvớidãycácconsố0và1.Saunàykhi
kiếntrúccủaViđiềukhiểnngàycàngphứctạp,sốluợngthanhghilệnhnhiềulên,việclập
trìnhvớidãycácsố0và1khôngcònphùhợpnữa,đòihỏirađờimộtngônngữmớithay
thế.VàngônngữlậptrìnhAssembly.ỞđâytakhôngnóinhiềuđếnAssmebly.Saunàykhi
ngônngữCrađời,nhucầudùngngônngữCđềthaychoASMtrongviệcmôtảcáclệnh
lậptrìnhchoViđiềukhiểnmộtcáchngắngọnvàdễhiểuhơnđãdẫnđếnsựrađờicủa
nhiềuchươngtrìnhso ạnthảovàbiêndịchCchoViđiềukhiển:KeilC,HT‐PIC,MikroC,
CCS…
TôichọnCCSchobàigiớithiệunàyvìCCSlàmộtcôngcụlậptrìnhCm ạnhchoVi
điềukhiểnPIC.NhữngưuvànhượcđiểmcủaCCSsẽđượcđềcậpđếntrongcácphần
dướiđây.
1.2. GiớithiệuvềCCS?
CCSlàtrìnhbiêndịchlậptrìnhngônngữCchoViđiềukhiểnPICcủahãngMicrochip.
Chươngtrìnhlàsựtíchhợpcủa3trìnhbiêndichriêngbiếtcho3dòngPICkhácnhauđó
là:
‐ PCBchodòngPIC12‐bitopcodes
‐ PCMchodòngPIC14‐bitopcodes
‐ PCHchodòngPIC16và18‐bit
Tấtcả3trìnhbiêndichnàyđuợctíchhợplạivàotrongm ộtchươngtrìnhbaogồmcả
trìnhsoạ
nthảovàbiêndịchlàCCS,phiênbảnmớinhấtlàPCWHCompilerVer3.227
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
2/32
GiốngnhưnhiềutrìnhbiêndichCkhácchoPIC,CCSgiúpchongườisửdụngnắmbắt
nhanhđượcviđiềukhiển PIC vàsửdụng PICtrong cácdựán. Cácchươngtrì nh diều
khiểnsẽđượ
cthựchiệnnhanhchóngvàđạthiệuquảcaothôngquaviệcsửdụngngôn
ngữlạptrìnhcấpcao–NgônngữC
Tàiliệuhướngdẫnsửdụngcórấtnhiều,nhưngchi
tiếtnhấtchínhlàbảnHelpđikèm
theophầnmềm(tàiliệuTiếngAnh).Trongbảntrợgiúpnhàs ảnxuấtđãmôtảrấtnhiềuvề
hằng,biến,chỉthịtiềnxủalý,cấutrúccáccâulệnhtrongchươngtrình,cáchàmtạosẵncho
ngườisửdụng…NgoàiravềTiếngViệtcũngcóbảndịchcủatácgiảTrầnXuânTrường,
SVK2001DHBKHCM.TàiliệunàydịchtrêncơsởbảnHelpc ủaCCS,tuyrằngchưađầy
đủnhưngđâylàmộttàiliệuhay,nếubạntìmhiểuvềPICvàCCSthìnêntìmtàiliệunày
vềđọc.ĐịachỉDownloadtàiliệu:www.picvietnam.com‐>MụcnóivềCCS.
2. TạoPROJECTđầutiêntrongCCS
ĐểtạomộtProjecttrongCCScónhiềucách,cóthểdùng ProjectWizard,ManualCreat,
hayđơngiảnlàtạomộtFilesmớivàthêmvàođócáckhaibáobanđầucầnthiếtvà“bắt
buộc”.
Dướiđâysẽtrìnhbàycáchtạomộtprojecthợplệtheocả3phươngpháp.Mộtđiều ta
cầnchúýkhitạomộtProjectđólà:khitạobắtcứmộtProjectnàomớithìtanêntạomột
thưmụcmớivớitênliênquanđếnProjecttađịnhlàm,rồilưucácfilesvàođó.Khilập
trìnhvàbiêndịch,CCSsẽtạorarấtnhiềufileskhácnhau,dođónếuđểchungcácProject
trognmộtthưmụcsẽrấtmấtthờigiantrongviệctìmkiếmsaunày.Đâycũnglàquytắc
chungkhitalàmviệcvớibấtkỳphầnmềmnào,thiếtkếmạchhaylậptrình.
ViệcđầutiênbạncầnlàmlàkhởiđộngmáytínhvàbậtchươngtrìnhPICCCompiler.
2.1. TạomộtPROJECTsửdụngPICWizard
Trướchếtbạnkhởiđộng chươngtrìnhlàmviệcPICCCompiler.Từgiaodiệnchương
trìnhbạndichuộtchọnProject‐>New‐>PICWizardnhấnnúttráichuộtchọn.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
3/32
Saukhinhấnchuột,mộtcửasổhiệnrayêucầubannhậptênFilescầntạo.Bạntạomột
thưmụcmới,vàothưmụcđóvàlưutênfilescầntạotạiđây.
Hình2.0:CửasổSaveAs
Nhưvậylàxongb ước đầutiên.SaukhinhấnnútSave,mộtc ửasổNewProjecthiệnra.
Trongcủasổnàybaogồmrấtnhiều Tab,mỗiTabmôtảvềmộtvàitínhnăngcủaconPIC.
TasẽchọntínhnăngsửdụngtạicácTabtươngứng.
Dướiđâysẽtrìnhbàyýnghĩatừngmụcchọntrongm ỗiTab.Cácmục
chọnnàychính
làđềcậpđếncáctínhnăngcủamộtconPIC,tùytheotừngloạimàsẽcócácTabtươngứng.
Đốivớitừngdựánkhácnhau,khitacầnsửdụngtínhnă
ngnàocủaconPICthìtasẽchọn
mụcđó.Tổngcộngcó13Tabđẻtalưachọn.Tôigiớithiệu nhữngTabchínhthườnghay
đượcsửdụng.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
4/32
2.1.1. TabGeneral
TabGeneralchophéptalựachọnloạiPICmàtasửdụngvàmộtsốlựachọn
khácnhưchọntầnsốthạchanhdaođộng,thiếtlậpcácbitCONFIGnhằmthiết
lập
chếđộhoạtđộngchoPIC.
Hình2.1:TabGeneral
‐ Device:LiệtkêdanhsáchcácloạiPIC12F,16F,18F…TasẽchọntênViđiềukhiển
PICmàtasửdụngtrongdựán.LấyvídụchọnPIC16F877A
‐ OscilatorFrequency:Tầnsốthạchanhtasửdụng,chọn20MHz(tùytừngloại)
‐ Fuses:ThiếtlậpcácbitConfignhư:Chếđộdaođộng(HS,RC,Internal),chếđộbảo
vệCode,Brownoutdetected…
‐ ChọnkiểucontrỏRAMlà16‐bithay8‐bit
2.1.2. TabCommunications
TabCommunicationsliệtkêcácgiaotiếpnốitiếpmàmộtconPIChỗ trợ,thườnglà
RS232vàI2C,cùngvớicáclựachọnđểthiếtlậpchếđộhoạtđộngchotừngloạigiaotiếp.
GiaotiếpRS232
MỗimộtViđiềukhiểnPIChỗtrợmộtcổngtruyềnthôngRS232chuẩn.Tabnày
chophéptalựachọnchânRx,Tx,tốcđộBaud,Databit,BitParity…
GiaotiếpI2C
ĐểsửdụngI2C
tatíchvàonútchọnUseI2C,khiđótacócáclựachọn:Chân
SDA,SCL,Tốcđộtruyền(Fast‐Slow),chếđộMasterhaySlave,địachỉchoSalve.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
5/32
Hình2.2:TabCommunications
2.1.3. TabSPIandLCD
TabnàyliệtkêchongườidùngcáclựachọnđốivớigiaotiếpnốitiếpSPI,chuẩn
giaotiếptốcđộcaomàPIChỗtrợvềphầncứng.Chúýkhi
tadùngI2Cthìkhông
thểdùngSPIvàngượclại.Đểcóthểsửdụngcảhaigiaotiếpnàycùngmộtlúcthì
buộcmộttrong2giaotiếpphảilậptrìnhbằngphầnmềm(giồng
nhưkhidùngI2C
chocácchipAT8051,khôngcóhỗtrợphầncứngSSP).
PhầncấuhìnhchoLCDdànhchocácchípdòng18Fvà30F.
Hình2.3:TabSPIandLCD
2.1.4. TabTimer
Liệtkêcácbộđếm/địnhthờimàcácconPICdòngMid‐rangecó:Timer0,timer1,
timer2,WDT…
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
6/32
Trongcác lựa chọncấuhìnhchocácbộđếm/địnhthời có: chọn nguồn xung
đồnghồ(trong/ngoài),khoảngthờigianxảyratràn…
Hình2.4:TabTimer
2.1.5. TabAnalog
Liệtkêcáclựachọnchobộchuyểnđổitươngtự/số(ADC)củaPIC.Tùy vào
từngICcụthểmàcócáclựachọnkhácnhau,baogồm:
‐ Lựachọncổngvào
tươngtự
‐ Chọnchânđiệnáplấymẫu(Vref)
‐ Chọnđộphângiải:8‐bit=0~255hay10‐bit=0~1023
‐ NguồnxungđồnghồchobộADC(tronghayngoài),từđómàtacóđược
tốc
độlấymẫu,thườngtachọnlàinternal2‐6us.
‐ KhikhôngsửdụngbộADCtachọnnone
Hình2.5:TabAnalog
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
7/32
2.1.6. TabOther
TabnàychophéptathiếtlậpcácthôngsốchocácbộCapture/Comparator/PWM.
Capture‐Bắtgiữ
‐ Chọnbắtgiữxungtheosườndương(risingedge)haysườnâm(fallingedge )của
xungvào
‐ Chọnbắtgiữsau1,4hay16xung(copygiátrịcủaTimerXvàothanhghilưutrữ
CCCPxsau1,4hay16xung).
Compare‐Sosánh
‐ Tacócáclựachọnthựchiệnlệnhkhixayưrabằngnhaugiữa2đốitượngsosánhlà
giátrịcủaTimer1vớigiátrịlưutrongthanhghiđểsosánh.Baog ồm:
o Thựchiệnngắtvàthiếtlậpmức0
o Thựchiệnngắtvàthiếtlậpmức1
o ThựchiệnngắtnhưngkhôngthayđổitrạngtháicủachânPIC.
o ĐưaTimer1về0nhưngkhôngthayđổitrạngtháichân.
PWM‐Điềuchếđộrộngxung
‐ Lựachọnv ềtầnsốxungravàdutycycle.Tacóthểlựachọnsẵnhaytựchọntầnsố,
tấtnhiêntầnsốraphảinằmtrongmộtkhoảngnhấtđịnh.
Comparator‐Sosánhđiệnáp
‐ LựachọnmứcđiệnápsosánhVref.Córấtnhiềumứcđiệnápđểtalựachọn.Ngoài
ratacòncóthểlựachọnchođầuvàocủacácbộsosánh.
Hình2.6:TabOther
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
8/32
2.1.7. TabInterruptsvàTabDriver
TabInterruptschophéptalựachọnnguồnngắtmàtamuốnsửdụng.Tùyvàotừng
loạiPIC màsốlượng nguồnngắt khácnhau,bao gồm:ngắtngoài 0(INT0), ngắtRS232,
ngắtTimer,ngắtI2C‐SPI,ngắtonchangePORTB.v.v…
TabDriversđượcdùngđểlựachọnnhữngngoạivimàtrìnhdịchđãhỗtrợcáchàm
giaotiếp.ĐâylànhưngngoạivimàtasẽkếtnốivớiPIC,trongcácICmàCCShỗtrợ,đáng
chú ý là các loại EEPROM như 2404, 2416, 2432, 9346, 9356…Ngoài ra còn có IC RAM
PCF8570,ICthờigianthực DS1302,Keypad3x4,LCD,ADC…Chitiếttacóthểxemtrong
thưmụcDrivercủachươngtrình:\ \PICC\Drivers
Hình2.7:TabInterrupts
Hình2.8:TabDriver
Saucácbướcchọntrên,tanhấnOKđểkếtthúcquảtrìnhtạomộtProjecttrongCCS,
mộtFilesten_project.cđượctạora,chứanhữngkhaibáocầnthiếtchoPICtrongmộ
tFiles
ten_project.h.Dướiđâylànộidungmộtfileschươngtrìnhmẫu.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
9/32
Chuong_trinh_mau.c
#includeʺD:\1‐PICproject\chuongtrinhtest.HEX.hʺ
#int_EXT
EXT_isr()
{
//Codehere
}
VoidChuong_trinh_con()
{
//Codehere
}
voidmain()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(INT_TBE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
//Enteryourcodehere
}
Chuong_trinh_mau.h
#include<16F877A.h>
#deviceadc=8
#FUSESNOWDT,HS,NOPUT,NOPROTECT,NODEBUG,
#usedelay(clock=20000000)
#defineSRAM_SCLPIN_C3
#defineSRAM_SDAPIN_C4
#users232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
10/32
2.2. MẫuchươngtrìnhchuẩncholậptrìnhCCS
PhầntrêntađãtìmhiểucáchtạomộtProjecttrongCCS,tuynhiêntheocáchđómất
khánhiềuthờigian,mặtkhácmỗingườilậptrìnhsẽtạoranhưngformtàiliệutheocách
riêngkhácnhau,khôngđồngnhất.Tàiliệukhôngđượcchuẩnhóasẽgâymộtsốkhókhăn
chongườiđọc,ngườiđọccóthểkhônghiểuhếtnhữnggìmàngườilậptrìnhmuốndiễnđạt.
VớimụcđíchđưaramộtformtàiliệuchuẩnchoviệclậptrìnhbằngCCS,quathamkhảo
bảnmẫucholậptrìnhbằngASMcủaanhFalleaftrêndiễnđànWWW.PICVIETNAM.COM
tôiđưarađâymộtformtàiliệuchoviệcviếtlậptrìnhbằngCCS.Đikèmvănbảnnàycòncó
cácfilesnguồnchovănbảnmẫu,baogồmfileschoPIC16F877A,16F876A,16F88.Về
saukhi
lậptrìnhbạnchỉviệccopytàiliệunàyvàothưmụcchứaProjectcủabạn,sửađổitênfiles.
KhicầnthayđổinộidungcấuhìnhchoPICbạnchiviệcthamkh
ảoquaPICWizard,xem
codevàcopyđưavàoProject.
Môtảnộidungchươngtrình.
‐ #include16f877a.h:Đikèmchươngtrìnhdịch,chứakhaibáovềcácthanhghitrong
mỗiconPIC,dùngchoviệccấu
hìnhchoPIC.
‐ #includedef_877a.h:Filesdongườilậptrìnhtạora,chứakhaibáovềcácthanhghi
trongPICgiúpchoviêclậptrìnhđượcdễdanghơnvídụtacothểgánPORTB=
0xAA(chitiếtfilesnàysẽtrìnhbàytrongphầndướiđây)
‐ #device*=16ADC=10:Khaibáodùngcontrỏ8hay16bit,bộADClà8hay10bit
‐ #FUSESNOWDT,HS:KhaibáovềcấuhìnhchoPIC
‐ #usedelay(clock=20000000):Tầnsốthạchanhsửdụng
‐ #users232(baud=9600,…):KhaibáochogiaotiếpnốitiếpRS232
‐ #usei2c(master,SDA=PIN_C4,…):KhaibáodùngI2C,chếđộhoạtđộng
‐ #include<tên_file.c>:KhaibáocácfilesthưviệnđượcsửdụngvídụLCD_lib_4bit.c
‐
#INT_xxx:Khaibáođịachỉchươngtrìnhphụcvụngắt
‐ Voidtên_chương_trình(tên_biến){}:Chươngtrìnhchínhhaychươngtrìnhcon
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
11/32
ChươngtrìnhmẫuchoPIC16F877A
//========================================================
//Tenchuongtrinh :MachtestdenLED_1
//Nguoithuchien :Falleaf
//Ngaythuchien :23/05/2005
//Phienban :1.0
//Motaphancung :DungPIC16F877A‐thachanh20MHz
// :LEDgiaotiepvoiPORTB
// :CucamcuaLEDnoivoiGND
// :RB0‐RB7lacacchanoutput
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Ngayhoanthanh :23/05/2005
//Ngaykiemtra :23/05/2005
//Nguoikiemtra :DoanHiep
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Chuthich :Motacacdiemkhacnhaucuacacphienbankhacnhau
// :hoaccacchuthichkhac
// :vd,dungchedoPowerOnReset,PORTB=00000000
// :hoac,chuongtrinhvietchoPICTutorial
// :hoac,chuongtrinhnayhoantoanmienphivacothedungcho
// :moimucdichkhacnhau
//========================================================
#include<16f877a.h>
#include<def_877a.h>
#device*=16ADC=8
#FUSESNOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP
#usedelay(clock=20000000)
#users232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9)
#usei2c(Master,Fast,sda=PIN_B1,scl=PIN_B4)
#int_xxx//Khaibaochuongtrinhngat
xxx_isr(){
//Codehere
}
voidTen_chuong_trinh_con(Ten_Bien){
//Codehere
}
voidmain(){
//Entercodehere!
}
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
12/32
ChươngtrìnhmẫuchoPIC16F876A
//========================================================
//Tenchuongtrinh :MachtestdenLED_1
//Nguoithuchien :Falleaf
//Ngaythuchien :23/05/2005
//Phienban :1.0
//Motaphancung :DungPIC16F876A‐thachanh20MHz
// :LEDgiaotiepvoiPORTB
// :CucamcuaLEDnoivoiGND
// :RB0‐RB7lacacchanoutput
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Ngayhoanthanh :23/05/2005
//Ngaykiemtra :23/05/2005
//Nguoikiemtra :DoanHiep
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Chuthich :Motacacdiemkhacnhaucuacacphienbankhacnhau
// :hoaccacchuthichkhac
// :vd,dungchedoPowerOnReset,PORTB=00000000
// :hoac,chuongtrinhvietchoPICTutorial
// :hoac,chuongtrinhnayhoantoanmienphivacothedungcho
// :moimucdichkhacnhau
//========================================================
#include<16f876a.h>
#include<def_876a.h>
#device*=16ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD,
NOWRT
#usedelay(clock=20000000)
#users232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9)
#usei2c(Master,Fast,sda=PIN_B1,scl=PIN_B4)
#int_xxx//Khaibaochuongtrinhngat
xxx_isr(){
//Codehere
}
voidTen_chuong_trinh_con(Ten_Bien){
//Codehere
}
voidmain(){
//Entercodehere!
}
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
13/32
ChươngtrìnhmẫuchoPIC16F88
//========================================================A
//Tenchuongtrinh :MachtestdenLED_1
//Nguoithuchien :Falleaf
//Ngaythuchien :23/05/2005
//Phienban :1.0
//Motaphancung :DungPIC16F88‐thachanh20MHz
// :LEDgiaotiepvoiPORTB
// :CucamcuaLEDnoivoiGND
// :RB0‐RB7lacacchanoutput
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Ngayhoanthanh :23/05/2005
//Ngaykiemtra :23/05/2005
//Nguoikiemtra :DoanHiep
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Chuthich :Motacacdiemkhacnhaucuacacphienbankhacnhau
// :hoaccacchuthichkhac
// :vd,dungchedoPowerOnReset,PORTB=00000000
// :hoac,chuongtrinhvietchoPICTutorial
// :hoac,chuongtrinhnayhoantoanmienphivacothedungcho
// :moimucdichkhacnhau
//========================================================
#include<16f88.h>
#include<def_88.h>
#device*=16ADC=8
#FUSESNOWDT,HS,NOPUT,MCLR,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#usedelay(clock=20000000)
#users232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9)
#usei2c(Master,Fast,sda=PIN_B1,scl=PIN_B4)
#int_xxx//Khaibaochuongtrinhngat
xxx_isr(){
//Codehere
}
voidTen_chuong_trinh_con(Bien){
//Codehere
}
voidmain(){
//Entercodehere!
}
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
14/32
3. MộtsốvídụcholậptrìnhCCS
Vớimục tiêugiúpngườiđọcnhanhchónglắmbắtđượccáchlậptrìnhCchoPICthông
quachươngtrìnhdịchCCS.DướiđâytôigiớithiệumộtvàibàilậptrìnhđơngiảnchoPIC,
cácbàimẫunàydựatheotàiliệututorialcủaNigelnhưquétLED,LED7thanh,LCD,bàn
phím…,cáchdùngcácgiaotiếpcủaPICđểgiaotiếpvớithiếtbịngoạivinhưRealTimeIC,
ADC,EEPROM…
• Yêucầuvềphầncứngtốithiểucầncóđểthựchành:
‐ PIC16F877A(hoặc16F876Ahay16F88)=50K(TốtnhấtlàPIC16F877A)
‐ 1Boardcắmlinhkiện(tốithiểu)=40K
‐ Thạchanh20MHz,tụ22pF,10uF,trở10K,4K7,330Ω,nútbấm=10K
‐ 10LEDđơnxanhhayđỏ,4LED7thanh(loại4LEDliềnmộtđế)=15K
‐ MAX232đểgiaotiếpmáytính()=10K
Tổngcộnglà:125K
• Phầncứngmởrộng
‐ LCD1602Aloại2dòng16kýtự(NếucóLCD2002càngtốt)=65K(MinhHàcóbán)
‐ RealTimeICDS1307hayDS1337=25K(cóthểxinsamplecủaMaxim‐IC)
‐ EEPROMAT24Cxx
‐ ADC/DACICloại12‐bittrởnên(ADC10‐bitthìPICcũngcó)
‐ SensornhiêtLM335hayLM35=13K
‐ Độngcơbước,độngcơmộtchiều
Mụcđíchchínhcủatôitrongviệcgiớithiệucácvídụdướiđâylànhằmgiúpmọingười
nhanhchóngnắmđượckỹthuậtlậptrìnhbằngCCS,thôngquacácvídụmọingườisẽ
hiểucáchàmcủa
CCS,cáchsửdụngtrongtừngứngdụngcụthể.Vềchitiếtcủamỗihàm
tôisẽkhôngtrìnhbàykỹtạiđây,đểbiếtrõtacóthểxemtrongphầnTrợgiúpcủaCCShay
tàiliệu
củatácgiảTrầnXuânTrường,trongđóđãnóikháđầyđủ.Tôinhấnmạnhmột
điềukhimọingườitìmhiểu vềPICvàCCSđólàhãytựmìnhtìmhiểulàchính,từviệc
nghiêncứutàiliệu,tìmtàiliệuchođềnthiếtkếmạchvàviếtchươngtrình.Nhữnggìtại
đâychỉlàcơbản,cònviệcpháttriển,sửdụnghếtđiểmmạnhc
ủaPICvàCCSlàởphíamọi
người.Chúcthànhcông!
Mộtđiềuchúýlà tất cảcácmạchđiệnvàcodetôitrìnhbàydướiđâytôiđềuđãlắp
mạchthậttrênbocắmvà
chạytốt.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
15/32
3.1. ChươngtrìnhnhấpnháyLED
NhấpnháyLEDcóthểcoilàmộtchươngtrình“Kinhđiển”.Mỗingườikhibắttayvào
họcVĐKthìbàihọcđầutiênlàlàmnhấpnháymộthayvàiconLEDtrênchânVĐK.Trong
tàiliệunàytôicũngchọnbàitậpđóđểbắtđầu.Bảnthântôicũngvậy,bàihọcđầutiênlà
nháyLEDvàquétLED7thanh
Mụcđíchcủabàinhưtrênđãnói:Làmnhấpnháy8LEDtạiPORTBcủaPIC16F877A,
thờigiantrễdongườilậptrìnhđịnhtrước.
Nhữngđiềuthuđượcquabàihọc:
‐ VẽmộtmạchđiệntửhoànchỉnhdùngOrCad9.2
‐ TạomộtDựántrongCCS(cáinàyđãnóitrongphần2)
‐ TệpđịnhnghĩacácthanhghicủaPICdongườidùngtạora
‐ ThiếtlậpchếđộvàorachomộtcổngcủaPIC
‐ Sửdụnghàmtạotrễthờigian
Dướiđâylàsơđồphầncứng.TrongsơđồcácLEDđượcmắcchunglêndươngnguồn
thôngquađiệntrở.Giatrịđiệntrởthayđổitrongkhoảng100Ωchođến560Ωtùytheođộ
sángcủaLEDmàtamuốnvàcũngđểđảmbảodòngquamỗiLEDkhôngquá20mAkhi
nguồncấplà5
V
.NhưvậyđểlàmsángLEDtachỉviệcđưamức0racácchânPICvàngược
lạiđểtắttađưamức1.
C1
22p
OSC2
Y1
20MHz
RB4
D6
LED
RESET
D7
LED
VCC
OSC2
RB7
RB3
C2
22p
RB1
OSC1
RB2
RB7
R5
R
RB1
R1
R
RESET
D2
LED
VCC
RB0
D1
LED
RB2
RB4
D4
LED
R6
R
OSC1
R2
R
RB3
RB5
Cong tac
R7
R
D3
LED
R4
R
D8
LED
R9
10K
VCC
R3
R
RB6
2
3
4
5
6
7
33
34
35
36
37
38
39
40
15
16
17
18
23
24
25
26
19
20
21
22
27
28
29
30
8
9
10
12
31
1
13
14
11
32
RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/T0CKI/C1OUT
RA5/AN4/SS/C2OUT
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
VSS
VSS
MCLR/VPP
OSC1/CLKI
OSC2/CLKO
VDD
VDD
RB5
RB6
D5
LED
R8
220
RB0
Hình3.1.Sơđồmạchnháy8LEDtạiPORTB
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
16/32
C4
100uF/50V
D9
LED
VCC
C3
4.7uF/25V
VDD
U3
LM7805C/TO220
1 3
IN OUT
R11
R
Hình3.2.SơđồmachnguồnchoPIC
MãnguồnchươngtrìnhnạpvàoPIC
//========================================================
//Tenchuongtrinh:MachnhaydenLED
//Nguoithuchien :linhnc308
//Ngaythuchien :13/03/2006
//Phienban :1.0
//Mota
phancung :DungPIC16F877A‐thachanh20MHz
// :LEDgiaotiepvoiPORTB
// :CucamcuaLEDnoivoiPORTB
// :RB0‐RB7lacacchanoutput
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Ngayhoanthanh:13/06/2006
//Ngaykiemtra :13/06/2006
//Nguoikiemtra
:linhnc308
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Chuthich :dungchedoPowerOnReset,PORTB=00000000
// :chuongtrinhvietchoPICTutorial
// :chuongtrinhnayhoantoanmienphivacothedungcho
// :moimucdichkhacnhau
//========================================================
#include<16f877a.h>
#include<def_877a.h>
#device*=16ADC=8
#FUSESNOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,
NOLVP,NOCPD,NOWRT
#usedelay(clock=20000000)
voidmain()
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
17/32
{
//ThietlapchedochoPORTB
TRISB=0x00; //TatcaPORTBdeulacongxuatdulieu
PORTB=0xFF; //TathetcacLED
While(1)
{
PORTB=0; //ChocácLEDsáng
delay_ms(250); //Tạothờigiantrễ250ms
PORTB=0xFF;
delay_ms(250);
}
}
QuavídụđơngiảntrênbạnhiểucáchxuấtdữliệuramộtcổngcủaPIC vàdùng các
hàmtạotrễ.
ThủtụcthiếtlậpvàorachomộtcổnghaymộtchâncủaPIC
‐ GhigiátrịvàothanhghiđiềukhiểnchếđộcủacổngtươngứnglàTRISx
o Bit0ứngvớichânxuấtdữliệu
o Bit1ứngvớinhậndữliệu
o ThanhghiTRISxcóthểcâuhìnhtheotừngbit
‐ Khimuốnxuấtdữliệu,vídụraPORTB,câulệnhlà:PORTB=gia_tri;
‐ KhimuônnhậndữliệutừPORTB,câulệnhlà:data_in=PORTB;
Vềcáchàmtạotrễ,trongCCShỗtrọsẵn3loạihàmtạotrễlà:
‐ delay_cycles(gia_tri):gia_trilàthờigiantrễtínhtheosốchukỳmáy
‐ delay_us(gia_tri):TạotrễMicrogiây
‐ delay_ms(gia_trị):Tạo
trễMiligiây
BảnchấtcủacáchàmtạotrễlàđưaViđiềukhiểnvàomộtvònglặpchẳnglàmgìcảcho
đủsốthờigianmàtacần.Ngoàiviệcdùnghàmtạotrễcósẵntacóthểtựviếthàmtạotrễ
dùngbộTimer
3.2. BộADCtrongPICvàứngdụng
Bộchuyểnđổitừtươngtựsangsốlàmộtkhốimạchđiệntửquantrọng,cómặttrong
rấtnhiềuthiếtkếđiệntử.CácbộADCthựctếđượcđónggóitrongnhữngICchuyêndụng,
donhiềuhãngsảnxuất.Điểmquantrongc ầnlưuýởcácbộADCnàylàđộphângiảivà
tốcđộlấymẫutìnhiệu.ĐộphângiảicủabộADCcóthểlà8‐bít,10‐bít,12‐bít,16‐bít,24‐
bít…TốcđộlấymẫucủaADCcóthểnhanhhaychậm,tùytừngứngdụngmàtachọntốc
độthíchhợp.
ViđiềukhiểnPIClàmộttrongnhữngdòngViđiềukhiểncóphầngiaotiếpngoạivi
mạnhvàđadạng.BêntrongPICđãđượctíchhợpsẵnmộtbộADCcóđộphângiảitốiđa
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
18/32
là10‐bít(tùychonlà8‐bithay10‐bit).VớibộADCtrongPICtacóthểlàmđượckhánhiều
côngviệc,dướiđâytôitrìnhbàymộtứngdụngcủabộADCtrongviệcthiếtkếmạchđo
nhiệtđộsửdụngsensornhiệtLM335.
Dướiđâylàphầncodemạchđonhiệtdộ,hiểnthịtrênLCD.
//========================================================
//Tenchuongtrinh :Machdonhietdo
//Nguoithuchien:linhnc308
//Ngaythuchien :28/03/2006
//Phienban:1.0
//Motaphancung :DungPIC16F877A‐thachanh20MHz
// :LCDgiaotiepvoiPORTD
// :Daura
LM335duavaochanAN0
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Ngayhoanthanh :28/03/2006
//Ngaykiemtra :28/03/2006
//Nguoikiemtra :Linhnc308
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
//Chuthich:hoaccacchuthichkhac
// :dungchedoPowerOnReset
// :chuongtrinhvietcho
PICTutorial
//========================================================
#include<16F877A.h>
#include<def_877a.h>
#device*=16adc=10
#FUSESNOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,
NOLVP,NOCPD,NOWRT
#usedelay(clock=20000000)
#users232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#include<lcd_lib_4bit.c> //ThuvienhamchoLCD
int8low,high,key,mode,min,max,mode1,i;
int1do_F;
voidconvert_bcd(int8x);
voidbao_dong();
voidtest();
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
voidmain()
{
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
19/32
floatvalue;
on_off=1;
min=15;//nhietdomindefault
max=35;//nhietdomaxdefault
do_F=0;
i=50;
mode=0;
mode1=0;
trisa=0xFF;
trisb=0x01;
trisd=0x00;
LCD_init();
Printf(LCD_putchar,ʺLopDT8‐BKHNʺ
);
LCD_putcmd(0xC0);
Printf(LCD_putchar,ʺKhoitao ʺ);
//Khoitaochongatngoai
enable_interrupts(INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
//KhoitaochedochoboADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
//Laymaunhietdolandautien
value=(float)read_adc();
value=(value‐558.5)/2.048;//For5Vsupply
//value=(value‐754.8)/2.048;//For3.7VSupply
//value=(value‐698.2)/2.048;//For4Vsupply
convert_bcd((int8)value);//Tachsotram,chuc,donvidehienthilenLED7
delay_ms(1000);
LCD_putcmd(0xC0);
Printf(LCD_putchar,ʺKhoitaoxongʺ);
while(1)
{
if(i==50)
{
value=read_adc();
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
20/32
value=(value‐558.5)/2.048;
if(do_F==1)value=1.8*value+32;
convert_bcd((int8)value);
printf(ʺ\n\rNhietdophong:%uʺ,value);//Guigiatrilenmaytinh
LCD_putcmd(0xC0);
printf(LCD_putchar,ʺTemp=ʺ);
LCD_putchar(high);LCD_putchar(low);
if(do_F==0)printf(LCD_putchar,ʺCʺ);
elseprintf(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);}
}
}
}//endmain‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
#INT_EXT
voidtest()
{
if(do_F==1)do_F=0;
elsedo_F=1;
}
voidconvert_bcd(int8x)
{
low=x%10;//chialayphandu,sohangdonvi
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
21/32
high=x/10;//tachhangtramvahangchuc
low=low+0x30;
high=high+0x30;
}
voidbao_dong(){
int8i;
if(blink==0)blink=1;
elseblink=0;
for(i=0;i<50;i++)
{
LCD_Putcmd(0xCF);
if(blink==0)LCD_putchar(ʺ!ʺ);
elseLCD_putchar(ʺʺ);
}
}
DướiđâylàmộtsơđồdùngPICvàLM335đểđonhiệtđộ,hiểnthịtrênLCDvàtrên
LED7.TrongchươngtrìnhbạnthấycóhàmchuyểnđổinhiệtđộtừíatrịđộKvềđộC.
NguyênnhâncóhàmđólàdoconLM335thayđổi10mV/K,tacầnhiểnthịlàđộC.Nhận
thấy0
o
C=273K,nhưvậytại0
o
CconLM335sẽxuấtramộtđiệnáplà2.73Vvàvớiđiệnáp
này,ADCtrongPICsẽchogiátrịsốlà 558.558
5
1023*73.2
= .Nhưvậykhitínhtoángiátrị
nhiệtđộtacầntrừđigiátrị558.558này.Côngthứcđầyđủlà:
048.2
558.558_
_
−
=
valueadc
CDo
Giátrị2.048cólàdotadùngADC10‐bit,điệnáplấymẫulà5V,nhưvậymỗimức
lượngtửsẽtươngứngvới
mV
V
883.4
1024
5
= .LM335thaydổi10mV/Kdođóứngvớisụthay
đổi1độCsẽthayđổi2.048mứclượngtử(10mV/4.883mV=2.048).Côngthức trênlàcho
ADC10‐bit,vớicácbộADC8‐bithay12‐bitviệctínhtoánchuyểnđổigiátrịcũngtươngtự.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
22/32
11
12
21
22
23
24
25
26
27
28
14
13
16
17
40
39
38
37
36
35
34
33
4
5
6
7
8
9
10
29
18
19
20
1
2
3
15
30
32
31
VDD
VSS
RD2/PSP2
RD3/PSP3
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
OSC2/CLKO
OSC1/CLKI
RC1/CCP2
RC2/CCP1
RB7/PGD
RB6/PGC
RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT
RA2/AN2
RA3/AN3
RA4
RA5/AN4
RE0/AN5
RE1/AN6
RE2/AN7
RD6/PSP6
RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
VPP
RA0/AN0
RA1/AN1
RC0/T1CKI
RD7/PSP7
VDD1
VSS1
SPEAKER
HI
LM335Z
1 2
3
Q3
HI
1K
33pF
HI
33pF
HI
LCD - 16x2 - DM1602A
U13
LCD_1602A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VSS
VCC
VEE
RS
R/W
E
D0
D1
D2
D3
D4
D5
D6
D7
A
K
10K
VCC
VR10K
HI
4K7Crystal
Hình3.3.MạchđonhiệtđộLM335hiểnthịtrênLCD1602
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
23/32
HI
4K7
Q3
4K7
4K7
11
12
21
22
23
24
25
26
27
28
14
13
16
17
40
39
38
37
36
35
34
33
4
5
6
7
8
9
10
29
18
19
20
1
2
3
15
30
32
31
VDD
VSS
RD2/PSP2
RD3/PSP3
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
OSC2/CLKO
OSC1/CLKI
RC1/CCP2
RC2/CCP1
RB7/PGD
RB6/PGC
RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT
RA2/AN2
RA3/AN3
RA4
RA5/AN4
RE0/AN5
RE1/AN6
RE2/AN7
RD6/PSP6
RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
VPP
RA0/AN0
RA1/AN1
RC0/T1CKI
RD7/PSP7
VDD1
VSS1
4
5
7
9
10
2
1
38
6
a
b
c
d
e
f
g
VCCVcc
DOT
33pF
HI
33pF
LM335Z
1 2
3
HI
HI
Crystal
4
5
7
9
10
2
1
38
6
a
b
c
d
e
f
g
VCCVcc
DOT
VR10K
HI
Q2
SPEAKER
10K
HI
Q1
1K
Hình3.4.MạchđonhiệtđộhiểnthitrênLED7thanh
TrongmạchtrêntadùngchínhconPICchoviệcgiảimãLED7thanh.Nguyêntắcquét
chotừngLED7thanhlàgửigiátrịcầnhiểnthị‐>bậtLED‐>Tạothờigiantrễ‐>t
ắtLED.
QuátrìnhcứlặplạinhưvậychođếnkhiquéthếtLED.Tatínhtoánthờigiantrễsaocho
đảmbảocácsốhiểnthịliêntục.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
24/32
3.3. GiaotiếpmáytínhRS232
ViệcgiaotiếpgiữaViđiềukhiểnvàmáytínhlàbàilậptrìnhkháquantrọngkhitalàm
việcvớicácdòngViđiềukhiểnkhácnhau.VớiViđiềukhiểnPICcũngvậy,trongmỗiIC
PICđềucótíchhợpmộtkhốigiaotiếpmáytínhUSART.Tasửdụngkhốigiaotiếpnàyđể
truyềndữliệulênmáytínhvàxửlýdữliệuđótùyvàomụcđíchcủangườilậptrình.Để
nhậndữliệudoViđiềukhiểntruyềnlênmáytínhtacóthểsửdụngcácphầnmềmgiao
tiếpCOMcósẵnhayviếtmộtchươngtrìnhm
ới,sửdụngcácngônngữlậptrìnhnhưC++,
VBhayDelphi…TrongchươngtrìnhvídụdướiđâytôisửdụngcôngcụsẵncócủaCCSlà
SerialPortMonitorđểtruyềnvànhậndữliệutừPIC.
SơđồmạchđiệnORCAD.MạchsửdụngICMAX232đểkếtnốiđếncổngCOMcủa
máytính.MạchđơngiảnchỉnhằmmụcđíchgiớithiệukhốigiaotiếpmáytínhcủaPICvà
cáchlậptrìnhchonótrongCCS.
RWD6
D4
RX_PIC
C9
1uF
C10
1uF
LCD - 16x2 - DM1602A
LCD_1602A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VSS
VCC
VEE
RS
R/W
E
D0
D1
D2
D3
D4
D5
D6
D7
A
K
D5
HI
33pF
D7
VCC
RX_PC
RX_PIC
RS
U14
MAX232
1
3
4
5
2
6
12
9
11
10
13
8
14
7
C1+
C1-
C2+
C2-
V+
V-
R1OUT
R2OUT
T1IN
T2IN
R1IN
R2IN
T1OUT
T2OUT
10K
D6
VCC
TX_PIC
20MHz
RW
33pF
E
C8
1uF
RS
HI
D5
C7
1uF
D4
D7
TX_PC
TX_PIC
11
12
21
22
23
24
25
26
27
28
14
13
16
17
40
39
38
37
36
35
34
33
4
5
6
7
8
9
10
29
18
19
20
1
2
3
15
30
32
31
VDD
VSS
RD2/PSP2
RD3/PSP3
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
OSC2/CLKO
OSC1/CLKI
RC1/CCP2
RC2/CCP1
RB7/PGD
RB6/PGC
RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT
RA2/AN2
RA3/AN3
RA4
RA5/AN4
RE0/AN5
RE1/AN6
RE2/AN7
RD6/PSP6
RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
VPP
RA0/AN0
RA1/AN1
RC0/T1CKI
RD7/PSP7
VDD1
VSS1
E
HI
Hình3.5.Mạchgiaotiếpmáytính,hiểnthịLCD
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT01.01.PVN
Ngày:
9/8/2006
Trang:
25/32
Mãnguồnchươngtrình:
#include<16f877a.h>
#include<def_877a.h>
#usedelay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,
NOLVP,NOCPD,NOWRT
//KhaibáosửdụnggiaotiếpnốitiếpRS232
#users232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#include<lcd_lib_4bit.c>
int8count=0;
charstring_in[16];
#INT_RDA //Hàmxửlýngắtnốitiế
p
Receive_isr(){
charc;
int8i;
count++;
c=getc();
putc(c);
if(c==ʹcʹ|c==ʹCʹ)
{
LCD_putcmd(0x01);//ClearScreen
c=ʹcʹ;
count=0;
}
if((count<=16)&&(c!=ʹcʹ))LCD_putchar(c);
if(count>16)
{
count=0;
LCD_putcmd(0xC0);
}
}
voidmain()
{