版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、229510303微芯單片機(jī)的CCS編譯器使用交流群,大家一起探討PIC-CCS備程教程RTOS希望盡我的綿薄之力給你一臂之力!贈(zèng)言:生命因抗?fàn)幎鹳F!整理:Frankey2010-5-1rPTT:綁:相信通過前面單片機(jī)課程和智能電子制作二的學(xué)習(xí),大家都已經(jīng)很熟悉51單片機(jī)的編程規(guī)則和編程環(huán)境了,現(xiàn)在我們又將要接觸PIC系列單片機(jī)的編程和學(xué)習(xí),面對(duì)新的開發(fā)環(huán)境和芯片,有些同學(xué)覺得這個(gè)轉(zhuǎn)換很難,其實(shí)一點(diǎn)都不難,大家都要有信心才行,對(duì)于每種芯片和其對(duì)應(yīng)的開發(fā)環(huán)境,大家只要做到把握里面的規(guī)律,學(xué)起來是不會(huì)難的,在下面的學(xué)習(xí)中我們對(duì)PIC系列單片機(jī)選用MPLAB軟件編寫代碼,編譯器選用CCS編譯器,不
2、管是51單片機(jī)系統(tǒng)的開發(fā)還是PIC系列單片機(jī)的開發(fā),其基礎(chǔ)全是C語言(或者匯編語言),所不同的是各個(gè)編譯器擁有不同的數(shù)據(jù)類型定義和各種特殊的處理器指令以及預(yù)處理指令。1、CCS編譯器定義的數(shù)據(jù)類型在編寫程序之前,我們首先需要了解CCS編譯器支持的數(shù)據(jù)類型:*1-2燮類型和比特?cái)?shù)標(biāo)準(zhǔn)類型CCS-PICCJK認(rèn)類型比特?cái)?shù)(位)取值范圍.bittntlshort1*charin.charrsignedchar,int,shortint8t、-124127unsignedcharunsignedint,unsignedchar84255signedcharint8int,char,signedchar
3、,int,shortirit8728127intint16,longint16-3276832767shortint16-3276432767unsignedintunsignedlongint160-65535signedint16-3276832767longintint3232一2147483642147483647unsignedlongintunsignedint323210-4294967295signedk)ngint1signedint3232-214748364(2147483647floati.float321.175e-38-fc3.402e382、CCS編譯器特有的處理
4、器指令以及預(yù)處理指令StandardCDEFINEIDSTRING字ELSE#EMDIFfIFexprplFDEFid京INCLUDE-FILENAME-=MOLIST#PRAGMAm(islINDEFid書ERRORfLISTFunctionQualifier#INLINE#INT_DEFAULT亨INT_GLOBAL=INT_xxxSEPARATEPre-DefinedIdentifier_date_DEVICEFILELINE_PCB_PCM_PCH_FILEtJXiv1E#TASKFUSERTOSDeviceSpecificationfFUSESoptions#IDCHECKSUM#I
5、DNUMBER煮SERIALIZEBuilt-inLibraries#USEDELAYCLOCK#USEFASTJO#USESPI#USEFIXEDJO#USEI2C#USERS232#USESTANDARDJOMemoryControl#ASM多BITi(l=id.const#BITi(l=const.constfBUILD#BYTEil=const字BYTEi(l=id#ENDASM#FILL_ROMLOCATEiit(oonstpin,cltarvjue);charinput(c(5tpin);1.丄$!1voiduipBtJort(chArva!u4$;廠charinpDt_pdtt(
6、).*-voidport_b_pullups(charvalue);voidset_tris_port(charvalue);上表常用的函數(shù)的參數(shù)具體使用規(guī)則可以通過下面兩個(gè)途徑得到:芯片的頭文件(本材料里面采用的芯片為PIC16fB83,所以可以在CCS編譯器安裝路徑中找到PIC16f883.h頭文件了解)。通過MPLAB的幫助鍵胃調(diào)出CCS編譯器的幫助文件進(jìn)行查找了解。丑口VTTT/1oat霜Q潯隱藏后退前進(jìn)打印I目錄索引(酚殛迄)鍵入要查找的關(guān)鍵字魁):IIIDATE一TIME_.DEVICE._FILE_LINE_PCB_PCM_#ASM#BIT#build#BYTECASEDEFIN
7、E#DEVICE#ELIF#ELSE#ENDASMENDIF#ERROR#EXPORT(options)vCCSCCompilermooioioini/%2、有關(guān)10口操作的最簡單的例子利用芯片A口的第1位(即RA0)來控制LED的點(diǎn)亮。PIC單片機(jī)晶振為10M。具體代碼如下:#include”16f883.h”/headfile#ftisesHS,N0WDT/setpic#usedelay(clock=10000000)/setclock#usefast_io(A)/setIOvoidmain(void)/mainfunctionset_tris_a(ObOOOOOOOO);/setiodi
8、rectionoutput_high(PIN_AO);while(l)outputlow(PINAO);/LEDondelay_ms(500);outputhigh(PINAO);/LEDoffdelay_ms(500);最簡單的例子的分析:丑口VTTT/1oat丑口VTTT/1oat以.良g柱術(shù)速度設(shè)置A口方向:0一輸出1輸入頭文件包含指令)ttFusesHS,N0WDT/setpic卜理器怖卜壬4HusedelajCclock-l0030900)/setclock人八命J人nituseFast_io(fi)/set10扌旨令)ineludeIB16F883.h,B/headfileRAO輸
9、岀低電平voidmain(uoid)/nainet_tris_a(ObOOOflflflOO);output_high(PIN_AO);functionA/setiodirection延時(shí)500msRAO輸出高電平utput_low(PIH_AO);delat|_ms(506);utput_high(PIN_AO);delap=ns(500);/LEDonLEDoff主函數(shù)注意:默認(rèn)情況下CCS編譯器是不區(qū)分大小寫的!通過該例子大家可以了解掌握最基本的PIC編程格式,熟悉PIC編程的基本流程,CCS編譯器的基本知識(shí)以及MPLAB開發(fā)環(huán)境。LED點(diǎn)亮的另一鐘實(shí)現(xiàn)形式程序代碼:#include16
10、f883.h/headfile#fusesHS,NOWDT/setpic#usedelay(clock=10000000)/setclock#usefastio(A)/setIO#definePORTA0 x5#definePORTB0 x6#definePORTC0 x7#bitLED=PORTA.Ovoidmain(void)/mainfunctionset_tris_a(ObOOOOOOOO);/setiodirectionLED=1;while(l)LED=0;/LEDondelay_ms(500);LED=1;/LEDoffdelay_ms(500);注意:對(duì)PIC單片機(jī)來說,一般I
11、O口都是從0 x05地址開始依次遞增的!4、10口操作的擴(kuò)展丄ED流水燈使用PIC芯片的C口來點(diǎn)亮LED流水燈,LED共陰極。代碼如下:#include”16f883.h”/headfile#usefastio(A)/setIO#definePORTA0 x5#definePORTB0 x6#definePORTC0 x7voidmain(void)/mainfunctioninti,led;set_tris_c(0b00000000);/setiodirection*PORTC=OxOO;while(l)led=0 x01;fbr(i=0;i8;i+)*PORTC=led;對(duì)led變量取反d
12、elay_ms(500);led=ledl;第三部分:中斷處理1、基礎(chǔ)知識(shí)該部分內(nèi)容具體參見CCS_Microchip_PIC.pdf電子文檔中的第三章第7小節(jié)的內(nèi)容,下面給出重點(diǎn)的摘抄內(nèi)容,3.7.2#int_default.#int_global和#int_xxx指令#int_defaults#int_global和#int_xxx預(yù)處理器指令可以為編譯器確定中斷程序。大多數(shù)PIC微控制器只有一個(gè)中斷向戢所以當(dāng)任何中斷發(fā)生的時(shí)候只能調(diào)用一個(gè)單獨(dú)的中斷服務(wù)程序。默認(rèn)情況下,在CCS-P1CC中,這個(gè)中斷服務(wù)程序是CCS-PICC編譯器內(nèi)部的調(diào)度程序。這個(gè)調(diào)度程序用于調(diào)用單個(gè)中斷程序,調(diào)用規(guī)則
13、是基于哪些中斷的標(biāo)志是被設(shè)置好的,或者哪些中斷程序是用#incxxx指令定義了的。如果PIC觸發(fā)一個(gè)中斷,并且沒有設(shè)置一個(gè)預(yù)期的中斷標(biāo)記,那么這個(gè)調(diào)度程序就會(huì)調(diào)用由#inLdefault指令指定的函數(shù)。這對(duì)于檢測(cè)那些非預(yù)期的而且沒有被處理的中斷是非常有用的。使用#imlobal指令會(huì)使它后面的函數(shù)替代編譯器中斷調(diào)度程序。一般來說都不需要這個(gè)函數(shù),并且在使用它的時(shí)候必須非常小心。編譯器的中斷調(diào)度程序包括啟動(dòng)代碼以及清除代碼,用于保存和恢復(fù)中斷的寄存器組。在使用#intSbai指令的時(shí)候,應(yīng)該由用戶來編寫處理中斷程序的啟動(dòng)和清除的代碼。#intxxx指令指定它后面的函【足一個(gè)中斷函數(shù)。當(dāng)PIC觸發(fā)
14、了個(gè)中斷時(shí),編譯器的中數(shù)可以沒有任何參數(shù)。并不是所有的指令在任何情況下都是適用的。可以參看設(shè)備的h文件來獲得相關(guān)設(shè)備的全部合法中斷信息。表35給出了更為通用的中斷以及它們的相矢指令。表35中斷預(yù)處理器摘令,預(yù)處理器指令中斷描述#intad模數(shù)轉(zhuǎn)換完成#intadof模數(shù)轉(zhuǎn)換超時(shí)#intbuscol總線沖突#intbutton有按鈕按F#intccpl.單元1上面的捕捉或者比較、Hintccp2單元2上面的捕捉或者比較#intcomp檢測(cè)到比較器#inteeprom寫入完成#intext外部中斷#mtextl外部中斷#1#in(ext2外部中斷#2#imi2c叱巾斷(僅僅為14000)畑tled
15、活動(dòng)#intlowolt檢測(cè)到低電平#intpsp并行從端口有數(shù)據(jù)輸入#intrb端口B上B4B7的任何改變#intrc端口C上C4C7的任何改變#inttda1RS232接收到有效的數(shù)據(jù)#mtrtcc定時(shí)器O(RTCC)溢出廿intsspspi或苕Fc活動(dòng)1#inttbeRS232發(fā)送級(jí)沖為空伴inttimerf)定時(shí)器(XRTCC)溢出ffintjimerl定時(shí)器1溢出#inltimer?定時(shí)器2溢出#irUtimer3定時(shí)黑3溢1B注意上表中的指令應(yīng)根據(jù)具體的芯片型號(hào)來定,具體的芯片不同,上面的資源也不同,具體芯片有什么類型的中斷,需要査閱對(duì)應(yīng)的頭文件。在CCS編譯器中,中斷沒有中斷向量
16、號(hào),這點(diǎn)和51是不同的,而且各個(gè)中斷的級(jí)別是一樣的,沒有優(yōu)朱級(jí)的分別,同樣在編寫中斷應(yīng)用稈序時(shí),也是需要打開魚中斷和各白的中用disableinterrupts(intlevel)來關(guān)掉中斷(或者叫禁止中斷)。2、有關(guān)中斷應(yīng)用程序的例子利用外部中斷來控制LED燈的點(diǎn)亮。對(duì)于16F883,只有一個(gè)外部中斷,其觸發(fā)方式有兩種,我們選用上升沿觸發(fā)。代碼如下:#include16f883.hH/headfile#fusesHS,NOWDT/setpic#usedelay(clock=10000000)/setclock#usefast_io(A)/setIO#definePORTA0 x5#defin
17、ePORTB0 x6#definePORTC0 x7#bitLED=PORTC.O/interruptISR/LED-ON-OFF#INT_EXTvoidEXT_ISR(void)LED=LED;voidmain(void)/mainfunctionset_tris_c(ObOOOOOOOO);/setiodirectionset_tris_b(Obllllllll);port_b_pullups(true);/B口做輸入時(shí),要打開內(nèi)部弱上拉EXT_INT_EDGE(L_TO_H);/setEXTmodeenable_interrupts(global);/enableinterruptena
18、ble_interrupts(int_ext);LED=0;while(l);注意:有關(guān)弱上拉的敘述:不同的芯片IO端口有沒有上拉是不同的,這個(gè)要具體查看相應(yīng)的芯片的數(shù)據(jù)手冊(cè),如果該端口帶有內(nèi)部弱上拉時(shí),當(dāng)要使用該端口作為輸入引腳的話,就需要打開其內(nèi)部弱上拉!第四部分:定時(shí)器PIC系列的單片機(jī)不同的型號(hào)具有不同數(shù)目的定時(shí)器,例如我們用到的16F883有3個(gè)定時(shí)器,其中TimerO和Timer2是8位的定時(shí)器,Timerl是16位的定時(shí)器。4、定時(shí)器0定時(shí)器0通常構(gòu)造在8位計(jì)數(shù)器單元上,所以它也是一個(gè)8位的定時(shí)器/計(jì)數(shù)器,它的計(jì)數(shù)范圍是0255。通常用來充當(dāng)時(shí)間基準(zhǔn)或者用作時(shí)鐘。定時(shí)器0的控制寄
19、存器包括定時(shí)器1是一個(gè)16位的定時(shí)器,它的用法同定時(shí)器0是完全一樣的。但是,定財(cái)器1的設(shè)計(jì)使用方式和風(fēng)格是完全不同的。定時(shí)器0是通過重載和重新設(shè)置定時(shí)器產(chǎn)生延遲或者“時(shí)鐘”來完成任務(wù)的,而定時(shí)黠1被設(shè)計(jì)成一直保持運(yùn)作,并且從不重設(shè)或者電載“定時(shí)器1可以單獨(dú)使用,或者也可以同捕捉、比校、PWM模塊一起便用oPWM功能在定時(shí)器1和定時(shí)器2上的工作原理都是一樣的。捕捉和比較功能將會(huì)在這里進(jìn)行介紹,PWM將連同定時(shí)器2起講述。定時(shí)器1被設(shè)計(jì)成不間斷運(yùn)行,目的是讓脈沖捕捉和輸出比較模塊正確工作。脈寬(或者頻率)的測(cè)定是通過記錄定時(shí)器1在脈沖初始和結(jié)束時(shí)的計(jì)數(shù)值,然后將結(jié)束時(shí)間減去初始時(shí)間而得到的。類似的
20、,輸出比較模塊通過使用定時(shí)器1的運(yùn)行計(jì)數(shù)來決定在什么時(shí)候插入一個(gè)輸出信號(hào)以提供輸出。3、定時(shí)器2通過配置定時(shí)器2可以為幾個(gè)函數(shù)提供時(shí)間基準(zhǔn).在這種情形下它的工作方式是與定時(shí)器0的工作方式類似的。定時(shí)器2的時(shí)間基準(zhǔn)輸出功能可以用在以下幾個(gè)方面:為脈寬調(diào)制功能提供時(shí)間基準(zhǔn)為串行瑞口提供波特率,或者用作程序操作的時(shí)鐘。定時(shí)器2的基本模塊框圖見圖2-28。圖228定時(shí)器2模塊草圖從圖2-28町以看岀定時(shí)器2采用的時(shí)鐘是指令時(shí)鐘(系統(tǒng)時(shí)鐘的1/4),這個(gè)時(shí)鐘還可以按照1倍、4倍或者16倍來進(jìn)一步地預(yù)分頻。每次當(dāng)定時(shí)器2的計(jì)數(shù)值等于PR2的值的時(shí)候,定時(shí)器2就自動(dòng)重置。使用重置或者匹配信號(hào)來給串行模塊提洪
21、波特率時(shí)鐘。請(qǐng)注意定時(shí)器2在累加到匝配點(diǎn)的時(shí)候是重置為丿0的,而不是像定時(shí)器0采用的是計(jì)數(shù)翻轉(zhuǎn)那樣的方法。每一個(gè)匹配都會(huì)產(chǎn)生一個(gè)中斷。這個(gè)中斷可以進(jìn)行后分頻操作,事實(shí)上可以在每1次、2次、3次、4次、5次,依此類推直到16次重置才產(chǎn)生一個(gè)中斷;對(duì)于創(chuàng)建比一個(gè)普通8位定時(shí)器可能產(chǎn)生的長得多的延遲來說,返是非常有用的.4、疋列鳶型用佃大心的釵Timersvoidsetup_timerO(moie);voidsetuptinw1(mode);voidsfetup_tjmer_2(modunsignedint8period,int8postscale);voidsctup_timer_3(mode);
22、voidsetrtcc(int8value);voidset_rtcc(intt6value);voidsettimerfXim*value);voidset_tiine3rO(intl6value);voidset_timerl(int16value);voidset_tmcr2(int8value);voidsct_timer3(ijrtl6value);intSget_rtcc();int8getjinwOO;intl6get_rtcc()ntl6getjimctfX);in116get_timerl();int8gettimer2();iht!6gettimerSQ;1注意:PIC單片
23、機(jī)中定時(shí)器選擇內(nèi)部時(shí)鐘時(shí)應(yīng)用的時(shí)鐘頻率是Fosc/4!5、定時(shí)器的應(yīng)用實(shí)例TimerO的應(yīng)用利用TimerO在RCO引腳輸出一個(gè)周期為Is的方波信號(hào)。實(shí)現(xiàn)代碼如下:#includen16fB83.hn/headfile#fbsesHS,NOWDT/setpic#usedelay(clock=10000000)/setclock#usefast_io(A)#usefastio(B)#usefast_io(C)#definePORTA0 x5#definePORTB0 x6#definePORTC0 x7#bitLED=PORTC.O/setIO/setIO/setIOinti6timer=0;c
24、harflag;#int_timer0voidtimer0_TSR(void)settimerO(lOO);timer+;/Imsinterruptif(timer=500)timer=0;flag=l;#zero_ram開機(jī)自動(dòng)清零所有用到的RAMvoidmain(void)/mainfunctionset_tris_c(0b00000000);/setiodirectionLED=0;flag=0;setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);/setTOmodeset_timer0(100);/TOinitialvalueenable_interrup
25、ts(global);/enableinterruptenable_interrupts(int_timerO);while(l)if(flag)flag=0;LEDLED;說明:a定時(shí)器定時(shí)時(shí)間的計(jì)算:PIC采用外部晶振,晶振大小是10M,預(yù)分頻值為16,所以定時(shí)器時(shí)鐘信號(hào)的周期是:16定時(shí)器從100開始計(jì)數(shù)到256計(jì)數(shù)溢出后產(chǎn)生中斷,所以定時(shí)器定時(shí)時(shí)間長度是:T=(256-100)%=99&6嗆1msb、關(guān)于setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16)語句中使用內(nèi)部時(shí)鐘的談?wù)摚喝绻愕某绦蛑袥]有設(shè)置使用內(nèi)部RC時(shí)鐘也即沒有使用setup_oscillat
26、or()命令,那么就是說你使用的是外接的晶振,那么這個(gè)定時(shí)器時(shí)鐘信號(hào)Fclk/4中的Fclk就是你所接的外部晶振的大小,如果使用了內(nèi)部RC那么就是這個(gè)Fclk就是內(nèi)部RC的的頻率大??;定時(shí)器所說的內(nèi)部、外部指的是使用Fclk/4作為時(shí)鐘信號(hào),還是使用外部輸入信號(hào)做時(shí)鐘信號(hào)!定時(shí)器1的應(yīng)用從定時(shí)器0的應(yīng)用我們看到,在計(jì)算定時(shí)器的定時(shí)時(shí)間的時(shí)候做了近似操作,所以得到的定時(shí)時(shí)間是有誤差的,當(dāng)時(shí)間積累的很多的時(shí)候,或者定時(shí)時(shí)間很長的時(shí)候,會(huì)出現(xiàn)很大的誤差,那么怎么樣才能得到精確的時(shí)間呢?下面我們釆用比較模塊來實(shí)現(xiàn)精確的定時(shí),因?yàn)楸容^模塊是和定時(shí)器1相聯(lián)系的。其實(shí)也就是定時(shí)器1的一個(gè)應(yīng)用。2譏懷丁尸況V
27、、少哋疋冊(cè):w:佚處口種戈:矽。仕r程丿亍貝仕CCPRJ中轅人一個(gè)值,然后將定時(shí)器1的當(dāng)前計(jì)數(shù)與這個(gè)值進(jìn)行比較,如果二者相符則產(chǎn)生-個(gè)中斷。通過這樣的方式,當(dāng)定時(shí)器1與CCPR1的值相符時(shí),程序就能進(jìn)行任何想要的操作,并且在結(jié)束后CCPR1的值能夠被重載用來進(jìn)行F-次的比較。CCS編譯器有關(guān)的函數(shù):Capture/Compare/PWMvoidsetupccpx(constmode);41voidsetpwmxduty(uitl6value);例如我們使用比較模式在RC0口輸出一個(gè)1kHz的方波,PIC單片機(jī)使用外部晶振10Mo#includeH16f883.hM/headfile#ftise
28、sHS,NOWDT/setpic#usedelay(clock=10000000)/setclock#usefast_io(A)/setIO#usefastio(B)/setIO#usefast_io(C)/setIO#definePORTA0 x5#definePORTB0 x6#definePORTC0 x7#bitLED=PORTC.Ointi6timer=0;charflag;#intccplvoidccp1_TSR(void)/Imsinterruptccp_1=ccp_1+1250;flag=l;#zero_ram開機(jī)自動(dòng)清零所有用到的RAMvoidmain(void)/mainf
29、unctionsettrisc(ObOOOOOOOO);/setiodirectionLED=0;flag=0;setup_timer_1(T1JNTERNAL|T1_DIV_BY_1);/setT1modesetupccp1(CCPCOMPAREINT);/setccp1enable_interrupts(global);/enableinterruptenable_interrupts(int_ccp1);settimerl(O);while(l)if(flag)flag=O;LED7ED;檢山信縣御怡3爍要求的輸出波形的周期是Ims,那么半個(gè)周期即是500us,所以計(jì)算得到在500us中
30、時(shí)鐘脈沖的個(gè)數(shù)是:500uscount=12500.4w5故比較模式下,經(jīng)過1250個(gè)時(shí)鐘脈沖就產(chǎn)生一次CCP中斷,在中斷發(fā)生時(shí)使得RC0引腳發(fā)生跳變即就可以使之出現(xiàn)1kHz的方波信號(hào)了。定時(shí)器2的應(yīng)用下面我們同樣用Timer2來實(shí)現(xiàn)上面的產(chǎn)生1kHz的方波信號(hào)。通過這個(gè)例子大家就可以看到Timer2的使用又是不同于其他兩個(gè)定時(shí)器的。實(shí)現(xiàn)代碼如下:#includen16fB83.hn/headfile#fusesHS,NOWDT/setpic/setIO/setIO/setIO#usedelay(clock=10000000)/setclock#usefast_io(A)#usefastio(
31、B)#usefast_io(C)#definePORTA0 x5#definePORTB0 x6#definePORTC0 x7#bitLED=PORTC.Ocharflag;/interruptISR#int_timer2voidtimer2_TSR(void)flag=l;#zero_ram開機(jī)自動(dòng)清零所有用到的RAMvoidmain(void)/mainfunctionset_tris_c(ObOOOOOOOO);/setiodirectionLED=0;flag=0;setup_timer_2(T2_DIV_BY_l,250,5);/setT2modeenable_interrupts
32、(global);/enableinterruptenable_interrupts(int_timer2);set_timerl(0);while(l)if(flag)flag=0;LED7ED;對(duì)于Timer2有重要的表達(dá)式:周期C一4*預(yù)分頻值*后分頻值對(duì)于這個(gè)例子,我們要產(chǎn)生一個(gè)周期為Ims的方波信號(hào),我們計(jì)算如下:我們預(yù)分頻取1(即不分頻),后分頻取5(即5分頻),單片機(jī)晶振為lOMo定時(shí)器定時(shí)周期為信號(hào)周期的一半就行了(想想為什么?),所以通過公式計(jì)算得到:PR2=定時(shí)時(shí)間*Esc4*預(yù)分頻值*后分頻值(0.5ms)*(10M)4*1*50.0005*100000004*1*5=2
33、50第四部分:UART(串口通信)巾、基礎(chǔ)知識(shí)PIC系列的單片機(jī)型號(hào)不相同,串口配置的位置也是不同的,例如對(duì)于我們使用的16F883芯片其串口的配置如下:RE3/MCLRWPP-RAO/ANOAJLPWU/C12INO-*RA1/AN1/C12IN1-RA2/AN2ARef-/CVreF/C21N+-R.A3/AN3A-rREF+/C1IN+*RA4/T0CKI/C1OUT*RA5/AN4/SS/C2OUT*VSSRA7/0SC1/CLKIN*RA6/OSC2/CLKOUT-RC0/T1OSO/T1CK1-RC1/T10SI/CCP2-RC2/P1A/CCP1*RC3/SCK/SCL-*匚匚匚
34、匚匚匚匚匚匚匚匚匚匚匚01234i1111g82e88s88u.9Lyd2827262524232221201918171615nnnnanaannnnna,廠cc、厶乘評(píng)番中大丁甲口迪宙時(shí)的釵:函數(shù)麻型所霜廉入fRS232I/O*voidassert(condition);#include#usere232charidentifier);f#users231voidfjgcts(char*s1rfstreamidentifier);細(xì)sers藥1voidnntf(stFeamidentifier,charfmtstrCarg1,arg2,#usere2324vidfputc(charc,st
35、reamidentifieF)-細(xì)senjZtvoidiputs(char4str,streamideniifier);#users232chargetcQ;-#users232voidgets(char*str);#users2321:charkWiitQ;-#Users231:voidnairielstreamidentifierchartnitstrfjargl,arg2,#uers231voidpute(charc);-#uss232-函數(shù)原型,一一“.、質(zhì)需輸入/、:虬“苒紀(jì)Tvoidputs(char*str);:、.八,、:feers232r*/*gvoidset_uart_sp
36、eed(constint32baud);-5#users2323、UART串口通信實(shí)例利用CCS編譯器提供的串口函數(shù)實(shí)現(xiàn)數(shù)據(jù)發(fā)送,單片機(jī)晶振10M,通信波特率9600,數(shù)據(jù)位8bit,沒有奇偶校驗(yàn)。具體實(shí)現(xiàn)代碼如下:#includen16fB83.hn/headfile#ftisesHS,NOWDT/setpic#usedelay(clock=10000000)/setclock#usefast_io(A)/setIO#usefastio(B)/setIO#usefastio(C)/setIO/setuart,theoptionorderisrandom#users232(baud=9600,
37、xmit=PIN_C6,rcv=PIN_C7,bits=8,parity=N)definePORTA0 x5-#definePORTB0 x6#definePORTC0 x7#bitLED=PORTC.O#zero_ram開機(jī)自動(dòng)清零所有用到的RAMvoidmain(void)/mainfunctionchari;charBuftJ=”HelloWord!nu;charBufL2=”ThisismyUART!”;set_tris_c(Ob10000000);/setiodirectionLED=0?while(l)puts(Buffl);for(i=0;iT1CKI-匚RC1/T10SI/CC
38、P2-匚RC2/P1A/CCP1匚RC3/SCK/SCL-匚3、CCS編譯器有關(guān)AD轉(zhuǎn)換器的函數(shù)A/DCoiwersionsvoidsetup_adc_ports(mode);voidsetup_adc(mode);。Utvoidsetadcchannel(intSchannel);int?readadc();int16read_adc();*#!4AD轉(zhuǎn)化器的使用實(shí)例使用PIC單片機(jī)的AD轉(zhuǎn)換器實(shí)現(xiàn)數(shù)字電壓表。AD轉(zhuǎn)換的時(shí)候常使用內(nèi)部RC晶振,所以此時(shí)不需要外接晶振,模擬量從AD的10號(hào)通道進(jìn)入(RB1引腳),為了看到效果,我們采用A口輸出對(duì)應(yīng)的數(shù)字量,從C口通過共陽的數(shù)碼管顯示測(cè)量得到的實(shí)
39、際電壓值。程序如下所示:#include“16f883.h“#deviceADC=8/setadbit#ftisesINTRC_IO,NOWDT,NOPROTECT,PUT,NOBROWNOUT,MCLR#usedelay(CLOCK=8000000,RESTART_WDT)#usefast_io(A)/IO口設(shè)為快速操作#usefastio(B)#usefastio(C)#definePORTA0 x5/A口地址#definePORTB0 x6/B口地址#definePORTC0 x7/C口地址/*0,1,2,3,4,5,6,7,&9,全滅*/charDis_Buff11=0 xC0,0 x
40、F9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x00;charSeBuft4=0 x80,0 x40,0 x20,Ox10;charResult4,m,i;#intADvoidAD_isr(void)unsignedlongintyb;此處yb和temp的類型必須一樣!unsignedlonginttemp;yb=read_adc(ADC_READ_ONLY);/readadvalueoutput_a(yb);temp=yb*196;得到擴(kuò)大1萬倍的實(shí)際電壓值Result0=(temp/l0000);/gethighestbit,廠c
41、c、temp=temp%1000;Result2=temp/100;temp=temp%100;Result3=temp/10;/*display*/m=100;根據(jù)實(shí)際電路調(diào)節(jié)while(m)for(i=0;i4;i+)*PORTB=(*PORTB)&0 xOf)|(Seg_Buff!i)&0 xfU);位選if(i=0)段選*PORTC=Dis_BufflResulti&Ox7F;顯示第一位的同時(shí)顯示小數(shù)點(diǎn)else*PORTC=Dis_BuffResulti;delay_ms(l);根據(jù)實(shí)際電路調(diào)節(jié)read_adc(ADC_START_ONLY);/startadagain#zero_ra
42、m開機(jī)自動(dòng)清零所有用到的RAMvoidmain(void)setup_oscillator(OSC_8MHZ);/useinternalRCSETUP_ADC_PORTS(sAN10);/setADSETUP_ADC(ADC_CLOCK_INTERNAL);settrisa(OxO);/setioset_tris_b(0 x02);settrisc(OxO);PORTjb_PULLUPS(TRUE);*PORTA=0 x0;/initialio*PORTB=(*PORTB)&OxOf)|(OxOO);*PORTC=0 x0;enable_interrupts(INT_AD);/setinter
43、ruptenable_interrupts(global);SET_ADC_CHANNEL(10);/setadchannelreadadcCADCSTARTONLY);/startadwhiie(l);_說明:采用8位AD,釆用中斷方式讀取。顯示結(jié)果。在AD中斷處理函數(shù)中這兩個(gè)變量的類型必須是一樣的才行,yb和temp,因?yàn)樗麄冎g要進(jìn)行乘法運(yùn)算,要是不一樣的話,得到的結(jié)果是不正確的!有關(guān)read_adc()函數(shù)的說明:該函數(shù)帶不同的參數(shù)可以有不同的功能。read_adc(ADC_START_ONLY);/startadread_adc(ADC_READ_ONLY);/readadvalue
44、read_adc(ADC_START_AND_READ);/readadvalue5、AD轉(zhuǎn)換的實(shí)例2多通道AD轉(zhuǎn)換:ADC轉(zhuǎn)換通道選擇通道0通道3,轉(zhuǎn)換結(jié)果通過串口輸出。同樣單片機(jī)詵甲為部的RC振蕩器稈序如下,#deviceADC=8/setadbit,位置必須在這里#fhsesINTRC_I0,NOWDT,NOPROTECT,PUT,NOBROWNOUT,MCLR#usedelay(CLOCK=8000000,RESTART_WDT)#users232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,bits=8,parity=N)#usefast_io(A)/IO口設(shè)為
45、快速璨作一#usefastio(B)#usefastio(C)#definePORTA0 x5/A口地址#definePORTB0 x6/B口地址#definePORTC0 x7/C口地址#zero_ram開機(jī)自動(dòng)清零所有用到的RAMvoidmain(void)unsignedlongintyb;此處yb和temp的類型必須一樣!unsignedlonginttemp;charResult4,i;setup_oscillator(OSC_8MHZ);/useinternalRCSETUP_ADC_PORTS(sANO|sAN1|sAN2|sAN3);/setADsetup2adc(adc_cl
46、ock_internal);set_tris_a(ObOOOO1111);/setioset_tris_c(Ob10000000);/setiodirectionwhile(l)fbr(i=0;iPWM基礎(chǔ)知識(shí)在前面的一般功能概述”中已經(jīng)講過,脈寬調(diào)制(PWM)是一種通過控制占空度來控制提供給設(shè)備的均值直流電(DC)的技術(shù)。為了創(chuàng)建PWM信號(hào),使用定時(shí)器2創(chuàng)建產(chǎn)生PWM信號(hào)的時(shí)鐘,這也就是說,定時(shí)器2設(shè)置了PWM信號(hào)的頻率。這是通過設(shè)置PR2使得定時(shí)器2上作在通常模式下而實(shí)現(xiàn)的。當(dāng)定時(shí)器2計(jì)數(shù)到與PR2的值匹配時(shí),它就會(huì)被重新設(shè)定并且整個(gè)流程重新開始。當(dāng)定時(shí)器2重新設(shè)定的時(shí)候,PWM輸出位(端
47、口C第2位)被設(shè)曽為高.為定時(shí)然2在計(jì)數(shù)的時(shí)候,它最終會(huì)與CCPR1L(CCPR1的低8位)中的值達(dá)到兀配,此時(shí)PWM的輸岀會(huì)被清為0。于是定時(shí)器2計(jì)數(shù)到與PR2的值匹配,然后整個(gè)過程會(huì)重新開始。這樣,就可以牛成PWM的輸出了。例如,如果將PR2設(shè)為00,CCPRIL設(shè)為45,那么可以得到占空度為45%。定時(shí)器2從0開始計(jì)數(shù),而且PWM輸出將被置高。當(dāng)定時(shí)器2計(jì)數(shù)到45,定時(shí)器2和CCPRIL的值發(fā)生匹配,就使得PWM的輸出在定時(shí)器2計(jì)數(shù)到100期間侃持為低。這樣的話,在100個(gè)計(jì)數(shù)內(nèi)有45個(gè)計(jì)數(shù)的輸出為高,所以占空度為45%。將CCPRIL設(shè)置為0將會(huì)生成一個(gè)零占空度,而且如果設(shè)定CCPRI
48、L(如果使用的是10位模式的話,同樣還耍加上另外的兩位)離于定時(shí)器2的值,那么就會(huì)產(chǎn)生100%的占空度。在這個(gè)例子中,輸出有1%(100分之1)的分辨率。在很多種情況下,這是不夠的,所以在CCPRIL中可以使用額外的兩位來生成一個(gè)10位的占空度數(shù)值.這兩個(gè)額外的位分別是CCP1CON中的第4位和第5位(參見圖2-21),這兩位作為最低有效位與定時(shí)器2起工作。這兩個(gè)額外的位是計(jì)數(shù)器中的兩個(gè)最低有效位,它的作用是將系統(tǒng)時(shí)鐘除以4得到指令時(shí)鐘。正如您很有可能考慮到的,將占空度的兩個(gè)最低有效位載入到CCP1CON的第4位和第5.位聽上去是很有挑戰(zhàn)性的(事實(shí)上這僅僅是單調(diào)乏味的工作,并不是挑戰(zhàn))。幸運(yùn)的是,CCS-PICC使用函數(shù)SET_PWMx_DUTY(valuem接完成了這項(xiàng)任務(wù)“X”的值根據(jù)PWM的來源不同可以為1或者2,所以數(shù)值可以分別為8位或者10位。變量的大小將決定PWM使用的是10位的分辨率還是8位的分辨率。2、PWM的周期公式PWM周期=(PR2+1)*4*TWC*TMR2預(yù)分頻值3、CCS編譯器中有關(guān)PWM的函數(shù)Capture/Cornpace/PWMZvoidsetup_ccpx(conslmode);J1voidsetpwmxduty(Liit16value);4、PWM模式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 珠寶首飾買賣合同范本
- 林業(yè)資源HSE管理協(xié)議
- 交通運(yùn)輸項(xiàng)目招投標(biāo)代理協(xié)議
- 醫(yī)院醫(yī)生聘用合同協(xié)議
- 水務(wù)工程招投標(biāo)代理合同范本
- 通信線路鋪設(shè)挖掘協(xié)議
- 澳門(2024年-2025年小學(xué)五年級(jí)語文)人教版質(zhì)量測(cè)試(上學(xué)期)試卷及答案
- 銷售工作年終總結(jié)
- 關(guān)于幼兒小班學(xué)期工作計(jì)劃范文4篇
- 高性能計(jì)算與科學(xué)研究的關(guān)聯(lián)性
- 倉儲(chǔ)物流中心物業(yè)安全管理
- 醫(yī)療器械注冊(cè)專員培訓(xùn)
- 期末復(fù)習(xí)重要考點(diǎn)03 《一元一次方程》十大考點(diǎn)題型(熱點(diǎn)題型+限時(shí)測(cè)評(píng))(原卷版)
- 生物丨金太陽(25-69C)廣東省2025屆高三10月大聯(lián)考生物試卷及答案
- 期中測(cè)試卷(試題)2024-2025學(xué)年人教版數(shù)學(xué)三年級(jí)上冊(cè)
- 車隊(duì)車輛掛靠合同模板
- 期中 (試題) -2024-2025學(xué)年人教PEP版英語四年級(jí)上冊(cè)
- 動(dòng)物疫病防治員(高級(jí))理論考試題及答案
- 跨境電商行業(yè)研究框架專題報(bào)告
- 提升初中生英語寫作
- 2024年深圳市優(yōu)才人力資源有限公司招考聘用綜合網(wǎng)格員(派遣至吉華街道)高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
評(píng)論
0/150
提交評(píng)論