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

當(dāng)前位置:首頁(yè) > 電源 > 數(shù)字電源
[導(dǎo)讀]初學(xué)者在編寫(xiě)單片機(jī)程序時(shí)經(jīng)常會(huì)用到延時(shí)函數(shù),但是當(dāng)系統(tǒng)逐步復(fù)雜以后(沒(méi)有復(fù)雜到使用操作系統(tǒng))延時(shí)會(huì)因?yàn)檠訒r(shí)降低MCU的利用率,更嚴(yán)重的會(huì)影響系統(tǒng)中的“并行&rdquo

初學(xué)者在編寫(xiě)單片機(jī)程序時(shí)經(jīng)常會(huì)用到延時(shí)函數(shù),但是當(dāng)系統(tǒng)逐步復(fù)雜以后(沒(méi)有復(fù)雜到使用操作系統(tǒng))延時(shí)會(huì)因?yàn)檠訒r(shí)降低MCU的利用率,更嚴(yán)重的會(huì)影響系統(tǒng)中的“并行”操作例如一個(gè)既有按鍵又有蜂鳴器的系統(tǒng)中,如果要求按下按鍵發(fā)出不同的聲音,每次發(fā)聲時(shí)間在1秒-2秒之間, 如果用延時(shí)來(lái)做代碼很簡(jiǎn)單:

 

 

//蜂鳴器發(fā)出“嗶-嗶-嗶”聲音時(shí)間約1s

void BeepFuction(void)

{

unsigned char i;

for(i=0;i《3;i=++)

{

BeepEn(); //開(kāi)啟蜂鳴器

Delayms(220);//延時(shí)220ms

BeepDis();//關(guān)閉蜂鳴器

Delayms(110);//延時(shí)110ms

}

}

當(dāng)這段代碼執(zhí)行時(shí)MCU不可能同時(shí)處理按鍵檢查程序因?yàn)樗蟛糠謺r(shí)間在執(zhí)行Delayms()函數(shù)中的nop指令,這樣就不可能去執(zhí)行檢查按鍵了(不使用中斷時(shí)),如果把程序改成流程形式的寫(xiě)法則結(jié)果會(huì)大為不同,下面先介紹一下基本原理。

我們都知道一般的定時(shí)器為16位或8位循環(huán)計(jì)數(shù),例如對(duì)于16位的計(jì)數(shù)器當(dāng)計(jì)數(shù)器數(shù)值從0增加到65535時(shí)再加一就會(huì)回到0那么我們來(lái)比較下面兩種情況(不考慮計(jì)數(shù)器在記錄當(dāng)前時(shí)刻T后再次回到或超過(guò)T這種情況我暫且稱它為“壓圈”):

情況1:

T1時(shí)刻計(jì)數(shù)器數(shù)值為300

T2時(shí)刻計(jì)數(shù)器數(shù)值為400

則T1時(shí)刻到T2為100個(gè)計(jì)數(shù)單位。

這段時(shí)間差也為100個(gè)計(jì)數(shù)單位。

情況2:

T1時(shí)刻計(jì)數(shù)器數(shù)值為65535

T2時(shí)刻計(jì)數(shù)器數(shù)值為99

則T1到T2 可以算出為65535到0的1個(gè)計(jì)數(shù)單位再加上 0到99的99個(gè)計(jì)數(shù)單位總共為100個(gè)計(jì)數(shù)單位。

所以時(shí)間差還是100個(gè)計(jì)數(shù)單位。

在C語(yǔ)言中如果使用兩個(gè)無(wú)符號(hào)數(shù)作減法會(huì)得到如下結(jié)果:99-65535=100,這個(gè)很好理解就和10進(jìn)制的借位一樣只不過(guò)借位后不用管高位了也就相當(dāng)于99+65536-65535結(jié)果是100了,當(dāng)然這些前提條件都是計(jì)數(shù)器不會(huì)出現(xiàn)“壓圈”。

有了上面對(duì)定時(shí)器的了解就可以從新寫(xiě)這個(gè)Beep函數(shù)了

