2023年步進電機實驗報告_第1頁
2023年步進電機實驗報告_第2頁
2023年步進電機實驗報告_第3頁
2023年步進電機實驗報告_第4頁
2023年步進電機實驗報告_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

壬建工商大學(xué)

單片機實驗

課程名稱:步進電機表實驗

授課班級:2023級自動化三班

任課教師:文遠落

計劃學(xué)時:學(xué)時------------------

實驗成員:張?zhí)僖w福亮王聰慧

秦菱蔚梁欽鄭歡

目錄

摘要.......................................................

第一章概述................................................

1.1實驗?zāi)康?......................................................

1.2實驗規(guī)定.......................................................

1.3步進電機的介紹...................................................

1.4研究思緒......................................................

第二章硬件設(shè)計............................................

2.151單片機介紹...................................................

2.2UIN2023A.........................................................................................................................

2.3ZLG7290.............................................................................................................................

2.3.17290工作原理...............................................

2.3.27290引腳圖...................................................

第三章相關(guān)圖像................................................

3.1總電路圖....................................................

3.27290控制數(shù)碼管..................................................

3.3程序流程圖.......................................................

3.3.1控制框圖....................................................

3.3.2流程圖.....................................................

第四章調(diào)試.....................................................

第五章心得體會.................................................

附錄【一】系統(tǒng)程序.............................................

附錄【二】參考文獻............................................../摘

要】:

步進電機是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元步進電機件。在非超載的情

況下,電機的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負載變化的影響,當(dāng)

步進驅(qū)動器接受到一個脈沖信號,它就驅(qū)動步進電機按設(shè)定的方向轉(zhuǎn)動一個固定的角度,稱為

“步距角”,它的旋轉(zhuǎn)是以固定的角度一步一步運營的??梢酝ㄟ^控制脈沖個數(shù)來控制角位移

量,從而達成準(zhǔn)擬定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,

從而達成調(diào)速的目的。

本課程設(shè)計的內(nèi)容是運用51單片機,達成控制步進電機的啟動、停止、正轉(zhuǎn)、反轉(zhuǎn)、點動

和狀態(tài)顯示的目的,使步進電機控制更加靈活。步進電機驅(qū)動芯片采用UIN2023,具有大電流、

高電壓,外電路簡樸等優(yōu)點。運用四位數(shù)碼管(ZLG7290)增設(shè)電機狀態(tài)顯示功能,各項數(shù)

據(jù)更直觀。實測結(jié)果表白,該控制系統(tǒng)達成了設(shè)計的規(guī)定。

【關(guān)鍵詞】:單片機步進電機UIN2023ZLG7290數(shù)碼管

第一章概述

1.1實驗?zāi)康?/p>

1、單片機對步進電機控制可以熟悉步進電機的原理和應(yīng)用。

2、單片機對步進電機控制可以熟悉單哦就功能已經(jīng)原理、構(gòu)造。

3、通過這次實驗?zāi)苓\用所學(xué)基本理論知識、專業(yè)技能來對問題進行分析,思考,解決,提高

對專業(yè)知識的掌握以及鍛煉邏輯思維能力。

1.2實驗規(guī)定

實現(xiàn)步進電機按規(guī)定的速度正轉(zhuǎn)、反轉(zhuǎn),轉(zhuǎn)過指定的角度,要有點動功能。所有命令通過鍵

盤輸入,步進電機在運營過程中要有狀態(tài)和數(shù)據(jù)指示。

1.3步進電機的介紹

步進電機是一種感應(yīng)電機,它的工作原理是運用電子電路,將直流電變成分時供電的,多相

時序控制電流,用這種電流為步進電機供電,步進電機才干正常工作,驅(qū)動器就是為步進電機

分時供電的,多相時序控制器

雖然步進電機已被廣泛地應(yīng)用,但步進電機并不能像普通的直流電機,交流電機在常規(guī)

下使用。它必須由雙環(huán)形脈沖信號、功率驅(qū)動電路等組成控制系統(tǒng)方可使用。因此用好步

進電機卻非易事,它涉及到機械、電機、電子及計算機等許多專業(yè)知識。

步進電機作為執(zhí)行元件,是機電一體化的關(guān)鍵產(chǎn)品之一,廣泛應(yīng)用在各種自動化控制

