日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]本文檔包括單片機(jī)系統(tǒng)中常用到的時(shí)鐘中斷、通訊及鍵盤(pán)掃描等模塊(見(jiàn)所附源程序)的說(shuō)明。這些模塊使用前后臺(tái)系統(tǒng)模型。為達(dá)到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數(shù)的設(shè)置,而不是

本文檔包括單片機(jī)系統(tǒng)中常用到的時(shí)鐘中斷、通訊及鍵盤(pán)掃描等模塊(見(jiàn)所附源程序)的說(shuō)明。這些模塊使用前后臺(tái)系統(tǒng)模型。為達(dá)到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數(shù)的設(shè)置,而不是直接更改源代碼。

這些可選內(nèi)容大部分為宏定義,如果不定義宏相應(yīng)的功能在編譯時(shí)被屏蔽,不會(huì)增加代碼長(zhǎng)度。具體可選內(nèi)容見(jiàn)各模塊中的說(shuō)明。

在Config.h文件中還要包含一個(gè)單片機(jī)硬件的資源頭文件。

各模塊使用了定義在Common.h中的一些數(shù)據(jù)類型。如:BIT(bit) BYTE(unsigned char)等,具體請(qǐng)參見(jiàn)源程序。

時(shí)鐘模塊

  在單片機(jī)軟件設(shè)計(jì)中,時(shí)鐘是重要資源,為了充分利用時(shí)鐘資源,故設(shè)計(jì)本時(shí)鐘模塊。本模塊使用定時(shí)器0,在完成用戶指定功能的同時(shí),還能夠自動(dòng)處理一些其它模塊中與時(shí)鐘相關(guān)的信息。

  時(shí)鐘模塊由聲明文件Timer.h以及實(shí)現(xiàn)文件Timer.c組成。

  用戶應(yīng)該在Config.h中定義宏TIMER_RELOAD來(lái)設(shè)定定時(shí)器0的重裝載初值。推薦的定時(shí)器0的中斷時(shí)間大于1毫秒。

  在程序的初始化階段調(diào)用時(shí)鐘模塊的初始化函數(shù)InitTimerModule()之后,就可以使用時(shí)鐘模塊所以支持的各種功能。具體描述如下:

延時(shí):當(dāng)用戶需要進(jìn)行一定時(shí)間的延時(shí)時(shí),可以通過(guò)調(diào)用Delay()來(lái)進(jìn)行,參數(shù)為時(shí)鐘中斷的次數(shù)。如時(shí)鐘中斷周期為1ms,想進(jìn)行100ms的延時(shí),則可以調(diào)用Delay(100)。

注意:

如果延時(shí)的絕對(duì)時(shí)間小于時(shí)鐘中斷的周期,則不能夠用本方法做到延時(shí)。

定時(shí):當(dāng)程序中需要使用定時(shí)功能時(shí),如等待某外部事件,如果在一定時(shí)間內(nèi)發(fā)生則繼續(xù)執(zhí)行,如果在這段時(shí)間內(nèi)發(fā)生,則認(rèn)為出現(xiàn)錯(cuò)誤,轉(zhuǎn)向錯(cuò)誤處理機(jī)制。

在此推薦一種編程模式,但用戶可以用自己認(rèn)為更合理的方式處理此類問(wèn)題。

這里簡(jiǎn)單說(shuō)明一下關(guān)于阻塞式函數(shù)及非阻塞式函數(shù)。簡(jiǎn)單說(shuō),阻塞式函數(shù)就是當(dāng)檢測(cè)完成條件,如果不能夠完成則等待,如:

void CheckSomething()

{

  // gbitSuccessFlag is a global variable

  while(gbitSuccessFlag == FALSE)

  {

    // do nothing but waiting

  }

}

可以看到,當(dāng)bitSuccessFlag沒(méi)有被設(shè)置為T(mén)RUE時(shí),函數(shù)保持等待狀態(tài)不返回,這樣就是阻塞式的函數(shù)。

另外一種情況:

BIT CheckSomething()

