單片機(jī)c語言教程全集_第1頁
單片機(jī)c語言教程全集_第2頁
單片機(jī)c語言教程全集_第3頁
單片機(jī)c語言教程全集_第4頁
單片機(jī)c語言教程全集_第5頁
已閱讀5頁,還剩85頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

單片機(jī)C語言教程全集

第一課建立你的第個KeilC51項(xiàng)目

隨著單片機(jī)技術(shù)的不斷發(fā)展,以單片機(jī)C語言為主流的高級語言也不斷被更多的單

片機(jī)愛好者和工程師所喜愛。使用C51肯定要使用到編譯器,以便把寫好的C程序編譯

為機(jī)器碼,這樣單片機(jī)才能執(zhí)行編寫好的程序。KEILUVISI0N2是眾多單片機(jī)應(yīng)用開發(fā)

軟件中優(yōu)秀的軟件之,它支持眾多不一樣公司的MCS51架構(gòu)的芯片,它集編輯,編譯,

仿真等于一體,同時還支持,PLM,匯編和C語言的程序設(shè)計(jì),它的界面和常用的微軟VC++

的界面相似,界面友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強(qiáng)大的功能。本

站提供的單片機(jī)c語言教程都是基于keilc51的。

下面結(jié)合8051介紹單片機(jī)C語言的優(yōu)越性:

?無須懂得單片機(jī)的具體硬件,也能夠編出符合硬件實(shí)際的專業(yè)水平的程序;

?不懂得單片機(jī)的指令集,也能夠編寫完美的單片機(jī)程序;

?不同函數(shù)的數(shù)據(jù)實(shí)行覆蓋,有效利用片上有限的RAM空間;

?提供auto、static、const等存儲類型和專門針對8051單片機(jī)的data、idata、

pdata、xdata、code等存儲類型,自動為變量合理地分配地址;

?C語言提供復(fù)雜的數(shù)據(jù)類型(數(shù)組、結(jié)構(gòu)、聯(lián)合、枚舉、指針等),極大地增強(qiáng)了程

序處理能力和靈活性;

?提供small、compact、large等編譯模式,以適應(yīng)片上存儲器的大小;

?中斷服務(wù)程序的現(xiàn)場保護(hù)和恢復(fù),中斷向量表的填寫,是直接與單片機(jī)相關(guān)的,

都由C編譯器代辦;

?程序具有堅(jiān)固性:數(shù)據(jù)被破壞是導(dǎo)致程序運(yùn)行異常的重要因素。C語言對數(shù)據(jù)進(jìn)行

了許多專業(yè)性的處理,避免了運(yùn)行中間非異步的破壞

?提供常用的標(biāo)準(zhǔn)函數(shù)庫,以供用戶直接使用;

?有嚴(yán)格的句法檢查,錯誤很少,可容易地在高級語言的水平上迅速地被排掉;

?可方便地接受多種實(shí)用程序的服務(wù):如片上資源的初始化有專門的實(shí)用程序自動

生成;再如,有實(shí)時多任務(wù)操作系統(tǒng)可調(diào)度多道任務(wù),簡化用戶編程,提高運(yùn)行的安全性

等等。

?頭文件中定義宏、說明復(fù)雜數(shù)據(jù)類型和函數(shù)原型,有利于程序的移植和支持單片

機(jī)的系列化產(chǎn)品的開發(fā);

以上簡單介紹了KEILC51軟件,要使用KEILC51軟件,必需先要安裝它,這也是學(xué)

習(xí)單片機(jī)編程語言所要求的第一步一一建立學(xué)習(xí)環(huán)境。

本站提供無限制版的keilc51下載(此處)(安裝的方法在壓縮包內(nèi)有詳細(xì)說明,這

里就不做介紹了)

安裝好后,您是不是想建立自己的第一個單片機(jī)C語言程序項(xiàng)目呢?下面就讓我們一

起來建立一個小程序吧,請根據(jù)教程一步步的來,你絕對可以在短時間內(nèi)熟悉c51的。

本教程所涉及c51源代碼請點(diǎn)此下載

首先當(dāng)然是運(yùn)行KEIL軟件,接著按下面的步驟建立您的第個項(xiàng)目:

(1)點(diǎn)擊Project菜單,選擇彈出的下拉式菜單中的NewProject,如圖1-2。接

著彈出?個標(biāo)準(zhǔn)Windows文件對話窗口,如圖1-3。在“文件名”中輸入您的第一個C