系統(tǒng)中。隨著微電子和計算機技術(shù)的發(fā)展,步進電機的需求量與日俱增,在各個國民經(jīng)濟領(lǐng)域

都有應(yīng)用。

步進電機是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機構(gòu)。通俗一點講:當(dāng)步進驅(qū)動器接受到

一個脈沖信號,它就驅(qū)動步進電機按設(shè)定的方向轉(zhuǎn)動一個固定的角度(即步進角)。您可以通

過控制脈沖個數(shù)來控制角位移量,從而達成準(zhǔn)擬定位的目的;同時您可以通過控制脈沖頻率

來控制電機轉(zhuǎn)動的速度和加速度,從而達成調(diào)速的目的。

圖1步進電機剖面圖

1.4研究思緒

1、了解單片機自身內(nèi)部應(yīng)有的資源,如:中斷、定期器、計數(shù)器、1\0的使用。

2、了解步進電機的工作原理和作用。

3、根據(jù)步進電機的原理,分析并分派單片機內(nèi)部資源,并根據(jù)單片機的資源,來實現(xiàn)硬件電路的

設(shè)計以及軟件程序的編寫。

4.、對于自己不熟悉的東西,查閱資料。

5、在設(shè)計好單片機步進電機時,要學(xué)會分析電路中出現(xiàn)的問題,并好好總結(jié)。

第二章硬件設(shè)計

2.1單片機的簡介

單片機是續(xù)計算機出現(xiàn)之后,并隨著電器時代大到來,人們借助電氣技術(shù)想實現(xiàn)了自動控

制機械,自動生產(chǎn)線甚至自動工廠,但依靠計算機去完畢每一個自動的過程,反而有些復(fù)雜以

及資源的亂費;所以用更方便,更微小,更智能的微型解決器來解決工業(yè)現(xiàn)場的測控領(lǐng)域,控

制領(lǐng)域,有著重大意義;更何況目前,彩電,冰箱,空調(diào),錄像機,VCD,遙控器,游戲機,電飯煲等

無處不見單片機的影子,所以單片機將會更滿足我們的生活,會更取代大型的計算機。

現(xiàn)在單片機重要按用途,大體上可分為兩大類:1—通用型單片機2-專用型單片機

專用型單片機是指用途比較專一,出廠時程序已經(jīng)一次性固化好,不能再修該的單片機。

例如電子表里的單片機就是其中的一種。其生產(chǎn)成本很低。A通用型單片機的用途很

廣泛,使用不同的接口電路及編制不同的應(yīng)用程序就可完畢不同的功能。小到家用電器儀

器儀表,大到機器設(shè)備和整套生產(chǎn)線都可用單片機來實現(xiàn)自動化控制。

2.2UIN2023

本文選用ULN2023構(gòu)成步進電機的驅(qū)動電路,下面但見介紹下ULN2023的結(jié)構(gòu)和特

占?

八、、?

ULN2023是高耐壓、大電流達林頓陳列,由七個硅NPN達林頓管組成。

該電路的特點如下:

ULN2023的每一對達林頓都串聯(lián)一個2.7K的基極電阻,在5V的工作電壓下它能與TTL

和CMOS電路直接相連,可以直接解決原先需要標(biāo)準(zhǔn)邏輯緩沖器來解決的數(shù)據(jù)。

ULN2023工作電壓高,工作電流大,灌電流可達500mA,并且可以在關(guān)態(tài)時承受50V的

電壓,輸出還可以在高負載電流并行運營。

ULN2023方框圖如圖2所示。

9

圖2ULN2023內(nèi)部方框圖

運用ULN2023以及AT89c54RD設(shè)計的步進電機驅(qū)動電路如圖3所示。

2.3ZLG7290

2.3.17290工作原理

ZLG7290的核心是一塊ZLG7290B芯片,它采用12c接口,能直接驅(qū)動8位共陰式數(shù)碼

管,同時可掃描管理多達64只按鍵,實現(xiàn)人機對話的功能資源十分豐富。除具有自動消除抖動

功能外,它還具有段閃爍、段點亮、段熄滅、功能鍵、連擊鍵計數(shù)等強大功能,并可提供10種

數(shù)字和21種字母的譯碼顯示功能,用戶可以直接向顯示緩存寫入顯示數(shù)據(jù),并且無需外接元

件即可直接驅(qū)動數(shù)碼管,還可擴展驅(qū)動電壓和電流。此外,ZLG7290B的電路簡樸,使用也很