{

  if(gbitSuccessFlag == TRUE)

  {

    //…

    return TRUE;

  }

  return FALSE;

}

在這里,如果所檢測(cè)的事件有沒(méi)有完成,函數(shù)進(jìn)行檢測(cè)之后,立刻返回,通過(guò)返回值報(bào)告完成情況,如果沒(méi)有完成,則等待調(diào)用者分配再次執(zhí)行的機(jī)會(huì)。這樣的函數(shù)就是非阻塞函數(shù)。

在應(yīng)用定時(shí)功能時(shí),首先要將檢測(cè)函數(shù)定義成非阻塞函數(shù)。如上面的第二個(gè)版本的CheckSomething。

然后下面模式:

BIT bitDone = FALSE;

ResetClock(); // clear timer interrupt times counter

while(GetClock() < MAX_WAITINGTIME)

{

  if(CheckSomething() == TRUE)

  {

    bitDone = TRUE;

    break;

  }

}

if(bitDone == FALSE)

{

  // process time out

}

或者簡(jiǎn)單寫(xiě)成:

BIT bitDone = FALSE;

ResetClock();

while(GetClock() < MAX_WAITINGTIME && (bitDone = CheckSomething));

if(bitDone == FLASE)

{

  //…

}

軟件看門(mén)狗:實(shí)現(xiàn)具有局限性的看門(mén)狗功能。在程序中合適的地方加入對(duì)軟件看門(mén)狗的復(fù)位函數(shù)ResetWatchDog(),在Config.h中加入宏TIMER_WATCHDOGTIMEOUT。當(dāng)程序運(yùn)行時(shí),如果在發(fā)生TIMER_WATCHDOGTIMEOUT次時(shí)鐘中斷之內(nèi)沒(méi)有復(fù)位軟件看門(mén)狗,則系統(tǒng)復(fù)位。

注意:

如果沒(méi)有加入TIMER_WATCHDOGTIMEOUT宏,程序中的ResetWatchDog沒(méi)有任何用處,不用刪除。

如果系統(tǒng)不能實(shí)現(xiàn)時(shí)鐘中斷,則軟件看門(mén)狗也同時(shí)失去功能。

目前版本的的時(shí)鐘模塊的復(fù)位功能并不是完全復(fù)位,主要表現(xiàn)在當(dāng)復(fù)位之后,系統(tǒng)將不再響應(yīng)任何中斷。所以軟件看門(mén)狗只是一個(gè)程序的調(diào)試功能,不應(yīng)該將它用于正式工作的程序,此時(shí)應(yīng)該使用硬件看門(mén)狗。

用戶自定義任務(wù):如果想在時(shí)鐘中斷內(nèi)執(zhí)行一些耗時(shí)較短的任務(wù),可以定義回調(diào)函數(shù)OnTimerInterrupt。函數(shù)原形為:void OnTimerInterrupt();

如果想在發(fā)生時(shí)鐘中斷時(shí)執(zhí)行一些功能,而這些功能又耗時(shí)相對(duì)較長(zhǎng),不合適放在中斷響應(yīng)函數(shù)內(nèi)部,則可以在程序中的主循環(huán)中的任意地方添加: ImpTimerService(),同時(shí)提供原形為void OnTimerEvent()的回調(diào)函數(shù)。具體的程序如下所示:

void main()

{

  Initialize();

  while(TRUE)

  {

    //…working

    ImpTimerService();

    //…working

  }

}

void OnTimerEvent()

{

  // do some task

}

對(duì)通訊模塊提供支持:如通訊中的各種超時(shí)等,見(jiàn)通訊模塊中的詳細(xì)說(shuō)明。

對(duì)鍵盤(pán)掃描模塊提供支持:可以自動(dòng)調(diào)用鍵盤(pán)掃描模塊,見(jiàn)鍵盤(pán)掃描模塊中的詳細(xì)說(shuō)明。

