(玩電子) 電子技術(shu)學(xue)習與研究
當(dang)前(qian)位置︰單片機教(jiao)程網 >> 基礎教(jiao)程 >> 瀏覽文章

5分PK10官网

作者:佚(die)名   來(lai)源:本站原創   點(dian)擊數(shu):x  更新時(shi)間︰2007年07月(yue)12日   【字體(ti)︰大(da) 小(xiao)

前(qian)面的文章中,都是介紹單個數(shu)據(ju)變量的使(shi)用,在(zai)“走馬燈”等的例子中略有使(shi)用到數(shu)組,不難看出,數(shu)組不過就(jiu)是同一類型變量的有xing)蚣 稀P蝸蟺哪 zhe)樣去理(li)解,就(jiu)像一個 學(xue)校在(zai)操場上排隊,每(mei)一個級(ji)代表一個數(shu)據(ju)類型,每(mei)一個班級(ji)為一個數(shu)組,每(mei)一個學(xue)生(sheng)就(jiu)是 數(shu)組中的一個數(shu)據(ju)。數(shu)據(ju)中的每(mei)個數(shu)據(ju)都能用唯一的下標來(lai)確定其位置,下標能是一維 或多維的。就(jiu)如在(zai)學(xue)校的方隊中要(yao)找一個學(xue)生(sheng),這(zhe)個學(xue)生(sheng)在(zai) I 年級(ji) H 班 X 組 Y 號的,那麼 能把這(zhe)個學(xue)生(sheng)看做(zuo)在(zai) I 類型的 H 數(shu)組中(X,Y)下標位置中xiao)Jshu)組和(he)普通變量一樣,要(yao)

求先定義了才能使(shi)用,下面是定義一維或多維數(shu)組的方式︰

數(shu)據(ju)類型

數(shu)組名

[常量表達式];

數(shu)據(ju)類型

數(shu)組名

[常量表達式 1]...... [常量表達式 N];

“數(shu)據(ju)類型”是指數(shu)組中的各(ge)數(shu)據(ju)單元的類型,每(mei)個數(shu)組中的數(shu)據(ju)單元只能是同一數(shu)據(ju)

類型。“數(shu)組名”是整(zheng)個數(shu)組的標識(shi),命名方法和(he)變量命名方法是一樣的。在(zai)編譯時(shi)系統會 根據(ju)數(shu)組大(da)小(xiao)和(he)類型為變量分(fen)配空(kong)間,數(shu)組名能說就(jiu)是所(suo)分(fen)配空(kong)間的首地址的標識(shi)。“常 量表達式”是表示數(shu)組的長度和(he)維數(shu),它(ta)必須用“〔〕”括起(qi),括號里的數(shu)不能是變量只能是 常量。

unsigned int xcount [10]; //定義無符號整(zheng)形數(shu)組,有 10 個數(shu)據(ju)單元

char inputstring [5]; //定義字符形數(shu)組,有 5 個數(shu)據(ju)單元

float outnum [10],[10];//定義浮點(dian)型數(shu)組,有 100 個數(shu)據(ju)單元

在(zai) C 語言中數(shu)組的下標是從 0 開始的而(er)不是從 1 開始,如一個具(ju)有 10 個數(shu)據(ju)單元的數(shu)

組 count,它(ta)的下標就(jiu)是從 count[0]到 count[9],引用單個元素就(jiu)是數(shu)組名加下標,如 count[1] 就(jiu)是引用 count 數(shu)組中的第(di) 2 個元素,如果錯用了 count[10]就(jiu)會有xie)砦wu)出現(xian)了。還有一點(dian)要(yao) 注意的就(jiu)是在(zai)程序(xu)中只能逐個引用數(shu)組中的元素,不能一次引用整(zheng)個數(shu)組,但是字符型的數(shu) 組就(jiu)能一次引用整(zheng)個數(shu)組。

