c語言單片機(jī)編程之頭文件編寫_第1頁
c語言單片機(jī)編程之頭文件編寫_第2頁
c語言單片機(jī)編程之頭文件編寫_第3頁
c語言單片機(jī)編程之頭文件編寫_第4頁
c語言單片機(jī)編程之頭文件編寫_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

-.z.如何高效編程之頭文件在網(wǎng)上查了很長時(shí)間關(guān)于頭文件的資料,但是發(fā)現(xiàn)很難找到適合我的。學(xué)單片機(jī)的朋友知道,很多程序經(jīng)常要調(diào)用相同的函數(shù),如果每寫一個(gè)程序都把這些函數(shù)重新寫一遍或者復(fù)制過來,那是很浪費(fèi)時(shí)間的,現(xiàn)在我通過學(xué)習(xí)總結(jié)以及別人的經(jīng)驗(yàn),跟大家分享,歡迎大家學(xué)習(xí)。寫程序最好是結(jié)構(gòu)化編程,因?yàn)檫@樣的程序看起來就不則長了,一目了然,可以很快就知道這個(gè)程序?qū)崿F(xiàn)什么功能,而且排錯(cuò)也非常簡(jiǎn)單。把常用的函數(shù)聲明、自定義類型、外部變量的聲明等寫進(jìn)頭文件,與之配對(duì)的擴(kuò)展名為.c的文件就寫常用的函數(shù),main.c最好就寫一個(gè)主函數(shù)。之前學(xué)的51單片機(jī),現(xiàn)在玩430單片機(jī),就以430單片機(jī)為例,其他編程軟件道理與這個(gè)相同。在IAR下新建工程,包含了main.c、mydefine.c和mydefine.h(mydefine.c和mydefine.h是一對(duì))三個(gè)文件(注:可包含多個(gè)配對(duì)的頭文件和C文件)。先把程序貼出來,再詳解其中緣由。main.c容:*include"mydefine.h"voidmain(void){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;SegInitial();//數(shù)碼管控制引腳初始化longm=0;while(1){disp(m);//顯示m的值delay(10);m++;if(m==1000000)m=0;}}mydefine.h的容*ifndef_MYDEFINE_H*define_MYDEFINE_H*include"msp430*14*.h"typedefunsignedintuint;typedefunsignedcharuchar;voidwrite_595(uchardat);voidSegInitial(void);voiddisp(longnum);voiddelays(uint*);voiddelay(uint*);*endifmydefine.c的容*include"mydefine.h"*include"msp430*14*.h"/*********************************流水燈74hc595各引腳定義*********************************/*defineCLK0P2OUT&=~BIT4*defineCLK1P2OUT|=BIT4*defineSTB0P2OUT&=~BIT2*defineSTB1P2OUT|=BIT2*defineDS0P2OUT&=~BIT5*defineDS1P2OUT|=BIT5*defineLEDOFFP5OUT=0*00uchardis_num[]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e};//數(shù)碼管0~F共陽編碼ucharbitnum[]={0*01,0*02,0*04,0*08,0*10,0*20};//數(shù)碼管位選uchardispbuf[6];//數(shù)碼管顯示緩沖區(qū)//以下是延時(shí)函數(shù)voiddelay(uint*){uinta,b;for(a=*;a>0;a--)for(b=10000;b>0;b--);}//控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)voidwrite_595(uchardat){uintn;for(n=0;n<8;n++){if((dat&0*80)==0*80)DS1;elseDS0;dat<<=1;CLK0;CLK1;}STB1;STB0;}/*****************************************數(shù)碼管顯示初始化函數(shù)*****************************************/voidSegInitial(void){P5DIR=0*FF;P4DIR=0*FF;P5OUT=0*00;P4OUT=0*00;}/****************************************數(shù)碼管防重影延時(shí)函數(shù)*****************************************/voiddelays(uint*){for(;*>0;*--);}/*****************************************數(shù)碼管顯示函數(shù)位選P5.0~P5.5段選P4*****************************************/voiddisp(longnum){uinti;dispbuf[0]=num%10;dispbuf[1]=num/10%10;dispbuf[2]=num/100%10;dispbuf[3]=num/1000%10;dispbuf[4]=num/10000%10;dispbuf[5]=num/100000%10;for(i=0;i<6;i++){P4OUT=dis_num[dispbuf[i]];P5OUT=bitnum[i];delays(400);P5OUT=0*00;}}首先看main.c里面就寫了一個(gè)主函數(shù),它告訴讀者該程序的主要功能。mydefine.h里面包含了一些函數(shù)的聲明,如果使用到外部變量(或函數(shù)),則需要在該變量(或函數(shù))前寫e*tern加以說明其為外部變量(或函數(shù))。寫頭文件一定要注意:*ifndef*****define****......*endif其中****習(xí)慣大寫,名稱不要與關(guān)鍵字相同,習(xí)慣寫法請(qǐng)參照上面的程序,*ifndef*****define****.....*endif的作用是有些頭文件已經(jīng)在其他文件里包含過了,但是你在這個(gè)文件也包含了,如果沒有上面那一句,則編譯器會(huì)報(bào)錯(cuò):重復(fù)定義!mydefine.c中用到了mydefine.h中的定義,則需要把mydefine包含進(jìn)來,包含mydefine.h的意思是mydefine.h替換為mydefine.h的容,即mydefine.c的完整容為:*include"msp430*14*.h"typedefunsignedintuint;typedefunsignedcharuchar;voidwrite_595(uchardat);voidSegInitial(void);voiddisp(longnum);voiddelays(uint*);voiddelay(uint*);/*********************************流水燈74hc595各引腳定義*********************************/*defineCLK0P2OUT&=~BIT4*defineCLK1P2OUT|=BIT4*defineSTB0P2OUT&=~BIT2*defineSTB1P2OUT|=BIT2*defineDS0P2OUT&=~BIT5*defineDS1P2OUT|=BIT5/*********************************流水燈74hc595各引腳定義*********************************/*defineLEDOFFP5OUT=0*00uchardis_num[]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e};ucharbitnum[]={0*01,0*02,0*04,0*08,0*10,0*20};uchardispbuf[6];//以下是延時(shí)函數(shù)voiddelay(uint*){uinta,b;for(a=*;a>0;a--)for(b=10000;b>0;b--);}//控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)voidwrite_595(uchardat){uintn;for(n=0;n<8;n++){if((dat&0*80)==0*80)DS1;elseDS0;dat<<=1;CLK0;CLK1;}STB1;STB0;}/*****************************************數(shù)碼管顯示初始化函數(shù)*****************************************/voidSegInitial(void){P5DIR=0*FF;P4DIR=0*FF;P5OUT=0*00;P4OUT=0*00;}/****************************************數(shù)碼管延時(shí)函數(shù)*****************************************/voiddelays(uint*){for(;*>0;*--);}/*****************************************數(shù)碼管顯示函數(shù)位選P5.0~P5.5段選P4*****************************************/voiddisp(longnum){uinti;dispbuf[0]=num%10;dispbuf[1]=num/10%10;dispbuf[2]=num/100%10;dispbuf[3]=num/1000%10;dispbuf[4]=num/10000%10;dispbuf[5]=num/100000%10;for(i=0;i<6;i++){P4OUT=dis_num[dispbuf[i]];P5OUT=bitnum[i];delays(400);P5OUT=0*00;}}下面講一下mydefine.c的功能,一些常用函數(shù)都寫在里面,一般情況下我們寫好頭文件后不必對(duì)函數(shù)的原型進(jìn)行深究,只需知道函數(shù)的功能即可,即頭文件里的函數(shù)聲明,多個(gè)C文件編譯的時(shí)候,相當(dāng)于主函數(shù)放在前面,其他函數(shù)放在后面,調(diào)用函數(shù)的時(shí)候就必須先對(duì)這些函數(shù)進(jìn)行聲明,否則編譯器不知道你的函數(shù)原型是什么,而這些頭文件就起到了函數(shù)聲明的作用,所謂頭文件就可以理解為在main函數(shù)前面事先要處理的程序(即聲明和定義)。下面把這個(gè)結(jié)構(gòu)化編程的等效程序貼出來,以方便大家理解:*include"msp430*14*.h"typedefunsignedintuint;typedefunsignedcharuchar;voidwrite_595(uchardat);voidSegInitial(void);voiddisp(longnum);voiddelays(uint*);voiddelay(uint*);voidmain(void){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;SegInitial();longm=0;while(1){disp(m);delay(10);m++;if(m==1000000)m=0;}}/*********************************流水燈74hc595各引腳定義*********************************/*defineCLK0P2OUT&=~BIT4*defineCLK1P2OUT|=BIT4*defineSTB0P2OUT&=~BIT2*defineSTB1P2OUT|=BIT2*defineDS0P2OUT&=~BIT5*defineDS1P2OUT|=BIT5/*********************************流水燈74hc595各引腳定義*********************************/*defineLEDOFFP5OUT=0*00uchardis_num[]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e};ucharbitnum[]={0*01,0*02,0*04,0*08,0*10,0*20};uchardispbuf[6];//以下是延時(shí)函數(shù)voiddelay(uint*){uinta,b;for(a=*;a>0;a--)for(b=10000;b>0;b--);}//控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)voidwrite_595(uchardat){uintn;for(n=0;n<8;n++){if((dat&0*80)==0*80)DS1;elseDS0;dat<<=1;CLK0;CLK1;}STB1;STB0;}/***************************************

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論