我們?cè)谟?a href="http://www.womende.cn/zhuanti/LWf9SG" style="color:#4595e6;" target="_blank">c語(yǔ)言編程是往往第一行就是reg51.h或者其他的自定義頭文件,我們?cè)趺礃觼?lái)理解呢?
1)“文件包含”處理。
程序的第一行是一個(gè)“文件包含”處理。
所謂“文件包含”是指一個(gè)文件將另外一個(gè)文件的內(nèi)容全部包含進(jìn)來(lái)。程序中包含REG51.h
文件的目的是為了要使用P1 (還有其他更多的符號(hào))這個(gè)符號(hào),即通知C 編譯器,程序中所寫(xiě)的P1 是指80C51單片機(jī)的P1 端口而不是其它變量。這是如何做到的呢?
打開(kāi)reg51.h 可以看到這樣的一些內(nèi)容:
(此文件一般在C:\KEIL\C51\INC下 ,INC文件夾根目錄里有不少頭文件,并且里面還有很多以公司分類(lèi)的文件夾,里面也都是相關(guān)產(chǎn)品的頭文件。如果我們要使用自己寫(xiě)的頭文件,使用的時(shí)候只需把對(duì)應(yīng)頭文件拷貝到INC文件夾里就可以了。)
/*--------------------------------------------------------------------------
REG51.H
Header file for generIC 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil SOFtware, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __REG51_H__
#define __REG51_H__
/* BYTE Register */
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;
/* BIT Register */
/* PSW */
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;
/* TCON */
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;
/* IE */
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;
/* IP */
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;
/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
/* SCON */
sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;
#endif
熟悉80C51 內(nèi)部結(jié)構(gòu)的讀者不難看出,這里都是一些符號(hào)的定義,即規(guī)定符號(hào)名與地
址的對(duì)應(yīng)關(guān)系。注意其中有
sfr P1 = 0x90;
這樣的一行,即定義P1 與地址0x90 對(duì)應(yīng),P1 口的地址就是0x90
(0x90 是C 語(yǔ)言中十六進(jìn)制數(shù)的寫(xiě)法,相當(dāng)于匯編語(yǔ)言中寫(xiě)90H)。
從這里還可以看到一個(gè)頻繁出現(xiàn)的詞:sfr
sfr 并非標(biāo)準(zhǔn)C 語(yǔ)言的關(guān)鍵字,而是Keil 為能直接訪問(wèn)80C51 中的SFR 而提供了一個(gè)新
的關(guān)鍵詞,其用法是:
sfrt 變量名=地址值。
2)符號(hào)P1_0 來(lái)表示P1.0 引腳。
在C 語(yǔ)言里,如果直接寫(xiě)P1.0,C 編譯器并不能識(shí)別,而且P1.0 也不是一個(gè)合法的C
語(yǔ)言變量名,所以得給它另起一個(gè)名字,這里起的名為P1_0,可是P1_0 是不是就是P1.0
呢?你這么認(rèn)為,C 編譯器可不這么認(rèn)為,所以必須給它們建立聯(lián)系,這里使用了Keil C
的關(guān)鍵字sbit 來(lái)定義,sbit 的用法有三種:
第一種方法:sbit 位變量名=地址值
第二種方法:sbit 位變量名=SFR 名稱(chēng)^變量位地址值
第三種方法:sbit 位變量名=SFR 地址值^變量位地址值
如定義PSW 中的OV 可以用以下三種方法:
sbit OV=0xd2 (1)說(shuō)明:0xd2 是OV 的位地址值
sbit OV=PSW^2 (2)說(shuō)明:其中PSW 必須先用sfr 定義好
sbit OV=0xD0^2 (3)說(shuō)明:0xD0 就是PSW 的地址值
因此這里用sfr P1_0=P1^0;就是定義用符號(hào)P1_0 來(lái)表示P1.0 引腳,如果你愿意也可以
起P10 一類(lèi)的名字,只要下面程序中也隨之更改就行了。
下面再附上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
上一篇:C51程序設(shè)計(jì)中斷及寄存器使用方法
下一篇:I2C總線(xiàn)的工作原理與在51單片機(jī)中的應(yīng)用
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 【下載】LAT1526 利用SPI的下溢實(shí)現(xiàn)回顯功能
- 【下載】LAT1509 STM32G0B1的FDCAN進(jìn)行通信丟包和多包案例分享
- 【下載】LAT1511 運(yùn)行Ux_Host_HUB_HID_MSC通過(guò)Hub連接U盤(pán)讀寫(xiě)不穩(wěn)定問(wèn)題分析
- 【下載】LAT1466 USB x Device HID Standalone的移植
- 【下載】LAT1488 STM32 USBxDevice MSC standalone移植示例
- 【下載】LAT1482 STM32G0單線(xiàn)串口通信幀錯(cuò)誤問(wèn)題解析
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- RISC-V人才該怎么培養(yǎng)?專(zhuān)家這樣說(shuō)
- 割草機(jī)器人,四大流派的巔峰之戰(zhàn)
- 車(chē)載顯示迎來(lái)三大革命丨“形態(tài)”革命
- 什么是“CDC+空懸”?
- 汽車(chē)電子信息安全:如何有效保護(hù)硬件Debug口?
- 新能源汽車(chē)核心技術(shù)之“大三電”、“小三電”
- 芯原如何推動(dòng)RISC-V嵌入式軟件人才發(fā)展?
- Arm 技術(shù)助力《國(guó)家地理》探險(xiǎn)家繪制地球海洋圖景
- Arm SME2 技術(shù)加速安卓 AI 升級(jí),驅(qū)動(dòng)移動(dòng)應(yīng)用下一代功能革新
- VGA接口定義、功能用途和種類(lèi)
- 3月21日有獎(jiǎng)直播:ADI新一代高阻抗輸入SAR ADC的優(yōu)勢(shì)與應(yīng)用
- 下載泰克電源設(shè)計(jì)測(cè)試方案+圖文攻略 幫助工程師解決電源效率問(wèn)題。有好禮
- Sitara™ AM335x ARM® Cortex™-A8 團(tuán)購(gòu)
- 免費(fèi)試用Atmel MCU開(kāi)發(fā)板,搶“鮮”體驗(yàn)優(yōu)越性能,更有大獎(jiǎng)等你拿!
- 閱讀TI DLP ® 博文,帶你走進(jìn)不一樣的視野!
- Littelfuse第2期 | 符合AEC-Q200 車(chē)規(guī)的保險(xiǎn)絲/熔斷器
- 芯幣競(jìng)價(jià)全新回歸 抱回驚喜迎接新年
- 4月25日上午10:00-11:30 ADI與您相約 TOF (Time Of Flight) 技術(shù)介紹及產(chǎn)品應(yīng)用 有獎(jiǎng)直播
- 觀看TI IOT解決方案研討會(huì) 答題即可贏取更多精美好禮!
- 暢游安富利人工智能云會(huì)展,挑戰(zhàn)60天打卡學(xué)習(xí)養(yǎng)成記!沖擊華為Mate40 Pro、Apple iPad Air等豪禮啦!
- 納思達(dá):相變存儲(chǔ)器在打印機(jī)領(lǐng)域銷(xiāo)售超500萬(wàn)顆
- 韓媒:蘋(píng)果明年 iPhone或全面采用觸控一體OLED 屏,或引領(lǐng)市
- 數(shù)碼論:不止是數(shù)字變大,手機(jī)快充功率超過(guò)100瓦那些事
- 8月通線(xiàn)!中環(huán)領(lǐng)先12英寸線(xiàn)年內(nèi)實(shí)現(xiàn)月產(chǎn)能5-10萬(wàn)片
- 完成上市輔導(dǎo)!又一存儲(chǔ)器芯片廠商擬闖關(guān)科創(chuàng)板IPO
- 2021年的自動(dòng)駕駛會(huì)有怎樣的發(fā)展
- 如何實(shí)現(xiàn)工業(yè)4.0的發(fā)展
- 5G、MEC與機(jī)器視覺(jué)相遇將擦出怎樣的火花?
- ams推出新系列高速工業(yè)圖像傳感器,具有超高分辨率
- 關(guān)于3D打印支撐,你可能忽略了這些要點(diǎn)!