程序項(xiàng)目名稱,這里我們用“test”?!氨4妗焙蟮奈募U(kuò)展名為uv2,這是KEIL

uVision2項(xiàng)目文件擴(kuò)展名,以后能直接點(diǎn)擊此文件以打開先前做的項(xiàng)目。

夜pVision2

ProjectDebugPeripheralsToolsSVCSJ

NewProject..,

ImportpVisionlProject...

OpenProject

CloseProject

FileExtensionsjBooksandEnvironment

Targets;Groups,Files,,,

SelectDeviceforTarget,..

圖1-2NewProject菜單

圖1-3文件窗口

(2)選擇所要的單片機(jī),這里選擇常用的Ateml公司的AT89c51。而且本單片機(jī)c

語言教程里的大部分程序都是基于此芯片的,此時屏幕如圖14所示。AT89C51有什么

功能、特點(diǎn)呢?看圖中右邊有簡單的介紹。完成上面步驟后,就可以進(jìn)行程序的編寫了。

(3)首先在項(xiàng)目中創(chuàng)建新的程序文件或加入I口程序文件。如果您沒有現(xiàn)成的程序,那

么就要新建一個程序文件。在KEIL中有一些程序的Demo,在這里我們還是以一個C程

序?yàn)槔榻B如何新建?個C程序和如何加到您的第一個項(xiàng)目中吧。點(diǎn)擊圖1-5中1

的新建文件的快捷按鈕,在2中出現(xiàn)一個新的文字編輯窗口,這個操作也能通過菜單

File-New或快捷鍵Ctrl+N來實(shí)現(xiàn)。好了,現(xiàn)在能編寫程序了。卜面是經(jīng)典的一段程

序,呵,如果您看過別的程序書也許也有類似的程序:

iiinclude

#include

voidmain(void)

SCON=0x50;〃串行口方式1,允許接收

TMOD=0x20;〃定時器1定時方式2

TCON=0x40;〃設(shè)定時器1開始計(jì)數(shù)

TH1=0xE8;//11.0592MHz1200波特率

TL1=0xE8;TI=1;

TRI=1;〃啟動定時器

whiled)

(

)

)