方便。用戶按下某個鍵時,ZLG7290的INT引腳會產(chǎn)生一個低電平的中斷請求信號,讀取鍵

值后,中斷信號就會自動撤消。正常情況下,微控制器只需要判斷INT引腳就可以得到鍵盤輸

入的信息。微控制器可通過兩種方式得到用戶的鍵盤輸入信息。其一是中斷方式,該方式的優(yōu)

點是抗干擾能力強,缺陷是要占用微控制器的一個外部中斷源。其二是查詢方式,即通過不斷查

詢INT引腳來判斷是否有鍵按下,該方式可以節(jié)省微控制器的一根1/O口線,但是代價是12C

總線處在頻繁的活動狀態(tài),消耗電流多并且不利于抗干擾。

2.3.27290引腳圖

1323

Dig7SegA

1224

Dig6SegB

211

Dig5SegC

222

Dig4SegD

37

Dig3SegE

48

Dig2SegF

59

DiglSegG

610

DigOSegH

2016

SDAVCC

1918

SCLOSC2

17

吩/INT0SC1

GND/RES

ZLG7290

圖37290引腳圖

第三章相關(guān)圖像

3.1總體電路圖

PQDMMJ

?Q3TA”

*□

,0????

raiM?r

g■

M

la

2c

2a三

39D

?8c

g??

3.27290控制數(shù)碼管

3.3程序流程圖

3.3.1控制框圖

3.3.2流程圖

ZLG729O庫函激

第四章調(diào)試

1、按照實驗原理圖連接好電路圖。

2、根據(jù)原理圖編寫程序。

3、電路上電,調(diào)試程序,觀測并控制電機使其按照預(yù)期的行為工作。

4、當(dāng)電機可以通過按鍵控制其正轉(zhuǎn)加減速、反轉(zhuǎn)加減速程序、點動后,調(diào)試結(jié)束。

5、優(yōu)化程序,整理實驗結(jié)果。

總的來說,過程比較順利,只是粗心之下,連線出現(xiàn)了錯誤,對于此,我進行了深刻

的自我檢討和批評。在通過老師的知道后,我們終于實現(xiàn)了實驗規(guī)定的功能,能實現(xiàn)正反轉(zhuǎn),快

慢變化及點動等。

第五章收獲體會

一方面是關(guān)于課題的選擇,開始是準(zhǔn)備做一個萬年歷,通過查看資料后發(fā)現(xiàn)計算機的過

程實現(xiàn)比較的復(fù)雜,而這次的課程設(shè)計時間比較短,故放棄了這個想法。通過各種篩選,最后決

定做步進電機的相關(guān)設(shè)計,起初看著指導(dǎo)書上的內(nèi)容覺得實現(xiàn)步進電機是比較的簡樸的,但當(dāng)

我真正開始設(shè)計之后才發(fā)現(xiàn)并沒有想像中那么的簡樸。

這學(xué)期的微機課和單片機課沒怎么學(xué)好,故感覺在做這個設(shè)計時有點困難,比如匯編程

序。后來決定用c來編寫程序,這樣稍微輕松點,在設(shè)計程序中涉及到了中斷程序的編寫,發(fā)

現(xiàn)已學(xué)的理論知識完全用不上來,也許這就是理論脫離時間的結(jié)果,在期間惡補了單片機的中

斷知識及其相應(yīng)的程序編寫。

通過這次課程設(shè)計實驗,我對步進電機調(diào)速控制系統(tǒng)有了實際的了解和結(jié)識,提高了動手

能力。本次實驗把書本上、課堂上學(xué)到的知識靈活地運用到實際的實物上,感覺是對學(xué)以致用

的一種鍛煉和考驗提高了用所學(xué)知識解決實際問題的能力,加深和鞏固的對知識的理解和掌

握??刂齐娐?、驅(qū)動電路、測速反饋電路、步進電機幾個模塊的整合,也實際中提高了自己對

系統(tǒng)的結(jié)識,有了些整體的概念和思維觀。實驗是團隊合作完畢的,從設(shè)計電路到設(shè)計軟件,

然后仿真到做硬件做出符合規(guī)定的控制系統(tǒng),不僅從實際中鍛煉了動手能力并且學(xué)會了團隊合

作,互相學(xué)習(xí),提高自己。

