<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 個字
      [ 查看全部 ] 網友評論
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: AV色综合久久天堂AV色综合在| 一本久久a久久精品综合香蕉| 国产美女亚洲精品久久久综合| 综合久久国产九一剧情麻豆| 99久久综合精品免费| 色欲天天婬色婬香视频综合网| 狠狠色综合久久久久尤物| 在线综合亚洲中文精品| 久久香蕉综合色一综合色88| 久久婷婷色香五月综合激情| 综合色就爱涩涩涩综合婷婷| 天天综合天天综合色在线| 精品综合久久久久久98| 中文自拍日本综合| 精品久久综合1区2区3区激情| 亚洲国产精品成人综合色在线 | 亚洲人成伊人成综合网久久| 国产一区二区三区亚洲综合| 亚洲欧洲自拍拍偷综合| 久久综合久久久久| 久久综合久久综合九色| 99久久婷婷免费国产综合精品 | 婷婷综合激六月情网| 亚洲国产综合精品中文第一| 色综合久久中文综合网| 欧洲 亚洲 国产图片综合| 婷婷丁香五月激情综合| 人人狠狠综合久久亚洲| 亚洲综合无码一区二区痴汉| 伊人情人综合成人久久网小说| 中文字幕亚洲综合久久| 亚洲a∨国产av综合av下载| 亚洲av成人综合网| 色偷偷亚洲第一综合| 天天综合亚洲色在线精品| 好吊色青青青国产综合在线观看| 一本久道综合在线无码人妻| 日日狠狠久久偷偷色综合96蜜桃| 亚洲国产免费综合| 久久综合久久综合亚洲| 亚洲色偷偷狠狠综合网|