<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機實例 >> 正文

      教你如何高效編程之頭文件書寫,頭文件怎么編程

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2018-12-19

             在網上查了很長時間關于頭文件的資料,但是發現很難找到適合我的。學單片機的朋友知道,很多程序經常要調用相同的函數,如果每寫一個程序都把這些函數重新寫一遍或者復制過來,那是很浪費時間的,現在我通過學習總結以及別人的經驗,跟大家分享,歡迎大家轉載學習。

              寫程序最好是結構化編程,因為這樣的程序看起來就不那么長了,一目了然,可以很快就知道這個程序實現什么功能,而且排錯也非常簡單。把常用的函數聲明、自定義類型、外部變量的聲明等寫進頭文件,與之配對的擴展名為.c的文件就寫常用的函數,main.c最好就寫一個主函數。之前學的51單片機,現在玩430單片機,就以430單片機為例,其他編程軟件道理與這個相同。在IAR下新建工程,包含了main.c、mydefine.cmydefine.hmydefine.c和mydefine.h是一對)三個文件(注:可包含多個配對的頭文件和C文件)。先把程序貼出來,再詳解其中緣由。以下是單片機c語言編程

      main.c內容:
      #include "mydefine.h"
      void main( void )
      {
        // Stop watchdog timer to prevent time out reset
        WDTCTL = WDTPW + WDTHOLD;
        
        SegInitial();      //數碼管控制引腳初始化
        
        long m = 0;
        while(1)
        {    
         disp(m);            //顯示m的值
          delay(10);
         m++;
         if(m == 1000000)
           m = 0;
        }
      }
       
       
      mydefine.h的內容
       
      #ifndef _MYDEFINE_H
      #define _MYDEFINE_H

      #include "msp430x14x.h"

      typedef  unsigned int uint;
      typedef unsigned char uchar;

      void write_595(uchar dat);
      void SegInitial(void);
      void disp(long num);
      void delays(uint x);
      void delay(uint x);

      #endif
       
      mydefine.c的內容
       
      #include "mydefine.h"
      #include "msp430x14x.h"

      /*********************************
            流水燈74hc595各引腳定義

      *********************************/
      #define CLK0 P2OUT &= ~BIT4
      #define CLK1 P2OUT |= BIT4
      #define STB0 P2OUT &= ~BIT2
      #define STB1 P2OUT |= BIT2
      #define DS0  P2OUT &= ~BIT5
      #define DS1  P2OUT |= BIT5
      #define LEDOFF P5OUT = 0x00


      uchar dis_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};    //數碼管0~F共陽編碼
      uchar bitnum[]={0x01,0x02,0x04,0x08,0x10,0x20};         //數碼管位選
      uchar dispbuf[6];                                                             //數碼管顯示緩沖區

      //以下是延時函數
      void delay(uint x)
      {
        uint a,b;
        for(a=x;a>0;a--)
          for(b=10000;b>0;b--);
      }

      //控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)
      void write_595(uchar dat)
      {
        uint n;
        for(n = 0;n<8;n++)
        {
          if((dat&0x80) == 0x80)
            DS1;
          else
            DS0;
          dat <<= 1;
          CLK0;   
          CLK1;
        }
        STB1;
        STB0;
      }

      /*****************************************
                  數碼管顯示初始化函數

      *****************************************/
      void SegInitial(void)
      {
        P5DIR = 0XFF;
        P4DIR = 0XFF;
        P5OUT = 0X00;
        P4OUT = 0X00;
      }


      /****************************************
                數碼管防重影延時函數

      *****************************************/
      void delays(uint x)
      {
        for(;x>0;x--);
      }


      /*****************************************
                  數碼管顯示函數
                  位選 P5.0~P5.5
                  段選 P4

      *****************************************/
      void disp(long num)
      {
          uint i;
          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=0X00;
          }
      }
       
      首先看main.c里面就寫了一個主函數,它告訴讀者該程序的主要功能。mydefine.h里面包含了一些函數的聲明,如果使用到外部變量(或函數),則需要在該變量(或函數)前寫extern加以說明其為外部變量(或函數)。寫頭文件一定要注意:
       
      #ifndef XXXX
      #define XXXX
              .
              .
              .
              .
              .
              .
      #endif
       
      其中XXXX習慣大寫,名稱不要與關鍵字相同,習慣寫法請參照上面的程序,#ifndef XXXX    #define  XXXX   .....   #endif的作用是有些頭文件已經在其他文件里包含過了,但是你在這個文件也包含了,如果沒有上面那一句,則編譯器會報錯:重復定義!mydefine.c中用到了mydefine.h中的定義,則需要把mydefine包含進來,包含mydefine.h的意思是mydefine.h替換為mydefine.h的內容,即mydefine.c的完整內容為:
      #include "msp430x14x.h"

      typedef  unsigned int uint;
      typedef unsigned char uchar;

      void write_595(uchar dat);
      void SegInitial(void);
      void disp(long num);
      void delays(uint x);
      void delay(uint x);
      /*********************************
            流水燈74hc595各引腳定義

      *********************************/
      #define CLK0 P2OUT &= ~BIT4
      #define CLK1 P2OUT |= BIT4
      #define STB0 P2OUT &= ~BIT2
      #define STB1 P2OUT |= BIT2
      #define DS0  P2OUT &= ~BIT5
      #define DS1  P2OUT |= BIT5


      /*********************************
            流水燈74hc595各引腳定義

      *********************************/
      #define LEDOFF P5OUT = 0x00


      uchar dis_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
      uchar bitnum[]={0x01,0x02,0x04,0x08,0x10,0x20};
      uchar dispbuf[6];

      //以下是延時函數
      void delay(uint x)
      {
        uint a,b;
        for(a=x;a>0;a--)
          for(b=10000;b>0;b--);
      }

      //控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)
      void write_595(uchar dat)
      {
        uint n;
        for(n = 0;n<8;n++)
        {
          if((dat&0x80) == 0x80)
            DS1;
          else
            DS0;
          dat <<= 1;
          CLK0;   
          CLK1;
        }
        STB1;
        STB0;
      }

      /*****************************************
                  數碼管顯示初始化函數

      *****************************************/
      void SegInitial(void)
      {
        P5DIR = 0XFF;
        P4DIR = 0XFF;
        P5OUT = 0X00;
        P4OUT = 0X00;
      }


      /****************************************
                數碼管延時函數

      *****************************************/
      void delays(uint x)
      {
        for(;x>0;x--);
      }


      /*****************************************
                  數碼管顯示函數
                  位選 P5.0~P5.5
                  段選 P4

      *****************************************/
      void disp(long num)
      {
          uint i;
          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=0X00;
          }  
      }
       
              下面講一下mydefine.c的功能,一些常用函數都寫在里面,一般情況下我們寫好頭文件后不必對函數的原型進行深究,只需知道函數的功能即可,即頭文件里的函數聲明,多個C文件編譯鏈接的時候,相當于主函數放在前面,其他函數放在后面,調用函數的時候就必須先對這些函數進行聲明,否則編譯器不知道你的函數原型是什么,而這些頭文件就起到了函數聲明的作用,所謂頭文件就可以理解為在main函數前面事先要處理的程序(即聲明和定義)。
       
              下面把這個結構化編程的等效程序貼出來,以方便大家理解:
       
      #include "msp430x14x.h"
      typedef  unsigned int uint;
      typedef unsigned char uchar;

      void write_595(uchar dat);
      void SegInitial(void);
      void disp(long num);
      void delays(uint x);
      void delay(uint x);

      void main( void )
      {
        // Stop watchdog timer to prevent time out reset
        WDTCTL = WDTPW + WDTHOLD;
        
        SegInitial();
        
        long m = 0;
        while(1)
        {
          
         disp(m);
          delay(10);
         m++;
         if(m == 1000000)
           m = 0;
        }

      }

      /*********************************
            流水燈74hc595各引腳定義

      *********************************/
      #define CLK0 P2OUT &= ~BIT4
      #define CLK1 P2OUT |= BIT4
      #define STB0 P2OUT &= ~BIT2
      #define STB1 P2OUT |= BIT2
      #define DS0  P2OUT &= ~BIT5
      #define DS1  P2OUT |= BIT5


      /*********************************
            流水燈74hc595各引腳定義

      *********************************/
      #define LEDOFF P5OUT = 0x00


      uchar dis_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
      uchar bitnum[]={0x01,0x02,0x04,0x08,0x10,0x20};
      uchar dispbuf[6];

      //以下是延時函數
      void delay(uint x)
      {
        uint a,b;
        for(a=x;a>0;a--)
          for(b=10000;b>0;b--);
      }

      //控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)
      void write_595(uchar dat)
      {
        uint n;
        for(n = 0;n<8;n++)
        {
          if((dat&0x80) == 0x80)
            DS1;
          else
            DS0;
          dat <<= 1;
          CLK0;   
          CLK1;
        }
        STB1;
        STB0;
      }

      /*****************************************
                  數碼管顯示初始化函數

      *****************************************/
      void SegInitial(void)
      {
        P5DIR = 0XFF;
        P4DIR = 0XFF;
        P5OUT = 0X00;
        P4OUT = 0X00;
      }


      /****************************************
                數碼管延時函數

      *****************************************/
      void delays(uint x)
      {
        for(;x>0;x--);
      }


      /*****************************************
                  數碼管顯示函數
                  位選 P5.0~P5.5
                  段選 P4

      *****************************************/
      void disp(long num)
      {
          uint i;
          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=0X00;
          }    
      }
       
      希望這些總結能對大家有所幫助,又不能理解的地方,可以互相交流一下。
      Tags:單片機編程,頭文件,單片機c語言,編程  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      最新推薦
      熱門文章
      • 此欄目下沒有熱點文章
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 狠狠色综合久久婷婷色天使| 久久一日本道色综合久久m| 久久综合日韩亚洲精品色| 青青草原综合久久| 在线精品国产成人综合| 色99久久久久高潮综合影院| 丁香婷婷色五月激情综合深爱| 久久综合久久综合九色| 亚洲av综合日韩| 99久久综合给久久精品| 久久综合狠狠综合久久97色| 亚洲综合一区国产精品| 久久婷婷香蕉热狠狠综合| 狠狠夜色午夜久久综合热91| 91精品国产综合久久香蕉 | 激情五月婷婷综合| 亚洲色欲久久久久综合网| 亚洲av成人综合网| 99久久国产综合精品swag| 国产亚洲综合网曝门系列| 久久久久一级精品亚洲国产成人综合AV区 | 色噜噜久久综合伊人一本| 久久综合精品国产二区无码| 日韩人妻无码一区二区三区综合部| 色天使久久综合给合久久97色| 一本一本久久a久久综合精品蜜桃| 亚洲国产精品综合福利专区 | 狠狠色丁香婷婷综合久久来| 一本大道AV伊人久久综合| 国产激情电影综合在线看 | 伊人色综合视频一区二区三区| 亚洲亚洲人成综合网络| 国产综合无码一区二区辣椒| 精品国产国产综合精品 | 国产综合色产在线精品| 一本色道久久综合一区| 久久久久久久尹人综合网亚洲 | 色综合天天综合婷婷伊人| 色综合久久中文字幕综合网| 伊人色综合久久88加勒| 亚洲色欲色欲综合网站|