對(duì)程序調(diào)試提供支持:在程序開(kāi)發(fā)過(guò)程中,有時(shí)為了判斷程序是不是在工作,常用利用單片機(jī)系統(tǒng)的某一空閑引腳通過(guò)一個(gè)限流電阻接一個(gè)發(fā)光二極管,在程序中間隔固定時(shí)間交替控制發(fā)光管的明暗。實(shí)現(xiàn)這個(gè)功能只要在Config.h文件中定義TIMER_FLASHLED宏,如:

#define TIMER_FLASHLED        P1_0

則當(dāng)時(shí)鐘中斷發(fā)生256次之后,改變發(fā)光管的狀態(tài)。

通訊模塊

  串口資源做為單片機(jī)與外界通信的常用手段,通訊模塊提供了完全緩沖的串口通訊底層機(jī)制,適用于長(zhǎng)度不大的數(shù)據(jù)包的發(fā)送及接收。如果處理關(guān)鍵數(shù)據(jù),需要用戶自己提供糾錯(cuò)協(xié)議。

  通訊模塊由聲明文件SComm.h及實(shí)現(xiàn)文件SComm.c組成。

  初始化:調(diào)用函數(shù)InitSCommModule()來(lái)初始化通訊模塊:

  void InitSCommModule(BYTE byTimerReload, BIT bitTurbo)

  參數(shù)說(shuō)明:

byTimerReload:定時(shí)器1的重裝載初始值。