數(shu)組也是能賦初值的。在(zai)上面介紹的定義方式只適用于(yu)定義在(zai)內(na)存  DATA  存儲器(qi)使(shi) 用的內(na)存,有的時(shi)候我們需要(yao)把一些數(shu)據(ju)表存放在(zai)數(shu)組中,通常這(zhe)些數(shu)據(ju)是不用在(zai)程序(xu)中改(gai) 變數(shu)值的,這(zhe)個時(shi)候就(jiu)要(yao)把這(zhe)些數(shu)據(ju)在(zai)程序(xu)編寫(xie)時(shi)就(jiu)賦給(gei)數(shu)組變量。因(yin)為  51  芯片的片內(na)  RAM 很有限,通常會把 RAM 分(fen)給(gei)參與運算的變量或數(shu)組,而(er)那些程序(xu)中不變數(shu)據(ju)則應存放在(zai)片 內(na)的 CODE 存儲區,以節省(sheng)寶(bao)貴的 RAM。賦初值的方式如下︰

數(shu)據(ju)類型  [存儲器(qi)類型]  數(shu)組名  [常量表達式] = {常量表達式};

數(shu)據(ju)類型  [ 存儲器(qi)類型]  數(shu)組名  [ 常量表達式  1]......  [ 常量表達式  N]={{ 常量表達 式}...{常量表達式 N}};

在(zai)定義並為數(shu)組賦初值時(shi),開始學(xue)習的朋友一般會搞錯初值個數(shu)和(he)數(shu)組長度的關(guan)系,而(er)致(zhi)使(shi) 編譯出錯。初值個數(shu)必須小(xiao)于(yu)或等于(yu)數(shu)組長度,不指定數(shu)組長度則會在(zai)編譯時(shi)由實(shi)際shi)某踔個數(shu)自動設(she)置。

unsigned char LEDNUM[2]={12,35}; //一維數(shu)組賦初值

int Key[2][3]={{1,2,4},{2,2,1}}; //二維數(shu)組賦初值

unsigned char IOStr[]={3,5,2,5,3}; //沒有指定數(shu)組長度,編譯器(qi)自動設(she)置

unsigned char code skydata[]={0x02,0x34,0x22,0x32,0x21,0x12}; //數(shu)據(ju)保存在(zai) code 區

下面的一個簡單例子是對數(shu)組中的數(shu)據(ju)進(jin)行(xing)排序(xu),使(shi)用的是冒泡法,一來(lai)了解數(shu)組的使(shi) 用,二來(lai)掌(zhang)握基本的排序(xu)算法。冒泡排序(xu)算法是一種基本的排序(xu)算法,它(ta)每(mei)次順(shun)序(xu)取數(shu)組中 的兩個數(shu),並按需要(yao)按其大(da)小(xiao)排列(lie),在(zai)下一次循環fen)性蛉∠亂淮蔚囊桓鍪shu)和(he)數(shu)組中下一個數(shu) 進(jin)行(xing)排序(xu),直到數(shu)組中的數(shu)據(ju)全部排序(xu)完成。


#include <AT89X51.H>

#include <stdio.h>

void taxisfun (int taxis2[])

{

unsigned char TempCycA,TempCycB,Temp;

for (TempCycA=0; TempCycA<=8; TempCycA++)

for (TempCycB=0; TempCycB<=8-TempCycA; TempCycB++)

{//TempCycB<8-TempCycA 比用 TempCycB<=8 少(shao)用很多循環

if  (taxis2[TempCycB+1]>taxis2[TempCycB])  //當(dang)後一個數(shu)大(da)于(yu)前(qian)一個 數(shu)

{

Temp = taxis2[TempCycB]; //前(qian)後 2 數(shu)交huan)/p>

taxis2[TempCycB] = taxis2[TempCycB+1];

taxis2[TempCycB+1]  =  Temp;  //因(yin)函數(shu)參數(shu)是數(shu)組名調用形

參的變動影(ying)響實(shi)參

}

}

}

void main(void)