printf("HelloWorld!\n,z);〃顯示HelloWorld

SelectDeviceforTarget'Target1,2JxJ

CPU

Vendor

Dtvic?AT89csi「UseExtendedLink"(LX51)inst??dofBL51

FMily:BCS-51r〔k,ExtendedAxEbler(AX51)ofA51

口3?Description:

ATS9C40518051b0”dFullStaticCMOScontrollerwithThrt?'Level

32I/Olines,2Tia?rx/Cotmt?rs6Interruptssources

AT89C51/

4KFlashMeory,128BytesOn-chipRAM

J

1

1

1

1

確定I股清

圖1-4選取芯片

成test-fl|ision2

圖1-5新建程序文件

這段程序的功能是不斷從串行口輸出“Hell。World!”字符,先不管程序的語法和

意思吧,先看看如何把它加入到項(xiàng)目中和如何編譯試運(yùn)行。

(4)點(diǎn)擊圖1-5中的3保存新建的程序,也能用菜單File-Save或快捷鍵Ctrl+S

進(jìn)行保存。因是新文件所以保存時會彈出類似圖卜3的文件操作窗口,把第一個程

序命名

為testl.c,保存在項(xiàng)目所在的目錄中,這個時候您會發(fā)現(xiàn)程序單詞有了不一樣的

顏色,說明KEIL的C語言語法檢查生效了。如圖『6鼠標(biāo)在屏幕左邊的SourceGroup1

文件夾圖標(biāo)上右擊彈出菜單,在這里能做在項(xiàng)目中增加減少文件等操作。選“AddFile

toGroup"SourceGroup1'"彈出文件窗口,選擇剛剛保存的文件,按ADD按鈕,

關(guān)閉文件窗,程序文件已加到項(xiàng)目中了。這個時候在SourceGroup1文件夾圖標(biāo)左邊出

現(xiàn)了?個小+號說明,文件組中有了文件,點(diǎn)擊它能展開查看。

PBjtest-MisionZ

FileEditViewProjectDebugPeripheralsToolsSVCSWindowHelp

倒百。013電嚕|qa|率率4%,%叁聃『

g闔幽鬲米|Target1三|

d*J白D:\MyData\其它、我的文章\C51正

臼行Target1

tfinclude<AT89X51.H>

;“…國^Sourci

SelectDeviceforTarget'Target1'

OptionsforGroup'SourceGroup1'

OpenFile

lOjRebuildtarget

(XiBuildtargetF7

TranslateFile

后Stopbuild

AddFilestoGroup'SourceGroup1'

Targets^Groups,Files...

RemoveGroup'SourceGroup1'andit'sFiles

o

圖1-6把文件加入到項(xiàng)目文件組中

(5)C程序文件已被加到了項(xiàng)目中了,下面就剩下編譯運(yùn)行了。這個項(xiàng)目只是用做學(xué)

習(xí)新建程序項(xiàng)目和編譯運(yùn)行仿真的基本方法,所以使用軟件默認(rèn)的編譯設(shè)置,它不會生

成用于芯片燒寫的HEX文件。先來看圖『7吧,圖中1、2、3都是編譯按鈕,不一

樣是1是用于編譯單個文件。2是編譯鏈接當(dāng)前項(xiàng)£1,如果先前編譯過一次之后文件

沒有做動編輯改動,這個時候再點(diǎn)擊是不會再次重新編譯的。3是重新編譯,每點(diǎn)擊」

次均會再次編譯鏈接一次,不管程序是否有改動。在3右邊的是停止編譯按鈕,只有

點(diǎn)擊了前三個中的任一個,停止按鈕才會生效。5是菜單中的它們。在4中能看到編

譯的錯誤信息和使用的系統(tǒng)資源情況等,以后我們要查錯就靠它了。6是有一個小放大

鏡的按鈕,這就是開啟'關(guān)閉調(diào)試模式的按鈕,它也存在于菜單Debug-Start\StopDebug

Session,快捷鍵為Ctrl+F5o

P1Vtest-Wision2

FileEditView:ProjectDebugPeripheral

窗蘇凰。NewProject...

ImportpVisionlProject

奧昌@6OpenProject

卷置管昌CloseProject

0二左FileExtensions3Books.

Targets^Groups^Files.

SelectDeviceForTarge

RemoveItem

OptionsforTarget'Tar

ClearGroupandFileO[

xJlBuildtare(XiBuildtarget,)

compilingiOlRebuildalltargetfiles

linking..

ProgramS:彥TranslateD:\MyData\J

"test"-(

通Stopbuild

圖1-7編譯程序

(6)進(jìn)入調(diào)試模式,軟件窗口樣式大致如圖―8所示。圖中1為運(yùn)行,當(dāng)程序處于

停止?fàn)顟B(tài)時才有效,2為停止,程序處于運(yùn)行狀態(tài)時才有效。3是復(fù)位,模擬芯片的復(fù)

位,程序回到最開頭處執(zhí)行。按4能打開5中的串行調(diào)試窗口,這個窗口能看到從51

芯片的串行口輸入輸出的字符,這里的第一個項(xiàng)目也正是在這里看運(yùn)行結(jié)果。這些在菜

單中也有。首先按4打開串行調(diào)試窗口,再按運(yùn)行鍵,這個時候就能看到串行調(diào)試窗

口中不斷的打印“Hell。World!?.最后要停止程序運(yùn)行回到文件編輯模式中,就要先

按停止按鈕再按開啟,關(guān)閉調(diào)試模式按鈕。然后就能進(jìn)行關(guān)閉KEIL等相關(guān)操作

FileEditViewProjectDebugPeripheralsToolsSVCSWindowHelp

窗百。0)|%船亳|二總

率率々%%吻聃圉

?|昌|@|底國他命眄E3

?}中陰%}o四

4

自D:\MyD._|口1xwSerial#1

tfinclude<AT89X51.H—HelloWorld!

#include<stdio.h>—HelloWorld!-

HelloWorld!.)

voidmain(void)HelloWorld!

HelloWorld!

6SCON=0x50;//串」HelloWorld!

TMnn=nv?n-//市ii1XI

