新聞中心

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)閉