{

int taxis[] = {113,5,22,12,32,233,1,21,129,3};

char Text1[] = {"source data:"}; //"源數(shu)據(ju)"

char Text2[] = {"sorted data:"}; //"排序(xu)後數(shu)據(ju)"

unsigned char TempCyc;

SCON = 0x50; //串行(xing)口方式 1,允許(xu)接(jie)收

TMOD = 0x20; //定時(shi)器(qi) 1 定時(shi)方式 2

TCON = 0x40; //設(she)定時(shi)器(qi) 1 開始計數(shu)

TH1 = 0xE8;   //11.0592MHz 1200 波特率

TL1 = 0xE8; TI = 1;

TR1 = 1; //啟動定時(shi)器(qi)

printf("%s\n",Text1); //字符數(shu)組的整(zheng)體(ti)引用

for (TempCyc=0; TempCyc<10; TempCyc++)

printf("%d ",taxis[TempCyc]);

printf("\n----------\n");

taxisfun (taxis); //以實(shi)際參數(shu)數(shu)組名 taxis 做(zuo)參數(shu)被函數(shu)調用

printf("%s\n",Text2);

for (TempCyc=0; TempCyc<10; TempCyc++) //調用後 taxis 會被改(gai)變

printf("%d ",taxis[TempCyc]);


while(1);

}

例子中能看出,數(shu)組同樣能作為函數(shu)的參數(shu)進(jin)行(xing)xie) 蕁Jshu)組做(zuo)參數(shu)時(shi)是用數(shu)組名進(jin)

行(xing)xie) 蕕模 桓鍪shu)組的數(shu)組名表示該數(shu)組的首地址,在(zai)用數(shu)組名作為函數(shu)的調用參數(shu)時(shi),它(ta) 的傳遞方式是采用了地址傳遞,就(jiu)是將實(shi)際參數(shu)數(shu)組的首地址傳遞給(gei)函數(shu)中的形式參數(shu)數(shu) 組,這(zhe)個時(shi)候實(shi)際參數(shu)數(shu)組和(he)形式參數(shu)數(shu)組實(shi)際上是使(shi)用了同一段內(na)存單元,當(dang)形式參數(shu)數(shu)組在(zai) 函數(shu)體(ti)中改(gai)變了元素的值,同時(shi)也會影(ying)響到實(shi)際參數(shu)數(shu)組,因(yin)為它(ta)們是存放在(zai)同一個地址的。 上面的例子同時(shi)還使(shi)用到字符數(shu)組。字符數(shu)組中每(mei)一個數(shu)據(ju)都是一個字符,這(zhe)樣一個一 維的字符數(shu)組就(jiu)組成了一個字符串,在(zai)  C  語言中字符串是以字符數(shu)組來(lai)表達處理(li)的。為了 能測定字符串的長度,C 語言中規定以‘\o’來(lai)做(zuo)為字符串的結束標識(shi),編譯時(shi)會自動在(zai)字 符串的最(zui)後加入一個‘\o’,那麼要(yao)注意的是如果用一個數(shu)組要(yao)保存一個長度為 10 字節的字 符串則要(yao)求這(zhe)個數(shu)組至少(shao)能保存 11 個元素。‘\o’是轉義字符,它(ta)的含(han)義是空(kong)字符,它(ta)的 ASCII 碼(ma)為 00H,也就(jiu)是說當(dang)每(mei)一個字符串都是以數(shu)據(ju) 00H 結束的,在(zai)程序(xu)中操作字符數(shu) 據(ju)組時(shi)要(yao)注意這(zhe)一點(dian)。字符數(shu)組除了能對數(shu)組中單個元素進(jin)行(xing)訪問,還能訪問整(zheng)個數(shu)組, 其實(shi)整(zheng)個訪問字符數(shu)組就(jiu)是qian)咽shu)組名傳到函數(shu)中,數(shu)組名是一個指向數(shu)據(ju)存放空(kong)間的地址fen)針,函數(shu)根據(ju)這(zhe)個指針和(he)‘/o’就(jiu)能完整(zheng)的操作這(zhe)個字符數(shu)組。對于(yu)這(zhe)一段所(suo)說的,能 參看下面一例 1602LCD 顯示模塊的驅動演示例子進(jin)行(xing)理(li)解。這(zhe)里要(yao)注意就(jiu)是能用單個字

符數(shu)組元素來(lai)進(jin)行(xing)運算,但不能用整(zheng)個數(shu)組來(lai)做(zuo)運算,因(yin)為數(shu)組名是指針而(er)不是數(shu)據(ju)。