[j|Files(51...5[=]testl.c國Serial#1

XjLoad"DAXM^wX1

,djj勺

II

圖1-8調(diào)試運(yùn)行程序

色cn

sylar源于heros

lize314于2010-05-06給此貼評了10分

看推薦視頻,得100元卓越禮品券

q回復(fù)二回復(fù)本帖少回到頂端

單片機(jī)c語言教程第二課C51HEX文件的生成和單片機(jī)最小系統(tǒng)發(fā)表于[2

2009-07-3015:03:51樓]

?sylar

上一篇建立了第一個單片機(jī)c語言項(xiàng)目,但為了讓編譯好的程序能通

過編程器寫入51芯片中,要先用編譯器生成HEX文件,卜面來看看如何

用KEILUVISI0N2來編譯生成用于燒寫芯片的HEX文件。HEX文件格式是

我是加高Intel公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字節(jié),所有數(shù)據(jù)使用

級會員16進(jìn)制數(shù)字表示,常用來保存單片機(jī)或其他處理器的目標(biāo)程序代碼。它保

存物理程序存儲區(qū)中的目標(biāo)代碼映象。一般的編程器都支持這種格式。我

用戶等級:

們先來打開第一個項(xiàng)目,打開它的所在目錄,找到test.Uv2的文件就能

院士打開先前的項(xiàng)目了。然后右擊圖2-1中的1項(xiàng)目文件夾,彈出項(xiàng)目功能菜

加為好友單,選OptionsforTarget*Targetl',彈出項(xiàng)目選項(xiàng)設(shè)置窗口,同樣

發(fā)短消息先選中項(xiàng)目文件夾圖標(biāo),這個時候在Project菜單中也有一樣的菜單可選。

打開項(xiàng)目選項(xiàng)窗口,轉(zhuǎn)到Output選項(xiàng)頁圖2-2所示,圖中1是選擇編譯

所有發(fā)言

輸出的路徑,2是設(shè)置編譯輸出生成的文件名,3則是決定是否要創(chuàng)建HEX

個人檔案文件,選中它就能輸出HEX文件到指定的路徑中。選好了?好,我們再將

它重新編譯一次,很快在編譯信息窗口中就顯示HEX文件創(chuàng)建到指定的路

最后登陸時

徑中了,如圖2-3。這樣我們就可用自己的編程器所附帶的軟件去讀取并

間:燒到芯片了,再用實(shí)驗(yàn)板看結(jié)果,至于編程器或仿真器品種繁多具體方法

2010-06-04就看它的說明書了,這里也不做討論。

08:20:15(技巧:一、在圖2T中的1里的項(xiàng)目文件樹形目錄中,先選中對象,

狀態(tài):離線再單擊它就可對它進(jìn)行重命名操作,雙擊文件圖標(biāo)便可打開文件。二、在

Project下拉菜單的最下方有最近編輯過

的項(xiàng)目路徑保存,這里能快速打開最近在編輯的項(xiàng)目。)

圖2-1項(xiàng)目功能菜單

圖2-2項(xiàng)目選項(xiàng)窗口

[=)Files于…UjB

*1Buildtarget'Target1'

Jcompilingtest1.c...

linking...

ProgramSize:data=30.1xdata=0code=110。

creotinqhexfilefrom"test",??

"test"-0Error(s)r0Warning(s).

―[\Build人Command入FindinFiles/

圖2-3編譯信息窗口

或許您已把編譯好的文件燒到了芯片上,如果您購買或自制了帶串行

口輸出元件的學(xué)習(xí)實(shí)驗(yàn)板,那您就能把串行口和PC機(jī)串行口相聯(lián)用串行

口調(diào)試軟件或Windows的超級終端,將其波特率設(shè)為1200,就能看到不

停輸出的“Hell。World!”字樣。如果您還沒有實(shí)驗(yàn)板,那這里先說說

AT89C51的最小化系統(tǒng),再以一實(shí)例程序驗(yàn)證最小化系統(tǒng)是否在運(yùn)行,這

個最小化系統(tǒng)也易于自制用于實(shí)驗(yàn)。圖2-4便是AT89c51的最小化系

統(tǒng),不過為了讓我們能看出它是在運(yùn)行的,加了一個電阻和一個LED,用

以顯示它的狀態(tài),晶體震蕩器能根據(jù)自己的情況使用,一般實(shí)驗(yàn)板上是用

11.0592MHz或12MHz,使用前者的好外是能產(chǎn)生標(biāo)準(zhǔn)的串行口波特率,后

者則一個機(jī)器周期為1微秒,便于做精確定時。在自己做實(shí)驗(yàn)里,注意的

是VCC是+5V的,不能高于此值,不然將損壞單片機(jī),太低則不能正常

工作。在31腳要接高電平,這樣我們才能執(zhí)行片內(nèi)的程序,如接低電平

則使用片外的程序存儲器。卜面建一個新的項(xiàng)目名為OneLED來驗(yàn)證最小

化系統(tǒng)是否能工作(所有的例程都可在筆者的主頁下面下載到,網(wǎng)址:

。程序如下:

#include〃預(yù)處理命令

voidmain(void)〃主函數(shù)名

〃這是第一種注釋方式

unsignedinta;〃定義變量a為int類型

/*這是第二種注釋方式

*/

do{//dowhile組成循環(huán)

for(a=0;a<50000;a++);〃這是一個循環(huán)Pl_0=0;〃設(shè)P1.0口

為低電平,點(diǎn)亮LEDfor(a=0;a<50000;a++);〃這是一個循環(huán)Pl_0=

1;〃設(shè)P1.0口為高電平,熄滅LED

)

while(l);

)

13

s

2p103

3p113

4p12㈡3

5p13巴3

6p1403

7p15,3

Sp16。3

p17、

vcco

132

1Un

12弓2

-乙N

15

14H1

H。2

31|12

E;2

19

A

18X74

30pFXLJAc2

9*S

RhrSs

q

S.2K17II二

g

16RiM2

Wrs/Xn

AT89C51

O

VCC

圖2-4AT89c51最小化系統(tǒng)

這里先講講KEILC編譯器所支持的注釋語句。一種是以符號

開始的語句,符號之后的語句都被視為注釋,直到有回車換行。另一種是

在“/*”和“*/”符號之內(nèi)的為注釋。注釋不會被C編譯器所編譯。?

個C應(yīng)用程序中應(yīng)有一個main主函數(shù),main函數(shù)能調(diào)用別

的功能函數(shù),但其它功能函數(shù)不允許調(diào)用main函數(shù)。不論main函

數(shù)放在程序中的那個位置,總是先被執(zhí)行。用上面學(xué)到的知識編譯寫好的

OneLED程序,并把它燒到剛做好的最小化系統(tǒng)中。上電,剛開始時LED是

不亮的(因?yàn)樯想姀?fù)位后所有的10口都置1引腳為高電平),然后延時

一段時間(for(a=0;a<50000;a++)這句在運(yùn)行),LED亮,再延時,LED熄

滅,然后交替亮、火。第一個真正的小實(shí)驗(yàn)就做完,如果沒有這樣的效果

那么您就要認(rèn)真檢查一下電路或編譯燒寫的步驟了。

sylar源于heros

了解更多電源解決方案

q回復(fù)上回復(fù)本帖㈤回到頂端

單片機(jī)c語言教程第三課C51數(shù)據(jù)類型發(fā)表于2009-07-3015:04:52

sylar

每寫一個程序,總離不開數(shù)據(jù)的應(yīng)用,在學(xué)習(xí)c51語言的過程中掌握

理解數(shù)據(jù)類型也是很關(guān)鍵的。先看表3—1,表中列出了KEIL

uVision2單片機(jī)c語言編譯器所支持的數(shù)據(jù)類型。在標(biāo)準(zhǔn)C語言中基

我是MM高級本的數(shù)據(jù)類型為char,int,short,long,float和double,而在c51

會員編譯器中int和short相同,float和double相同,這里就不列

出說明了。下面來看看它們的具體定義:

用戶等級:院士

加為好友發(fā)短

消息

數(shù)據(jù)類型長度值域

所有發(fā)言個人

unsignedchar單字節(jié)0-255

檔案

signedchar單字節(jié)-128—+127

最后登陸時間:unsignedint雙字節(jié)0-65535

2010-06-04signedint雙字節(jié)-32768?+32767

08:20:15unsignedlong四字節(jié)0-4294967295

狀態(tài):離線signedlong四字節(jié)-2147483648?+2147483647

float四字節(jié)±1.175494E-38?±3.402823E+38

*1-3字節(jié)對象的地址

bit位0或1

sfr單字節(jié)0?255

sfrl6雙字節(jié)0-65535

sbit位0或1

表3-1KEILuVision2單片機(jī)c語言編譯器所支持的數(shù)據(jù)類型

1.char字符類型

char類型的長度是一個字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常

量。分無符號字符類型unsignedchar和有符號字符類型signed

char,默認(rèn)值為signedchar類型。unsignedchar類型用字節(jié)中

所有的位來表示數(shù)值,所能表達(dá)的數(shù)值范圍是0-255。signedchar

類型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表

示負(fù)數(shù),負(fù)數(shù)用補(bǔ)碼表示。所能表示的數(shù)值范圍是T28?+127。

unsignedchar常用于處理ASCII字符或用于處理小于或等于255

的整型數(shù)。

*正數(shù)的補(bǔ)碼與原碼相同,負(fù)二進(jìn)制數(shù)的補(bǔ)碼等于它的絕對值按位取

反后加1?

2.int整型

int整型長度為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。分有符號int

整型數(shù)signedint和無符號整型數(shù)unsignedint,默認(rèn)值為signed

int類型。signedint表示的數(shù)值范圍是-32768?+32767,字節(jié)中

最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù)。unsigned