這次的課程設(shè)計總的感覺就是很累,但在不斷的學(xué)習(xí)機實踐當(dāng)中學(xué)到了很多東西,知識的

提高那是最基礎(chǔ)的,中斷,電路工作及相關(guān)的知識都是得到了提高;然后就是個人解決問題能

力的提高,雖然說這次的設(shè)計不算一個大的項目,但也算是小的雛形,課題的選擇,前期的準(zhǔn)備,

理論的實踐,知識的提高,解決實際問題及后期的總結(jié)歸納。

付出去收獲往往是成正比的,這次的課程設(shè)計中得到了充足的體現(xiàn)。

總的來說,這次設(shè)計的步進電機控制電路還是比較成功的在設(shè)計中碰到了很多問題,

最后在自己的思考下,宿舍大家一起通過劇烈的探討下,終于游逆而解,有點小小的成就感,終

于覺得平時所學(xué)的知識有了實用的價值,達成了理論與實際相結(jié)合的目的。不僅學(xué)到了不少知

識,并且鍛煉了自己的能力,使自己對以后的路有了更加清楚的結(jié)識。同時,對未來有了更多的

信心。最后,對文老師表達忠心的感謝,老師,你辛勞了。

《附錄【一】系統(tǒng)程序

主程序:

/***************************************************************

*********

基于51單片機的異步電機控制程序

**************************************************************

**********/

#include<reg51.h>

#include"VIIC_C51.Hn

#includeHZLG7290,h"

#defineucharunsignedchar

#defineuintunsignedint

/*四相步進電動機單、雙八拍運營狀態(tài)表

111111100?FEHA

111111OOOFCHoAB

111111010。FDHB

111110010F9HoBC

11111011?0FBH?C

11110011?0F3HCD

111101110F7HD

11110110OF6H0DA

*/

sbitPA=P1A0;〃P1控制電機

sbitPB=P1Al;

sbitPC=P「2;

sbitPD=PlA3;

sbitRST=P1A4;

sbitKEY_INT=P3-2;〃看是否更改為P3A2

sbitSCL=P1A6;

sbitSDA=P1A7;

ucharcodestep_tab[9]={0xff,0xfe,0xfc,0xfd,Oxf9,0xfb,0xf3,0xf7,0xf6};

uintcodede1aytime[4]={60,40,20,10};//延時時間列表

〃變量的定義

uchardirection;?〃狀態(tài)變量0-正向」一反向

ucharcontinuous;?〃狀態(tài)變量。。一指定步數(shù)運營,1—連續(xù)速度運營

ucharrun;。//狀態(tài)變量0—電機未運營,1-電機運營中

ucharspeed_num;//連續(xù)速度運營標(biāo)號1—4

ucharcur_step;〃八拍運營狀態(tài)

ucharstep_num;//指定運營的步數(shù),范圍0-99

〃鍵值定義

#defineKey_dir1〃方向鍵

#defineKey_Run2?!▎渔I

#defineKey_stop3。//停止鍵

#defineKet_Step4//單步運營鍵

#defineKey_step_add5〃步數(shù)加鍵

#defineKey_step_sub6“/步數(shù)減鍵

#defineKey_speed_add7。//速度加鍵

#defineKey_speed_sub8〃速度減鍵

#defineKey_Con_Set9?!ㄟB續(xù)運營與指定步數(shù)運營切換鍵。

//定義鍵盤中斷標(biāo)志,FlagINT0=1表達有鍵按下

volatilebitF1agINTO=0;

voidKeyProsess(ucharkey);

/*************************************************************

***********

函數(shù):INT0_SVC()

功能:ZLG7290鍵盤中斷服務(wù)程序

說明:中斷觸發(fā)方式選擇負邊沿觸發(fā),因此不必等待中斷請求信號恢復(fù)為高電平

***************************************************************

voidINT0_SVC()interrupt0

unsignedcharKeyValue;

〃讀取鍵值

KeyValue=ZLG7290_GetKey();

?!ń鉀Q鍵值

?KeyProsess(KeyValue);

}

/**************************************************************

**********

函數(shù):Delay()

功能:定期器實現(xiàn)延時tms

**************************************************************

**********/

voidDelay(unsignedintt)