bitTurob:當(dāng)此參數(shù)為T(mén)RUE時(shí),串行通訊在定時(shí)器1的溢出速率基礎(chǔ)上加倍。為FALSE時(shí),串行通訊速率為定時(shí)器1的溢出速率。

  緩沖區(qū):模塊使用了由宏SCOMM_SENDBUFSIZE、SCOMM_RECEBUFSIZE及SCOMM_PKGBUFSIZE所指定長(zhǎng)度的三個(gè)緩沖區(qū),分別為發(fā)送、接收及數(shù)據(jù)包(用于處理接收到的數(shù)據(jù))緩沖區(qū)(如果沒(méi)有使用異步接收功能,則不需要使用數(shù)據(jù)包緩沖區(qū))。

  在缺省時(shí),這三個(gè)宏都被定義為10,但用戶可以自已按照系統(tǒng)的RAM資源占用情況在Config.h中重定義緩沖區(qū)的大小。需要注意的是,如果緩沖的長(zhǎng)度不夠,當(dāng)發(fā)送或接收長(zhǎng)數(shù)據(jù)包的時(shí)候可能會(huì)發(fā)生問(wèn)題,關(guān)于數(shù)據(jù)緩沖區(qū)的最小值的設(shè)置可以參考下面的說(shuō)明。

  注意:需要盡快取出接收緩沖區(qū)中的數(shù)據(jù),否則當(dāng)緩沖區(qū)滿之后,新的數(shù)據(jù)將被簡(jiǎn)單的丟掉。

  字節(jié)級(jí)服務(wù)函數(shù):在Config.h文件中定義了宏SCOMM_DriverInterface(如:#define SCOMM_DriverInterface),則可以使用字節(jié)級(jí)服務(wù)函數(shù),即通訊模塊的底層函數(shù)。

  共有兩個(gè)函數(shù)可以使用:

  void SendByte(BYTE byData);

  發(fā)送一個(gè)字節(jié),如果當(dāng)前緩沖區(qū)滿,則等待。參數(shù)byData為要發(fā)送的數(shù)據(jù)。

BYTE ReceByte();

接收一個(gè)字節(jié),如果當(dāng)前緩沖區(qū)中沒(méi)有數(shù)據(jù),則此函數(shù)阻塞,直到接收到數(shù)據(jù)為止。接收到數(shù)據(jù)通過(guò)返回值返回。

可以通過(guò)調(diào)用IsSendBufEmpty() IsSendBufFull() IsReceBufEmpty() IsReceBufFull()  宏來(lái)判斷緩沖區(qū)的空或滿,以防系統(tǒng)阻塞。

不推薦直接使用這一級(jí)的服務(wù)函數(shù),應(yīng)該使用高層次上的服務(wù)函數(shù)或者在這一級(jí)服務(wù)函數(shù)的基礎(chǔ)上構(gòu)造自己的通訊函數(shù)。

  

  數(shù)據(jù)包級(jí)服務(wù)函數(shù):在Config.h文件中定義宏SCOMM_PackageInterface(如: #define SCOMM_PackageInterface)則可以使用數(shù)據(jù)包級(jí)服務(wù)函數(shù)。

  共有兩個(gè)函數(shù)可以使用:

void SendPackage(BYTE* pbyData, BYTE byLen);

發(fā)送數(shù)據(jù)包,參數(shù)pbyData為將要發(fā)送的數(shù)據(jù)包緩沖區(qū)(數(shù)組)的指針,byLen為將要發(fā)送的數(shù)據(jù)包的長(zhǎng)度。

當(dāng)沒(méi)有定義SCOMM_DriverInterface時(shí),數(shù)據(jù)被完全緩沖。即不能夠發(fā)送長(zhǎng)度超過(guò)發(fā)送緩沖區(qū)長(zhǎng)度的數(shù)據(jù)包。當(dāng)定義了SCOMM_DriverInterface時(shí),采用單字節(jié)發(fā)送,這時(shí)不限制需要發(fā)送的數(shù)據(jù)的長(zhǎng)度。

BYTE RecePackage(BYTE* pbyData, BYTE byLen);

接收數(shù)據(jù)包,參數(shù)pbyData為存放將要接收的數(shù)據(jù)的緩沖區(qū),byLen為緩沖區(qū)長(zhǎng)度。返回值為接收到的字節(jié)數(shù),當(dāng)模塊的接收緩沖區(qū)為空時(shí),函數(shù)非阻塞,立即返回,返回值為零。

同步發(fā)送接收服務(wù)函數(shù):

比如在一個(gè)串行總線多機(jī)通訊系統(tǒng)中,主機(jī)需要定時(shí)循檢各從機(jī)的狀態(tài),往往是發(fā)一個(gè)包含從機(jī)地址及指令的數(shù)據(jù)包給從機(jī),之后等待一定的時(shí)間,從機(jī)需要在這段時(shí)間之內(nèi)給主機(jī)一個(gè)應(yīng)答,如果沒(méi)有這個(gè)應(yīng)答,則認(rèn)為從機(jī)工作狀態(tài)出錯(cuò),轉(zhuǎn)去進(jìn)行相應(yīng)的處理。在這個(gè)模型里,主機(jī)不能夠不進(jìn)行等待而給另一臺(tái)從機(jī)發(fā)送指令,也不能夠不管從機(jī)在很久沒(méi)有應(yīng)答的情況下繼續(xù)等待。還有一種情況,比如當(dāng)使用485總線進(jìn)行通信時(shí),如果是兩條通訊線則系統(tǒng)只能工作在半雙工模式下,總線在同一時(shí)間內(nèi)只能工作在發(fā)送或接收,為了防止發(fā)送和接收相互干擾,這時(shí)的通訊常常需要使用同步發(fā)送和接收。

當(dāng)在Config.h文件中定義宏SCOMM_SyncInterface后,則可以使用通訊模塊提供同步發(fā)送接收函數(shù):

void SendPackage(BYTE* pbyData, BYTE byLen);

發(fā)送數(shù)據(jù)包,參數(shù)pbyData為將要改善的數(shù)據(jù)包的緩沖區(qū)指針,byLen為將要發(fā)送的數(shù)據(jù)包的長(zhǎng)度。

這個(gè)函數(shù)可以保證等待一個(gè)完整的數(shù)據(jù)包完全發(fā)送出去之后,它才返回,在這段時(shí)間內(nèi),它會(huì)阻塞運(yùn)行。

BYTE SyncRecePackage(BYTE* pbyBuf, BYTE byBufLen, WORD wTimeout, BYTE byParam);

接收數(shù)據(jù)包。返回值為接收到的數(shù)據(jù)包長(zhǎng)度。參數(shù)pbyBuf為將要接收數(shù)據(jù)包的緩沖區(qū)的指針,byBufLen為提

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