int表示的數(shù)值范圍是0-65535。

先停一下來寫個小程序看看unsignedchar和unsignedint用于延

時的不一樣效果,說明它們的長度是不一樣的,學(xué)習(xí)它們的使用方法。

依舊用上一篇的最小化系統(tǒng)做實(shí)驗(yàn),不過要加多一個電阻和LED,如

圖3—1。實(shí)驗(yàn)中用D1的點(diǎn)亮表明正在用unsignedint數(shù)值延時,

D2點(diǎn)亮表明正在用unsignedchar數(shù)值延時。

圖3—1第3課實(shí)驗(yàn)用電路把這個項(xiàng)目稱為TwoLED,實(shí)驗(yàn)程序如

下:

#include〃預(yù)處理命令

voidmain(void)//主函數(shù)名

(

unsignedinta;//定義變量a為unsignedint類型

unsignedcharb;〃定義變量b為unsignedchar類型

do

{//dowhile組成循環(huán)

for(a=0;a<65535;a++)

Pl0=0;//65535次設(shè)P1.0口為低電平,點(diǎn)亮LEDPl0=1;//

設(shè)P1.0口為高電平,熄滅LED

for(a=0;a<30000;a++);//空循環(huán)

for(b=0;b<255;b++)

Pl_l=0;//255次設(shè)Pl.1口為低電平,點(diǎn)亮LEDPl」=1;//

設(shè)Pl.1口為高電平,熄滅LED

for(a=0;a<30000;a++);〃空循環(huán)

)

while(1);

)