/*============================================================

使(shi)用 1602 液(ye)晶(jing)顯示的實(shi)驗(yan)例子  明浩(hao)  2004/2/27

==============================================================

SMC1602A(16*2)模擬口線接(jie)線方式 連(lian)接(jie)線圖:

---------------------------------------------------

LCM-----51       LCM-----51            LCM------51

---------------------------------------------

DB0-----P1.0 DB4-----P1.4 RW-------P2.0

DB1-----P1.1 DB5-----P1.5 RS-------P2.1

DB2-----P1.2 DB6-----P1.6 E--------P2.2

DB3-----P1.3 DB7-----P1.7 VLCD 接(jie) 1K 電阻(zu)到 GND

---------------------------------------------------

[注:AT89S51 使(shi)用 12M 晶(jing)體(ti)震蕩器(qi)]

=============================================================*/

#define LCM_RW P2_0 //定義引腳

#define LCM_RS P2_1

#define LCM_E P2_2

#define LCM_Data P1

#define Busy 0x80 //用于(yu)檢測 LCM 狀態(tai)字中的 Busy 標識(shi)

#include <at89x51.h>


void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void); void LCMInit(void);

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);

void Delay5Ms(void);

void Delay400Ms(void);

unsigned char code cdle_net[] = {"www.51hei.com"};

unsigned char code email[] = {"pnzwzw@51hei.com"};

void main(void)

{

Delay400Ms(); //啟動等待,等 LCM 講入工作狀態(tai)

LCMInit(); //LCM 初始化

Delay5Ms(); //延時(shi)片刻(可不要(yao))

DisplayListChar(0, 0, cdle_net); DisplayListChar(0, 1, email); ReadDataLCM();//測試用句無意義 while(1);

}

//寫(xie)數(shu)據(ju)

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //檢測忙(mang) LCM_Data = WDLCM; LCM_RS = 1;

LCM_RW = 0;

LCM_E = 0; //若晶(jing)體(ti)震蕩器(qi)速度太高能在(zai)這(zhe)後加小(xiao)的延時(shi)

LCM_E = 0; //延時(shi)

LCM_E = 1;

}

//寫(xie)指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC 為 0 時(shi)忽略忙(mang)檢測

{

if (BuysC) ReadStatusLCM(); //根據(ju)需要(yao)檢測忙(mang)

LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0;

LCM_E = 0;


LCM_E = 0; LCM_E = 1;

}

//讀數(shu)據(ju)

unsigned char ReadDataLCM(void)

{

LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data);

}

//讀狀態(tai)

unsigned char ReadStatusLCM(void)

{

LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1;

while (LCM_Data & Busy); //檢測忙(mang)信號

return(LCM_Data);

}

void LCMInit(void) //LCM 初始化

{

LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次顯示模式設(she)置,不檢測忙(mang)信號

Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,1); //顯示模式設(she)置,開始要(yao)求每(mei)次檢測忙(mang)信號

WriteCommandLCM(0x08,1); //關(guan)閉(bi)顯示 WriteCommandLCM(0x01,1); //顯示清屏 WriteCommandLCM(0x06,1); //  顯示光標移動設(she)置 WriteCommandLCM(0x0C,1); //  顯示開及光標設(she)置

}


//按指定位置顯示一個字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1;

X &= 0xF; //限制 X 不能大(da)于(yu) 15,Y 不能大(da)于(yu) 1

if (Y) X = 0x40; //當(dang)要(yao)顯示第(di)二行(xing)時(shi)地址碼(ma)+0x40; X = 0x80; //算出指令碼(ma)

WriteCommandLCM(X, 0); //這(zhe)里不檢測忙(mang)信號,發送地址碼(ma)

WriteDataLCM(DData);

}

//按指定位置顯示一串字符

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)

{

unsigned char ListLength;

ListLength = 0; Y &= 0x1;

X &= 0xF; //限制 X 不能大(da)于(yu) 15,Y 不能大(da)于(yu) 1

while (DData[ListLength]>0x20) //若到達字串尾則退shun)/p>

{

if (X <= 0xF) //X 坐標應小(xiao)于(yu) 0xF

{

DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符

ListLength++; X++;

}

}

}

//5ms 延時(shi)

void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

//400ms 延時(shi)

void Delay400Ms(void)

{

unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--)

{

TempCycB=7269;


while(TempCycB--);

};

}

發表評論】【告訴好友】【收藏此文】【關(guan)閉(bi)窗口

5分PK10官网

5分PK10官网

5分PK10官网 | 下一页