{

do

{。//TH=64536

?TH1=OxFC;

8TL1=Ox18;

TR1=1;//啟動定期器T1并等待中斷

。whi1e(!TF1);

ooTFl=0;o//中斷請求標(biāo)致清零

。TRI=0;//停止T1定期器

}while(—t);

/***************************************************************

*********

函數(shù):DispDir()

功能:顯示方向子程序

說明:dat0正向,1反向

******************************************************

******************/

voidDispDir(uchardat)

(

if(dat==0)

°{

ZLG7290_SendCmd(0x60+7,0xOf);//"F"表達正轉(zhuǎn)

?e1se

°(

ZLG7290_SendCmd(0x60+7,0x0b);//"B"表達反轉(zhuǎn)

}

I*****************************************************************

*******

函數(shù):DispSpeed()

功能:顯示速度號子程序

說明:dat1~4。代表四種不同的速度

********************************************************************

****/

voidDispSpeed(uchardat)

{

?ZLG7290_SendCmd(0x60+5,dat);

)

/*************************************************************

***********

函數(shù):DispStepNum()

功能:顯示運營步數(shù)號程序

說明:間接實現(xiàn)轉(zhuǎn)過指定角度=步距角*步數(shù)

*************************************************************

***********/

voidDispStepNum(uchardat)

(

unsignedchard;

d=dat/10;

oZLG7290_SendCmd(Ox60+l,d);

。d=dat—d*10;

ZLG7290_SendCmd(0x60+0,d);

)

/***********************************************************

*************

函數(shù):DispContinuous()

功能:顯示運營狀態(tài),連續(xù)還是指定步數(shù)

說明:0一指定步數(shù)運營,1一連續(xù)速度運營

*************************************************************

***********/

voidDispContinuous(uchardat)

(

if(dat==0)

(

ZLG7290_SendCmd(0x60+3,OxOd);〃d表達指定步數(shù)運營狀態(tài)

°)

else

6(

。ZLG7290_SendCmd(0x60+3,0xOc);//'C'表達連續(xù)速度運營

}

)

/*********************************************************************

***

函數(shù):OnStep()

功能:實現(xiàn)單步運營

******************************************************************

******/

voidOneStep()

(

if(direction==0)

{〃正向

8if(cur_step==8)

00{

o。cur_step=1;

}else

6{

ocur_step++;

°}

o?P1=step_tab[cur_step];//輸出

。}

else

e(

?if(cur_step<=1)

6{

?<>cur_step=8;

}else

(

oocur_step-

?P1=step_tab[cur_step];〃輸出

)

)

/***********************************************************

****************

函數(shù):OnContinue()

功能:連續(xù)運營

*************************************************************

**************/

voidOnContinue()

(

if(continuous!=0)

。{//連續(xù)運營

gwhi1e(run!=0)

0(

。?OneStep();

。。Delay(delaytime[speed_num-1]);//延遲目的改變轉(zhuǎn)速

。}

)

eIse

{//指定步數(shù)運營

?if(step_num!=0)

0{

MDneStep();

Delay(50);//50ms延遲

8step—num—;

。DispStepNum(step—num);〃更新顯示步數(shù)即顯示剩下沒有執(zhí)行的步數(shù)

。Mf(run==0)return;〃若停止鍵按下,則停止

)

oeIse

grun=0;//停止

return;

}

}

/*************************************************************

***************

函數(shù):KeyProsess()

功能:鍵值解決程序

********************************************************

voidKeyProsess(ucharkey)

{

switch(key)

(

?caseKey_dir。:。//方向鍵

gif(run==0)

。{

“f(direction==0)

3direction=1;

。else

gdirection=0;

sDispDir(direction);

)

^break;

ocaseKey_Run"http://啟動鍵

f(run==0)

。”un=1;

。}

。break;

ocaseKey_stop:〃停止鍵

if(run!=0)

°{

run=0;

)

。break;

CaseKet_Step://單步運營鍵實現(xiàn)點動功能

“f(run=0)

grim=1;

。OneStep();

。run=0;

0)

break;

caseKey_step_add:〃步數(shù)加鍵。n=(步距角*60)/(360*t*0.001)單位r/min

>if(run==0)

(

=>if(step_num==99)

00

step_num=0;

}eIse

0

88Step_num++;

}

。oDispStepNum(step_num);

°}

obreak;

℃aseKey_step_sub:。//步數(shù)減鍵

。if(run==0)

。{

if(step_num==0)

?step_num=99;

}eIse

°{

g<>step_num—;

6)

sDispStepNum(step_num);

)

?break;

ocaseKey_speed_add:“/速度力口鍵

if(run=0)

if(speed_num4)

8speed_num=1;

8。}e1se

6{

。speed_num++;

000}

oeDispSpeed(speed_num);

00}

break;

。caseKey_speed_sub://速度減鍵

。if(run==0)

00{

if(speed_num==1)

06{

?speed_num=4;

g}else

8{

speed_num—;

)

o“DispSpeed(speed_num);

)

。。break;

℃aseKey_Con_Set。://連續(xù)運營與指定步數(shù)運營切換鍵。

Xf(run==0)

if(continuous==0)

0001

。continuous=1;

}else

0001

8continuous=0;

00}

。。DispContinuous(continuous);

)

break;

。default:

。break;

)

)

/******************************************************************

****************

函數(shù):SystemInit()

功能:系統(tǒng)初始化

**********************************************************

************************/

voidSystemInit()

“//初始化單片機

?TM0D=Oxll;//定期器設(shè)立,T0,T1方式1:16位定期器

?Delay(300);“/延時300ms等待ZLG7290復(fù)位完畢

EA=0;

ITO1;//INTO,負邊沿觸發(fā)中斷

?EXOh//允許外部中斷INTO

FlagINTO=0;

?EA=1;

。//初始化步進電機控制器

direction=0;〃狀態(tài)變量0。-正向,1-反向

continuous=0;〃狀態(tài)變量0■指定步數(shù)運營」一連續(xù)速度運營

”un=1;//,狀態(tài)變量0。-電機未運營,1—電機運營中

ospeed_num=1;<>//連續(xù)速度運營標(biāo)號1-4

cur_step=0;//八拍運營狀態(tài)

?step_num=0;。//。指定運營的步數(shù),范圍0-99

DispContinuous(continuous);

DispStepNum(step_num);

2ispSpeed(speed_num);

DispDir(direction);

P1=step_tab[cur_step];〃輸出

)

/***************************************************************

******************

主函數(shù)main()

**********************************************************

************************/

voidmain(void)

oSystemlnit();//系統(tǒng)初始化

whi1e(l)//循環(huán)檢測按鍵狀態(tài)

°if(run==1)

°{

。OnContinue();

)

。}

)

庫函數(shù)程序:

I************************************************************

********

VIIC_C51.C

此程序是12c操作平臺(主方式的軟件平臺)的底層的C子程序,如發(fā)送數(shù)據(jù)

及接受數(shù)據(jù),應(yīng)答位發(fā)送,并提供了幾個直接面對器件的操作函數(shù),它很方便的

與用戶程序連接并擴展.?…

注意:函數(shù)是采用軟件延時的方法產(chǎn)生SCL脈沖,固對高晶振頻率要作

一定的修改....(本例是lus機器周期,即晶振頻率要小于12MHZ)

********************************************************I

#include<reg52.h>/*頭文獻的包含*/

#include<intrins.h>

#defineucharunsignedchar/*宏定義*/

#defineuintunsignedint

#define_Nop()_nop_()/*定義空指令*/

/*常,變量定義區(qū)*/

/*端口位定義*/

sbitSDA=P1A7;/*模擬12C數(shù)據(jù)傳送位*/

sbitSCL=P1A6;/*模擬12c時鐘控制位*/

/*狀態(tài)標(biāo)志

*/

bitack;/*應(yīng)答標(biāo)志位*/

/************************************************************

*****

起動總線函數(shù)

函數(shù)原型:voidStart_I2c();

功能:啟動12c總線,即發(fā)送12c起始條件.

****************************************************************

****/

voidStart_I2c()

SDA=1;/*發(fā)送起始條件的數(shù)據(jù)信號*/

_Nop();

SCL=1;

_Nop();/*起始條件建立時間大于4.7us,延時*/

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0;/*發(fā)送起始信號*/

_Nop();/*起始條件鎖定期間大于4us*/

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0;/*鉗住I2c總線,準(zhǔn)備發(fā)送或接受數(shù)據(jù)*/

_Nop();

_Nop();

)