同樣編譯燒寫,上電運(yùn)行您就能看到結(jié)果了。很明顯D1點(diǎn)亮的時間

長于D2點(diǎn)亮的時間。

這里必須要講的是,當(dāng)定義一個變量為特定的數(shù)據(jù)類型時,在程序使

用該變量不應(yīng)使它的值超過數(shù)據(jù)類型的值域。如本例中的變量b不

能賦超出0~255的值,如for(b=0;b<255;b++)改為for(b=0;

b<256;b++),編譯是能通過的,但運(yùn)行時就會有問題出現(xiàn),就是說b

的值永遠(yuǎn)都是小于256的,所以無法跳出循環(huán)執(zhí)行下一句P1J=L

從而造成死循環(huán)。同理a的值不應(yīng)超出0-65535。

3.long長整型

long長整型長度為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。分有符號

long長整型signedlong和無符號長整型unsignedlong,默認(rèn)值

為signedlong類型。signedint表示的數(shù)值范圍是-2147483648?

+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”

表示負(fù)數(shù)。unsignedlong表示的數(shù)值范圍是0~4294967295。

4.float浮點(diǎn)型

float浮點(diǎn)型在十進(jìn)制中具有7位有效數(shù)字,是符合IEEE-754標(biāo)

準(zhǔn)的單精度浮點(diǎn)型數(shù)據(jù),占用四個字節(jié)。因浮點(diǎn)數(shù)的結(jié)構(gòu)較復(fù)雜在以

后的章節(jié)中再做詳細(xì)的討論。

5.*指針型指針型本身就是一個變量,在這個變量中存放的指向另

一個數(shù)據(jù)的地址。這個指針變量要占據(jù)一定的內(nèi)存單元,對不一樣的

處理器長度也不盡相同,在c51中它的長度?般為1?

3個字節(jié)。指針變量也具有類型,在以后的課程中有專門一課做探討,

這里就不多說了。

6.bit位標(biāo)量

bit位標(biāo)量是c51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個位

標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個二進(jìn)制

位,不是0就是1,類似一些高級語言中的Boolean類型中的True

和False。

7.sfr特殊功能寄存器

sfr也是一種擴(kuò)充數(shù)據(jù)類型,點(diǎn)用個內(nèi)存單元,值域?yàn)?~255。利

用它能訪問51里;1機(jī)內(nèi)部的所有特殊功能寄存器。如用sfrPl=

0x90這一句定P1為P1端口在片內(nèi)的寄存器,在后面的語句中用

以用P1=255(對P1端口的所有引腳置高電平)之類的語句來操

作特殊功能寄存器。

8.sfrl616位特殊功能寄存器