//蜂鳴器發(fā)出“嗶-嗶-嗶”聲音時(shí)間約1s

bit BeepFlag = 0;//蜂鳴流程忙標(biāo)志位

bit BeepCtrl = 0;//蜂鳴器流程控制標(biāo)志位

void BeepProc(void)

{

staTIc unsigned int BeepTImer;

staTIc unsigned char BeepStatus = 0;

staTIc unsigned char i;

switch(BeepStatus)

{

case 0://

if(BeepCtrl)

{

i = 3;//蜂鳴次數(shù)

BeepFlag = 1;//置位忙標(biāo)志位

BeepCtrl = 0;//清除控制標(biāo)志位

BeepTimer = TIMER;//這里TIMER為系統(tǒng)定時(shí)器計(jì)數(shù)時(shí)鐘為1ms

BeepEn(); //開(kāi)啟蜂鳴器

BeepStatus = 1;//進(jìn)入下一個(gè)狀態(tài)

}

break;

case 1://蜂鳴狀態(tài)

if(TIMER-BeepTimer》220)//220ms

{

BeepDis(); //關(guān)閉蜂鳴器

BeepTimer = TIMER;//記錄時(shí)刻

BeepStatus = 2;//進(jìn)入下一個(gè)狀態(tài)

}

break;

case 2://停止蜂鳴狀態(tài)

if(TIMER-BeepTimer》110)//110ms

{

if(i!=0)

{

i--;

BeepTimer = TIMER;//記錄時(shí)刻

BeepEn(); //開(kāi)啟蜂鳴器

BeepStatus = 2;//回到蜂鳴狀態(tài)

}

else

{

BeepStatus = 0;//回到初始狀態(tài)

BeepFlag = 0;//清除忙標(biāo)志位

}

}

break;

default:

BeepFlag = 0;//清除忙標(biāo)志位

BeepStatus = 0;//回到初始狀態(tài)

break;

}

}

用這樣的方法實(shí)現(xiàn)的蜂鳴程序在使用時(shí)也有不同的地方,因?yàn)槭褂玫膕witch狀態(tài)所有在主循環(huán)中要一直調(diào)用:

void main()

{

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

。..。..。..。..。..

//主循環(huán)

while(1)

{

Fun1Proc();//功能1流程

Fun2Proc();//功能2流程

。..。

BeepProc();//蜂鳴流程

。..。

}

}

16

在別的函數(shù)中需要使蜂鳴器工作時(shí)只需要下面代碼即可:

if(!BeepFlag)//檢查是否忙

BeepCtrl = 1;//啟動(dòng)蜂鳴器

用這種方法能充分利用MCU,在蜂鳴器發(fā)聲或發(fā)聲間隔的等待時(shí)間MCU可以處理別的函數(shù),但是還要有幾點(diǎn)需要注意

第一,主循環(huán)while(1)的循環(huán)周期最好小于定時(shí)器計(jì)數(shù)時(shí)鐘周期

第二,主循環(huán)中盡量不要使用硬延時(shí)Delayms

第三,代碼中如果存在多個(gè)地方需要控制一個(gè)流程時(shí)一定要先讀取標(biāo)志位再控制

本站聲明: 本文章由作者或相關(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)系本站刪除。
換一批
延伸閱讀

在單片機(jī)的世界里,“字節(jié)”(Byte)是一個(gè)貫穿始終的核心概念。從存儲(chǔ)數(shù)據(jù)到執(zhí)行指令,從變量定義到外設(shè)通信,字節(jié)無(wú)處不在。很多初學(xué)者在學(xué)習(xí)單片機(jī)時(shí),往往更關(guān)注復(fù)雜的程序邏輯和外設(shè)驅(qū)動(dòng),卻忽略了字節(jié)這個(gè)基礎(chǔ)知識(shí)點(diǎn),導(dǎo)致在后...

關(guān)鍵字: 單片機(jī) 字節(jié)

