输出毫秒_自学单片机第十三篇上:单点输出
關(guān)注一下,更多精彩等著你!
打開之前的工程,當(dāng)然新建也可以,具體步驟看之前的文章就行。因?yàn)槭菍W(xué)習(xí),所以也用不著總是新建工程,起名起一大堆,接下來,除非要用兩個(gè)執(zhí)行文件,只要是單獨(dú)的程序,我們就用這個(gè)工程就好了。
打開工程,上回是測(cè)試了軟件和硬件,都沒有問題。我們不用開發(fā)板,自學(xué)從簡(jiǎn)單入手,不用考慮譯碼器和功率放大。對(duì)于已經(jīng)入門的,可能有點(diǎn)簡(jiǎn)單,但我想對(duì)于初來乍到的伙伴,還是慢慢來,別急。技術(shù)這碗飯,不論是不是為了掙錢,都要穩(wěn)扎穩(wěn)打。越快越難學(xué)會(huì)。
之前的程序頭文件留著。如果想明白,為什么非要用頭文件,不寫行不行?我會(huì)再寫一篇文章,講一下原因。包括程序中的一些關(guān)鍵字。
這回咱來試一個(gè)控制單個(gè)IO口的操作。我們僅操作一個(gè)IO口,其它的不變。這里選擇P1.0這個(gè)口。
程序還是我們首次測(cè)試的程序,之前運(yùn)行過一次,這回我們對(duì)它作些改動(dòng),讓它進(jìn)行自動(dòng)變換。
這就要用到一個(gè)延時(shí)函數(shù)了。咱說的延時(shí)不是定時(shí)器,就是讓程序作一定時(shí)間的等待。
我們先說下芯片是如何運(yùn)行的。晶振是芯片的心跳,由于芯片做出來后,工藝原因,程序運(yùn)行的最小時(shí)間是12個(gè)心跳,就是一個(gè)機(jī)器周期。相當(dāng)于精確振12下,程序動(dòng)一下,而一個(gè)程序語句,要想完成運(yùn)算,就平均要4個(gè)機(jī)器周期,當(dāng)然也有一個(gè)周期的,咱不細(xì)看。研究基礎(chǔ)結(jié)構(gòu)留給以后學(xué)的上路了再說。
1/(12Mhz/12)=1/1M=10∧-6秒。
1秒=10∧3毫秒=10∧6微秒
由上推算看出,1個(gè)機(jī)器周期就是1微秒,所以完成一個(gè)運(yùn)算是4微秒。我們假設(shè)要延時(shí)0.5秒,就要有:
0.5*10∧6/4=12500。
也就是大約1萬步,我們寫個(gè)1萬,讓它一直減到0,就是1萬步。減的過程就相當(dāng)于延時(shí)了,因?yàn)槌绦蚬庠谀莾核銛?shù)了,啥也干不了,算完才能干其它的。這個(gè)算的過程就是延時(shí)的過程。
原理有了,接下來寫程序,首先我們測(cè)試時(shí)的程序不動(dòng),僅需要添加延時(shí)部分就可以了。
延時(shí)程序代碼如下,寫完后記得編譯一下,如果是語法錯(cuò)誤,程序會(huì)幫你找到。我們要做到0錯(cuò)誤,0警告。這樣程序輸出時(shí)才不會(huì)出現(xiàn)不必要的問題。減少自己調(diào)試的時(shí)間。
然后,由于是延時(shí),我們可以通過keil的仿真分步運(yùn)行,查看一下我們運(yùn)行的時(shí)間是否合適。首先單擊第三行那個(gè)小錘子一樣的圖標(biāo),進(jìn)入設(shè)置,然后點(diǎn)開仿真選項(xiàng),我們把晶振頻率修改就可以了,改為11.05692.
修改完成后,我們單擊右側(cè)的紅色的debug按鍵,進(jìn)入調(diào)試模式。
進(jìn)入后,在LED程序前,單擊左鍵,設(shè)置斷點(diǎn)。出現(xiàn)小紅點(diǎn)就是設(shè)置成功。
接著先單擊復(fù)位按鍵,然后再單擊運(yùn)行按鍵,單擊一下就可以了,它會(huì)運(yùn)行到第一個(gè)斷點(diǎn)停下等待。
出現(xiàn)的兩個(gè)小三角就是說明程序此時(shí)等待在這里,左側(cè)的列表顯示的是內(nèi)部數(shù)據(jù),我們看下倒數(shù)第二行sec,這是時(shí)間。程序從開始到第一個(gè)語句的輸出,用時(shí)0.00048秒。我們?cè)俅螁螕暨\(yùn)行按鍵,觀察時(shí)間變化。
此時(shí)運(yùn)行到了第二個(gè)語句,我們查看時(shí)間從0.00048變成了0.087,說明一個(gè)延時(shí)用了0.087秒,這個(gè)跟我們假想的0.5秒有點(diǎn)遠(yuǎn)啊,我們簡(jiǎn)單計(jì)算下頻率1/0.087=11赫茲,先不管,我們用軟件仿真一下試試。仿真發(fā)現(xiàn),閃爍一下就沒了,我們用示波器看下什么情況。
這個(gè)豎著一格是100毫秒,也就是0.1秒,我們從上圖中可以看出,每?jī)蓚€(gè)黃色的豎線之間的間隔大致就是一格如果細(xì)看,0.8格也是差不多的。就相當(dāng)于0.08秒。跟我們的程序仿真基本一致,說明我們的延時(shí)函數(shù)延時(shí)時(shí)間不夠,為什么會(huì)出現(xiàn)這種情況?
因?yàn)槌绦蛟谟?jì)算加減法的時(shí)間是速度比較快的,也就是說,他算加減根本不用四個(gè)機(jī)器周期。我們不管幾個(gè)周期了。現(xiàn)在是0.08秒,那么,需要0.5秒,就是說需要大致六倍,程序中需要60000。咱們更改后再次仿真試下。
需記得,更改程序需要退出仿真,還是單擊紅色的debug就可退出了,更改后,需要先編譯,再進(jìn)入debug,不然程序雖然更改了,但是可執(zhí)行文件還是原來的舊的,就運(yùn)行不出更改后的效果。
這次就是0.5秒了吧。
通過軟件仿真也說明了情況
示波器上也是5格一個(gè)脈沖,基本可以了。但是此時(shí)我們發(fā)現(xiàn),燈并沒有預(yù)想中的亮起,依然一閃而逝。我們看下示波器,發(fā)現(xiàn),高電位也是一根根 的細(xì)線,幾乎沒有時(shí)間,什么情況呢?這就是很多同學(xué)學(xué)習(xí)初期經(jīng)常會(huì)發(fā)生的,在程序中,我們的賦值是在最前邊,單片機(jī)是順序運(yùn)行的,當(dāng)他運(yùn)行完第一個(gè)延時(shí)語句時(shí),i已經(jīng)從60000減為0了,這時(shí)再運(yùn)行下一個(gè)延時(shí)語句時(shí),就會(huì)直接判斷等于0,跳出函數(shù)。所以就是一閃而逝。或者看不到發(fā)光。如何解決?
我們需要增加一個(gè)變量或者使用另一種循環(huán)體。簡(jiǎn)單的先增加一個(gè)變量j,讓他也等于60000。再仿真一下。
仿真后,波形就變成了0.5秒為5V,0.5秒為0V,這是可以看到,LED0.5秒亮,0.5秒滅。跟我們預(yù)期的一致了。
至此,程序調(diào)整結(jié)束了如果想查看視頻的可以后臺(tái)回復(fù)電氣,關(guān)注后在單片機(jī)選項(xiàng)中點(diǎn)擊視頻觀看。
還有硬件仿真運(yùn)行,大家自己可以動(dòng)手試試。問題出現(xiàn)不要?dú)怵H,因?yàn)槲覀儾皇鞘裁炊紩?huì),出現(xiàn)錯(cuò)誤是肯定的,更改的過程才是學(xué)習(xí),如果一帆風(fēng)順,那最終只會(huì)是一知半解。
如果有不懂或者問題可以留言或私信。
更多多內(nèi)容,歡迎關(guān)注百家號(hào):小亮談電氣。微信公眾號(hào):電氣學(xué)苑。
總結(jié)
以上是生活随笔為你收集整理的输出毫秒_自学单片机第十三篇上:单点输出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样安装python在桌面_在Windo
- 下一篇: 不同用户同时并发测压_简单聊聊吞吐量(T