/***************************************************************

****

結(jié)束總線函數(shù)

函數(shù)原型:voidStop」2c();

功能:結(jié)束12c總線,即發(fā)送I2C結(jié)束條件.

********************************************************************/

voidStop_I2c()

(

SDA=0;/*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/

_Nop();/*發(fā)送結(jié)束條件的時鐘信號*/

SCL=1;/*結(jié)束條件建立時間大于4口s*/

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1;/*發(fā)送12c總線結(jié)束信號*/

_Nop();

_Nop();

_Nop();

_Nop();

****************************************************************

***

字節(jié)數(shù)據(jù)傳送函數(shù)

函數(shù)原型:voidSendByte(ucharc);

功能:將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對

此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0假)

發(fā)送數(shù)據(jù)正常,ack=1;ack=0表達被控器無應(yīng)答或損壞。

*********************************************************

***********/

voidSendByte(ucharc)

(

ucharBitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)/*要傳送的數(shù)據(jù)長度為8位*/

(

if((c?BitCnt)&0x80)SDA=l;/*判斷發(fā)送位*/

elseSDA=0;

_Nop();

SCL=1;/*置時鐘線為高,告知被控器開始接受數(shù)據(jù)位*/

_Nop();

_Nop();/*保證時鐘高電平周期大于4口s*/

_Nop();

_Nop();

_Nop();

SCL=0;

}