在單片機(jī)的數(shù)字邏輯中,我們通常最關(guān)注的是高電平和低電平兩種狀態(tài),它們構(gòu)成了二進(jìn)制數(shù)字世界的基礎(chǔ)。然而,除了這兩種狀態(tài)之外,還有一種至關(guān)重要但常常被忽視的狀態(tài)——高阻態(tài)(High Impedance State)。高阻態(tài)就...

關(guān)鍵字: 單片機(jī) 高阻態(tài)

美國(guó)舊金山和中國(guó)蘇州2026年2月8日 /美通社/ -- 信達(dá)生物制藥集團(tuán)(香港聯(lián)交所股票代碼:01801),一家致力于研發(fā)、生產(chǎn)和銷(xiāo)售腫瘤、自身免疫、代謝、眼科等重大疾病領(lǐng)域創(chuàng)新藥物的生物制藥公司,宣布與禮來(lái)制藥達(dá)成戰(zhàn)...

關(guān)鍵字: COM 代碼 創(chuàng)始人 控制

對(duì)于PIC入門(mén)者來(lái)說(shuō),不需要盲目追求高端開(kāi)發(fā)板,一塊功能均衡、資料豐富的入門(mén)款就能滿足需求。比如Microchip官方推出的PIC16F84A開(kāi)發(fā)板,它搭載經(jīng)典的8位PIC內(nèi)核,引腳布局清晰,自帶LED、按鍵等基礎(chǔ)外設(shè),...

關(guān)鍵字: PIC 單片機(jī)

該低功耗器件支持5V運(yùn)行,在實(shí)現(xiàn)高性能的同時(shí),能有效保障系統(tǒng)簡(jiǎn)潔性與成本效益

關(guān)鍵字: MCU 單片機(jī) 工業(yè)自動(dòng)化

CH558T 采用 BASIC-52 系統(tǒng),并具備藍(lán)牙連接功能。CH558T 的運(yùn)行頻率為 48 MHz,擁有 4KB 的 xRAM,足以滿足常規(guī)應(yīng)用需求。

關(guān)鍵字: 單片機(jī) BASIC-52 系統(tǒng) CH558T

上海2026年1月16日 /美通社/ -- 環(huán)旭電子股份有限公司(環(huán)旭電子,上海證券交易所證券代碼:601231)宣布全資子公司上海環(huán)興光電有限公司完成取得成都光創(chuàng)聯(lián)科技有限公司(EugenLight Technolog...

關(guān)鍵字: 光電 控制 電子 光通訊

RGB顯示屏憑借高分辨率、真彩色顯示優(yōu)勢(shì),在工業(yè)控制、智能終端、消費(fèi)電子等領(lǐng)域應(yīng)用廣泛。裸屏RGB顯示屏無(wú)內(nèi)置驅(qū)動(dòng)電路,需搭配專用LCD驅(qū)動(dòng)芯片才能與單片機(jī)協(xié)同工作,其核心作用是將單片機(jī)輸出的圖像數(shù)據(jù)轉(zhuǎn)換為屏幕可識(shí)別的R...

關(guān)鍵字: 顯示屏 驅(qū)動(dòng)芯片 單片機(jī)

東京2026年1月13日 /美通社/ -- 旭化成微電子株式會(huì)社(總公司:東京都千代田區(qū)、法定代表人總經(jīng)理:篠宮秀行)旗下子公司Senseair開(kāi)發(fā)出新型CO?傳感器S12 CO?,并已開(kāi)始提供樣品。與該公司以往產(chǎn)品相比...

關(guān)鍵字: 傳感器 微電子 控制 空調(diào)系統(tǒng)

在嵌入式系統(tǒng)開(kāi)發(fā)中,單片機(jī)(MCU)作為控制核心,廣泛應(yīng)用于工業(yè)自動(dòng)化、智能家居等領(lǐng)域。然而,當(dāng)需要控制繼電器或電磁閥等大功率負(fù)載時(shí),直接連接單片機(jī)引腳往往會(huì)導(dǎo)致系統(tǒng)故障甚至硬件損壞。

關(guān)鍵字: 單片機(jī) MCU
關(guān)閉