sfrl6占用兩個內(nèi)存單元,值域?yàn)?—65535。sfrl6和sfr一樣用

于操作特殊功能寄存器,所不一樣的是它用于操作占兩個字節(jié)的寄存

器,如定時器T0和Tl?

9.sbit可錄址位

sbit同樣是單片機(jī)c語言中的一種擴(kuò)充數(shù)據(jù)類型,利用它能訪問芯

片內(nèi)部的RAM中的可尋址

位或特殊功能寄存器中的可尋址位。如先前定義了

sfrPl=0x90;〃因Pl端口的寄存器是可位尋址的,所以能定義

sbitPl_l=Pl-1;〃P1」為Pl中的Pl.1引腳

〃同樣我們能用Pl.1的地址去寫,如sbitPl1=0x91;這樣在以

后的程序語句中就能用Pl_l來對Pl.1引腳進(jìn)行讀寫操作了。通常

這些能直接使用系統(tǒng)供給的預(yù)處理文件,里面己定義好各特殊功能寄

存器的簡單名字,直接引用能省去一點(diǎn)時間,我自己是一直用的。當(dāng)

然您也能自己寫自己的定義文件,用您認(rèn)為好記的名字。

4

sylar源于heros

提高空載性能,降低待機(jī)功耗并

提升輕載效率q回復(fù)立回復(fù)本帖

回到頂端

單片機(jī)c語言教程第四課C51常量發(fā)表于2009-07-3015:05:41[4樓]

sylar

上篇學(xué)習(xí)了KElLc單片機(jī)c語言編譯器所支持的數(shù)據(jù)類型。而這些c51

數(shù)據(jù)類型又是怎么用在常量和變量的定義中的呢?又有什么要注意的嗎?

常量就是在程序運(yùn)行過程中不能改變值的量,而變量是能在程序運(yùn)行過程

我是MM高中不斷變化的量。變量的定義能使用所有c51編譯器支持的數(shù)據(jù)類型,而

級會訴常量的數(shù)據(jù)類型只有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。這一篇

學(xué)習(xí)常量定義和使用方法,而下一篇則學(xué)習(xí)單片機(jī)c語言的變量。

用戶等級:

院士常量的數(shù)據(jù)類型說明是這樣的

加為好友i.整型常量能表示為十進(jìn)制如123,0,-89等。十六進(jìn)制則以O(shè)x開頭

發(fā)短消息如0x34,-0x3B等。長整型就在數(shù)字后面加字母L,如104L,034L,0xF340

>七g一等。

所有發(fā)旨

個人檔案2.浮點(diǎn)型常量可分為十進(jìn)制和指數(shù)表示形式。十進(jìn)制由數(shù)字和小數(shù)

層尸”葉”點(diǎn)組成,如0.888,3345.345,0.0等,整數(shù)或小數(shù)部分為0,能省略但必須

最后登陸時

有小數(shù)點(diǎn)。指數(shù)表示形式為[土]數(shù)字[.數(shù)字]e[土]數(shù)字,口中的內(nèi)容為可

間:選項(xiàng),其中內(nèi)容根據(jù)具體情況可有可無,但其余部分必須有,如

2010-06-04

08:20:15125e3,7e9,-3.Oe-3。

狀態(tài):離線

3.字符型常量是單引號內(nèi)的字符,如'a,,等,不能顯示的控制字

符,能在該字符前面加一個反斜杠“\”組成專用轉(zhuǎn)義字符。常用轉(zhuǎn)義字

符表請看表4—1。

4.字符串型常量由雙引號內(nèi)的字符組成,如“test”,“0K”等。當(dāng)引號

內(nèi)的沒有字符時,為空字符串。在使用特殊字符時同樣要使用轉(zhuǎn)義字符如

雙引號。在C中字符串常量是做為字符類型數(shù)組來處理的,在存儲字符

串時系統(tǒng)會在字符串尾部加上\。轉(zhuǎn)義字符以作為該字符串的結(jié)束符?字符

串常量“A”和字符常量'A,是不一樣的,前者在存儲忖多占用一個字節(jié)

的字間。

5.位標(biāo)量,它的值是一個二進(jìn)制。

轉(zhuǎn)義字符含義ASCII碼(16/10進(jìn)制)

\()空字符(NULL)00H/0

\n換行符(LF)0AH/10

\r回車符(CR)0DH/13

\t水平制表符(HT)09H/9

\b退格符(BS)08H/8

\f換頁符(FF)0CH/12

單引號27H/39