_Nop();

_Nop();

SDA=1;/*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接受應(yīng)答位*/

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

if(SDA==l)ack=0;

elseack=1;/*判斷是否接受到應(yīng)答信號*/

SCL=0;

_Nop();

_Nop();

/**************************************************************

*****

字節(jié)數(shù)據(jù)傳送函數(shù)

函數(shù)原型:ucharRcvByte();

功能:用來接受從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),

發(fā)完后請用應(yīng)答函數(shù)。

**************************************************************

******I0

ucharRcvByte()

(

ucharretc;

ucharBitCnt;

retc=0;

SDA=1;/*置數(shù)據(jù)線為輸入方式*/

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

(

_Nop();

SCL=0;/*置時鐘線為低,準(zhǔn)備接受數(shù)據(jù)位*/

_Nop();

_Nop();/*時鐘低電平周期大于4.7ns*/

_Nop();

_Nop();

_Nop();

SCL=1;/*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/

_Nop();

_Nop();

retc=retC<<1;

if(SDA=l)retc=retc+1;/*讀數(shù)據(jù)位,接受的數(shù)據(jù)位放入retc中*/

_Nop();

_Nop();

SCL=O;

_Nop();

_Nop();

return(retc);

/*********************************************************

***********

應(yīng)答子函數(shù)

原型:voidAck_I2c(bita);

功能:主控器進行應(yīng)答信號,(可以是應(yīng)答或非應(yīng)答信號)

***************************************************************

*****/

voidAck_I2c(bita)

(

if(a==0)SDA=0;/*在此發(fā)出應(yīng)答或非應(yīng)答信號*/

e1seSDA=1;

_Nop();

Nop();

_Nop();

SCL=1;

_Nop();

_Nop();/*時鐘低電平周期大于4口s*/

_Nop();

_Nop();

_Nop();

SCL=0;/*清時鐘線,鉗住12c總線以便繼續(xù)接受*/

_Nop();

_Nop();

/****************************************************************

***

向無子地址器件發(fā)送字節(jié)數(shù)據(jù)函數(shù)

函數(shù)原型:bitISendByte(ucharsla,ucahrc);

功能:從啟動總線到發(fā)送地址,數(shù)據(jù),結(jié)束總線的全過程,從器件地址sla.

假如返回1表達操作成功,否則操作有誤。

注意:使用前必須已結(jié)束總線。

********************************************************************

bitISendByte(ucharsia,ucharc)

Start_I2c();/*啟動總線*/

SendByte(sla);/*發(fā)送器件地址*/

if(ack==O)return(0);

SendByte(c);/*發(fā)送數(shù)據(jù)*/

if(ack==0)return(0);

Stop_I2c();/*結(jié)束總線*/

return(l);

I*************************************************************

******

向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù)

函數(shù)原型:bitISendStr(ucharsla,ucharsuba,ucahr*s,ucharno);

功能:從啟動總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程,從器件

地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個字節(jié)。

假如返回1表達操作成功,否則操作有誤。

注意:使用前必須已結(jié)束總線。

****************************************************************

****/

bitISendStr(uchars1a,ucharsuba,uchar*s,ucharno)

uchari;

Start_I2c();/*啟動總線列

SendByte(s1a);/*發(fā)送器件地址*/

if(ack==O)return(O);

SendByte(sub

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論