色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
          上面我們的敘述了一個(gè)程序的編輯、編譯和下載完整的過(guò)程,最終點(diǎn)亮了第一個(gè)發(fā)光二極管,不過(guò)這個(gè)程序到底是什么意思,為什么應(yīng)該這么寫(xiě),可能有些人還不是很懂,下面給大家分析,并對(duì)里面涉及到的C語(yǔ)言知識(shí)進(jìn)行講解。
          為了便于講解,這里把上節(jié)課的程序一并給出:
          例1 點(diǎn)亮第一個(gè)發(fā)光二極管程序
          (1)輸入源程序(又稱(chēng)為程序編輯)
          #include//52系列單片機(jī)頭文件
          sbit D1=P1^0;//位定義單片機(jī)P1口的第1位
          void main()//主函數(shù)
          {
          D1=0;//點(diǎn)亮第一個(gè)發(fā)光二極管
          }
          1、頭文件
          程序的第一句#include稱(chēng)為頭文件,頭文件就是C語(yǔ)言中的“文件包含的”的意思。所謂“文件包含”是指在一個(gè)文件內(nèi)將另外一個(gè)文件的內(nèi)容全部包含進(jìn)來(lái)。因?yàn)楸话奈募械囊恍┒x和命令使用的頻率很高,幾乎每個(gè)程序中都可能要用到,為了提高編程效率,減少編程人員的重得勞動(dòng),將這些定義和命令單獨(dú)組成一個(gè)文件,如reg52.h,然后用#include包含進(jìn)來(lái)就可以了,這個(gè)就相當(dāng)于工業(yè)上的標(biāo)準(zhǔn)零件,拿來(lái)直接用就可以了。
          在程序中加入頭文件通常有兩種方法,分別是#include和#include“reg52.h”,注意頭文件句末不需要加“;”否者編譯器編譯時(shí)會(huì)報(bào)錯(cuò)。加頭文件時(shí)< >和“”兩者是有區(qū)別的,主要如下:
          當(dāng)使用< >包含頭文件時(shí),程序編譯時(shí)編譯器會(huì)首先到keil軟件的安裝文件下進(jìn)行尋找,具體在keilC51INC這個(gè)文件下,如果沒(méi)有找到,剛編譯時(shí)會(huì)報(bào)錯(cuò)。
          當(dāng)使用“”包含頭文件時(shí),程序編譯時(shí)編譯器會(huì)首先到當(dāng)前工程所在的文件夾下尋找,如果沒(méi)有找到,則馬上到keil軟件的安裝文件下進(jìn)行尋找,如果都沒(méi)有找到,則編譯時(shí)會(huì)報(bào)錯(cuò)。由于在安裝文件下,所以一般寫(xiě)成#include,就可以了。
          現(xiàn)在我們打開(kāi)reg52.h文件,看里面具體內(nèi)容,可以直接在安裝文件keilC51INC直接找到reg52.h文件,也可以在編輯界面將鼠標(biāo)箭頭放在#include,然后右鍵再選擇
          Open docment ,如圖12所示。
          圖12 打開(kāi)頭文件
          此時(shí)會(huì)出現(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
          該頭文件主要是對(duì)52單片機(jī)所有特殊功能寄存器的地址進(jìn)行聲明。
          sfr P1 = 0x90這句話(huà)表示:P1口所對(duì)應(yīng)的特殊功能寄存器P1在內(nèi)存中的地址為0x80。換另一種說(shuō)法就是我們對(duì)0x80處的寄存器重新取名P0,以后我們?cè)诔绦蛑袑?duì)P0進(jìn)行操作,就相當(dāng)于直接對(duì)0x80處的寄存器進(jìn)行操作。
          sfr表示特殊功能寄存器的意思,它并非標(biāo)準(zhǔn)C語(yǔ)言的關(guān)鍵字,而是Keil為能直接訪(fǎng)問(wèn)80C51中的SFR而提供了一個(gè)新的關(guān)鍵詞,其用法是:sfr 特殊功能寄存器名=地址值(注意對(duì)于頭文件里“特殊功能寄存器名”,用戶(hù)實(shí)際上也可以修改的,如P1=0x80,也可改為A1=0x80,但sfr和地址值則不能更改,否者會(huì)編譯出錯(cuò)。)
          以上是對(duì)寄存器地址和定義和聲明作了解釋?zhuān)蠹倚枰卫斡涀。褐挥袑?duì)寄存器進(jìn)行聲明地址后,我們才能對(duì)其進(jìn)行賦相關(guān)的值,keil軟件才能編譯通。
          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