V,雙引號22H/34

反斜杠5CH/92

及4-1常用轉(zhuǎn)義字符表

常量可用在不必改變值的場合,如固定的數(shù)據(jù)表,字庫等。常量的定義方

式有幾種,下面來加以說明。

ttdifineFalse0x0;〃用預(yù)定義語句能定義常量

#difineTrue0x1;〃這里定義False為0,True為1

〃在程序中用到False編譯時自動用0替換,同理True替換為1

unsignedintcodea=100;〃這一句用code把a(bǔ)定義在程序存儲器中

并賦值

constunsignedintc=100;〃用const定義c為無符號int常量并賦

值以上兩句它們的值都保存在程序存儲器中,而程序存儲器在運(yùn)行中是不

允許被修改的,

所以如果在這兩句后面用了類似a=110,a++這樣的賦值語句,編譯時將會

出錯。

下面寫個跑馬燈程序來實(shí)驗(yàn)嚇典型的常量使用方法。先來看看電路圖吧。

它是在上一篇的

實(shí)驗(yàn)電路的基礎(chǔ)上增加幾個LED組成的,也就是用P1口的全部引腳分別

驅(qū)動一一個LED,電路如圖4-1所示。

新建一個RunLED的項(xiàng)目,主程序如下:

include〃預(yù)處理文件里面定義了特殊寄存器的名稱如P1口定義為P1

voidmain(void)

{

〃定義花樣數(shù)據(jù)

constunsignedchar

design[32]={0xFF,OxFE,OxFD,OxFB,0xF7,OxEF,OxDF,OxBF,0x7F,

0x7F,OxBF,OxDF,OxEF,0xF7,OxFB,OxFD,OxFE,OxFF,

OxFF,OxFE,OxFC,0xF8,OxFO,OxEO,OxCO,0x80,0x0,

0xE7,OxDB,OxBD,Ox7E,OxFF};

unsignedinta;〃定義循環(huán)用的變量

unsignedcharb;〃在c51編程中因內(nèi)存有限盡可能注意變量類型的使

〃盡可能使用少字節(jié)的類型,在大型的程序中很受用

do{

for(b=0;b<32;b++)

}

}whiled);

}

for(a=0;a<30000;a++);//延時一段時間

Pl=design}];〃讀已定義的花樣數(shù)據(jù)并寫花樣數(shù)據(jù)到P1口

程序中的花樣數(shù)據(jù)能自以去定義,因這里我們的LED要AT89c51的P1

引腳為低電平才會點(diǎn)亮,所以我們要向P1口的各引腳寫數(shù)據(jù)0對應(yīng)連

接的LED才會被點(diǎn)亮,P1□的八個引腳剛好對應(yīng)P1口特殊寄存器的八

個二進(jìn)位,如向P1口定數(shù)據(jù)OxFE,轉(zhuǎn)成二進(jìn)制就是

11111110,最低位D0為0這里P1.0引腳輸出低電平,LED1被點(diǎn)亮。如

此類推,大家不難算出自己想要做的效果了。大家編譯燒寫看看,效果就

出來,顯示的速度您能根據(jù)需要調(diào)整延時a的值,不要超過變量類型的

值域就很行了。哦,您還沒有實(shí)驗(yàn)板?那如何能知道程序運(yùn)行的結(jié)果呢?

呵,不用急,這就來說說用KEILuVision2的軟件仿真來調(diào)試10U輸出

輸入程序。

P1J0POJO(ADO):

P1.1PO.l(ADl)—

P1J2P0RAD2)—

P13P03(AD3):

P1.4P0.4(AD4)

P15P05(AD5):

7

P1J6P0J6(AD6):

8

P1.7P0.7(AD7)—

VCCO-

INT1(P33)P2J0(A8):

JKTO(P32)P2.1(A9)—

P22(A10)—

15

ITT1(P35)P23(A11)

T0(P3.4)P2.4(A12)

TP2J(A13)—

-±_Y131

I——I1-24MHEA/VPP2J6(A14)

P2.7(A15)—

19

18XTAL1

-T-30pFXTAL2VCC—

GND-

9

RESETRXD(P3J0)—

TXD(P3.1)—

_1_C3上16RD(P3.7)ALEyPROG;

(^,lOuF一WR(P36)PSEN

AT89c51

vcc

圖4-1八路跑馬燈電路編譯運(yùn)行上面的程序,然后按外部設(shè)備菜單

Peripherals—I/OPorts—Port1就打開

Por

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論