<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 第4課 點亮發(fā)光管程序分析

          第4課 點亮發(fā)光管程序分析

          作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
          上面我們的敘述了一個程序的編輯、編譯和下載完整的過程,最終點亮了第一個發(fā)光二極管,不過這個程序到底是什么意思,為什么應(yīng)該這么寫,可能有些人還不是很懂,下面給大家分析,并對里面涉及到的C語言知識進行講解。
          為了便于講解,這里把上節(jié)課的程序一并給出:
          例1 點亮第一個發(fā)光二極管程序
          (1)輸入源程序(又稱為程序編輯)
          #include//52系列單片機頭文件
          sbit D1=P1^0;//位定義單片機P1口的第1位
          void main()//主函數(shù)
          {
          D1=0;//點亮第一個發(fā)光二極管
          }
          1、頭文件
          程序的第一句#include稱為頭文件,頭文件就是C語言中的“文件包含的”的意思。所謂“文件包含”是指在一個文件內(nèi)將另外一個文件的內(nèi)容全部包含進來。因為被包含的文件中的一些定義和命令使用的頻率很高,幾乎每個程序中都可能要用到,為了提高編程效率,減少編程人員的重得勞動,將這些定義和命令單獨組成一個文件,如reg52.h,然后用#include包含進來就可以了,這個就相當(dāng)于工業(yè)上的標(biāo)準(zhǔn)零件,拿來直接用就可以了。
          在程序中加入頭文件通常有兩種方法,分別是#include和#include“reg52.h”,注意頭文件句末不需要加“;”否者編譯器編譯時會報錯。加頭文件時< >和“”兩者是有區(qū)別的,主要如下:
          當(dāng)使用< >包含頭文件時,程序編譯時編譯器會首先到keil軟件的安裝文件下進行尋找,具體在keilC51INC這個文件下,如果沒有找到,剛編譯時會報錯。
          當(dāng)使用“”包含頭文件時,程序編譯時編譯器會首先到當(dāng)前工程所在的文件夾下尋找,如果沒有找到,則馬上到keil軟件的安裝文件下進行尋找,如果都沒有找到,則編譯時會報錯。由于在安裝文件下,所以一般寫成#include,就可以了。
          現(xiàn)在我們打開reg52.h文件,看里面具體內(nèi)容,可以直接在安裝文件keilC51INC直接找到reg52.h文件,也可以在編輯界面將鼠標(biāo)箭頭放在#include,然后右鍵再選擇
          Open docment ,如圖12所示。
          圖12 打開頭文件
          此時會出現(xiàn)reg52.h的內(nèi)容如下:
          /*--------------------------------------------------------------------------
          REG52.H
          Header file for generic 80C52 and 80C32 microcontroller.
          Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
          All rights reserved.
          --------------------------------------------------------------------------*/
          #ifndef __REG52_H__
          #define __REG52_H__
          /* BYTE Registers */
          sfr P0 = 0x80;
          sfr P1 = 0x90;
          sfr P2 = 0xA0;
          sfr P3 = 0xB0;
          sfr PSW = 0xD0;
          sfr ACC = 0xE0;
          sfr B = 0xF0;
          sfr SP = 0x81;
          sfr DPL = 0x82;
          sfr DPH = 0x83;
          sfr PCON = 0x87;
          sfr TCON = 0x88;
          sfr TMOD = 0x89;
          sfr TL0 = 0x8A;
          sfr TL1 = 0x8B;
          sfr TH0 = 0x8C;
          sfr TH1 = 0x8D;
          sfr IE = 0xA8;
          sfr IP = 0xB8;
          sfr SCON = 0x98;
          sfr SBUF = 0x99;
          /* 8052 Extensions */
          sfr T2CON = 0xC8;
          sfr RCAP2L = 0xCA;
          sfr RCAP2H = 0xCB;
          sfr TL2 = 0xCC;
          sfr TH2 = 0xCD;
          /* BIT Registers */
          /* PSW */
          sbit CY = PSW^7;
          sbit AC = PSW^6;
          sbit F0 = PSW^5;
          sbit RS1 = PSW^4;
          sbit RS0 = PSW^3;
          sbit OV = PSW^2;
          sbit P = PSW^0; //8052 only
          /* TCON */
          sbit TF1 = TCON^7;
          sbit TR1 = TCON^6;
          sbit TF0 = TCON^5;
          sbit TR0 = TCON^4;
          sbit IE1 = TCON^3;
          sbit IT1 = TCON^2;
          sbit IE0 = TCON^1;
          sbit IT0 = TCON^0;
          /* IE */
          sbit EA = IE^7;
          sbit ET2 = IE^5; //8052 only
          sbit ES = IE^4;
          sbit ET1 = IE^3;
          sbit EX1 = IE^2;
          sbit ET0 = IE^1;
          sbit EX0 = IE^0;
          /* IP */
          sbit PT2 = IP^5;
          sbit PS = IP^4;
          sbit PT1 = IP^3;
          sbit PX1 = IP^2;
          sbit PT0 = IP^1;
          sbit PX0 = IP^0;
          /* P3 */
          sbit RD = P3^7;
          sbit WR = P3^6;
          sbit T1 = P3^5;
          sbit T0 = P3^4;
          sbit INT1 = P3^3;
          sbit INT0 = P3^2;
          sbit TXD = P3^1;
          sbit RXD = P3^0;
          /* SCON */
          sbit SM0 = SCON^7;
          sbit SM1 = SCON^6;
          sbit SM2 = SCON^5;
          sbit REN = SCON^4;
          sbit TB8 = SCON^3;
          sbit RB8 = SCON^2;
          sbit TI = SCON^1;
          sbit RI = SCON^0;
          /* P1 */
          sbit T2EX = P1^1; // 8052 only
          sbit T2 = P1^0; // 8052 only
          /* T2CON */
          sbit TF2 = T2CON^7;
          sbit EXF2 = T2CON^6;
          sbit RCLK = T2CON^5;
          sbit TCLK = T2CON^4;
          sbit EXEN2 = T2CON^3;
          sbit TR2 = T2CON^2;
          sbit C_T2 = T2CON^1;
          sbit CP_RL2 = T2CON^0;
          #endif
          該頭文件主要是對52單片機所有特殊功能寄存器的地址進行聲明。
          sfr P1 = 0x90這句話表示:P1口所對應(yīng)的特殊功能寄存器P1在內(nèi)存中的地址為0x80。換另一種說法就是我們對0x80處的寄存器重新取名P0,以后我們在程序中對P0進行操作,就相當(dāng)于直接對0x80處的寄存器進行操作。
          sfr表示特殊功能寄存器的意思,它并非標(biāo)準(zhǔn)C語言的關(guān)鍵字,而是Keil為能直接訪問80C51中的SFR而提供了一個新的關(guān)鍵詞,其用法是:sfr 特殊功能寄存器名=地址值(注意對于頭文件里“特殊功能寄存器名”,用戶實際上也可以修改的,如P1=0x80,也可改為A1=0x80,但sfr和地址值則不能更改,否者會編譯出錯。)
          以上是對寄存器地址和定義和聲明作了解釋,大家需要牢牢記?。褐挥袑拇嫫鬟M行聲明地址后,我們才能對其進行賦相關(guān)的值,keil軟件才能編譯通。
          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();