<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 初步認(rèn)識(shí)51單片機(jī)

          初步認(rèn)識(shí)51單片機(jī)

          作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
          前面我們學(xué)會(huì)了如何操作一個(gè)MCU的管腳(P1.0),讓它設(shè)置為低電平(sbit LED= P1^0; LED=0),那么我們很容易的就能想到如何將MCU的管腳設(shè)置成高電平. 這一講,我們就來(lái)討論如何控制單片機(jī)的IO口,也就是輸入輸出端口(input and output port)

          2.1單片機(jī)IO口操作與延時(shí)

          本文引用地址:http://www.ex-cimer.com/article/201611/319542.htm

          既然我們學(xué)會(huì)了如何控制P1.0,那么同樣的方式我們就能控制P1.1,P1.2, ... P1.7了。很奇怪,為什么單片機(jī)的引腳從P1.0開(kāi)始到P1.7,為什么不是從P1.1到P1.8?基本上你所見(jiàn)到的控制芯片都是以0為起始的。我們把P1.0到P1.7叫做P1端口。那么這樣的端口有多少個(gè)呢,在STC89C52中,一共有4組這樣的端口,分別是P0,P1,P2,P3. 每個(gè)端口都有8個(gè)管腳,這樣很快,我們應(yīng)該知道操作這4組共32個(gè)管腳了。我相信寫(xiě)到這里,每個(gè)人都已經(jīng)知道了如何使用這32個(gè)任意一個(gè)管腳來(lái)控制LED。

          既然我們學(xué)會(huì)了如何控制一個(gè)LED,那么如何控制兩個(gè)LED?很容易的能猜到代碼如下:

          #include

          sbit LED1 = P1^0;

          sbit LED2 = P1^1;

          sbit LED3 = P2^1;

          void main(void)

          {

          while(1)

          {

          LED1=0;

          LED2=0;

          LED3=0;

          }

          }

          通過(guò)以上方式我們能用任意的IO端口來(lái)點(diǎn)亮LED。這里就不再贅述了。

          既然我們學(xué)會(huì)了如何點(diǎn)亮一個(gè)LED,相信熄滅一個(gè)LED也會(huì)了,并且你能很快的寫(xiě)出代碼:

          #include

          sbit LED = P1^0;

          void main(void)

          {

          while(1)

          {

          LED = 0;

          LED = 1;

          }

          }

          這樣對(duì)不對(duì)?是對(duì)的。LED=0,燈亮了,LED=1燈滅了。程序確實(shí)是沒(méi)有問(wèn)題,LED也是這樣操作的。問(wèn)題是人的肉眼分辨不出來(lái),為什么呢?這里就涉及到了單片機(jī)的運(yùn)行速度以及人眼的分辨間隔。下面我們來(lái)分析從LED=0(亮)到LED=1(滅),中間的間隔是多長(zhǎng)時(shí)間?這個(gè)涉及到單片機(jī)的執(zhí)行速度與時(shí)鐘周期,機(jī)器周期,指令周期相關(guān),我們暫且不討論?,F(xiàn)在我們通過(guò)keil軟件調(diào)試的方法找到從LED=0到LED=1這個(gè)過(guò)程花了多長(zhǎng)時(shí)間。

          (1) 打開(kāi)keil軟件,新建一個(gè)工程,并將以上代碼拷入led.c文件

          (2) 點(diǎn)擊Project->options for Target Target1...

          (3) 在彈出的對(duì)話框中選擇target, Xtal選擇11.0592,然后點(diǎn)擊OK

          (4) 點(diǎn)擊debug圖標(biāo),紅色方框所示

          (5) 彈出來(lái)的界面比較糟糕,可以自己調(diào)節(jié),如何調(diào)節(jié)?這里舉一個(gè)例子,比如我想移動(dòng)Register這個(gè)窗口,用鼠標(biāo)左鍵點(diǎn)擊Register窗口的標(biāo)題欄(窗口的藍(lán)色部分),按住鼠標(biāo)不松開(kāi)并拖動(dòng)。

          此時(shí)界面如上圖所示,四個(gè)紅色方框內(nèi)的方框表示四個(gè)方向。此時(shí)將鼠標(biāo)不松開(kāi)繼續(xù)拖動(dòng)到右邊紅色方框中(注意是要把鼠標(biāo)放到方框內(nèi)),結(jié)果如下:

          此時(shí)右邊區(qū)域會(huì)變?yōu)樗{(lán)色,該區(qū)域表示Register即將存放的區(qū)域,然后松開(kāi)鼠標(biāo),拖動(dòng)結(jié)束。

          點(diǎn)擊Register窗口中Auto hide圖標(biāo),如下圖紅色方框所示,將Register窗口自動(dòng)隱藏。

          其他窗口的調(diào)整方法類(lèi)似。

          (6) 插入斷點(diǎn)。如下圖所示,在紅色方框位置雙擊鼠標(biāo),則自動(dòng)插入斷點(diǎn),并且出現(xiàn)紅色斷點(diǎn)標(biāo)志。

          這里我們插入兩個(gè)斷點(diǎn)如圖所示

          點(diǎn)擊紅色方框(1)中的RST,然后點(diǎn)擊紅色方框(2)中的run,此時(shí)黃色箭頭會(huì)跳到紅色方框(3)處,記錄紅色方框(4)中的時(shí)間t1=0.00042209s

          點(diǎn)擊方框(2)中的run,此時(shí)黃色箭頭會(huì)跳到紅色方框(5)處,記錄紅色方框(4)中的時(shí)間t2=0.00042426s,那么t2-t1=0.00000217s=2.17us,

          表示LED從點(diǎn)亮到熄滅只用了2.17微秒,而人眼的最小分辨時(shí)間間隔大約為0.27s(270000微秒),因此感知不到燈的亮滅過(guò)程。你可以將這個(gè)程序下載到單片機(jī)中做做實(shí)驗(yàn),你會(huì)發(fā)現(xiàn)LED很暗。事實(shí)上以上程序?qū)?dǎo)致LED循環(huán)亮滅,由于變化時(shí)間太快,幾個(gè)微秒,我們無(wú)法感知,因此給人的感覺(jué)就是燈很暗?,F(xiàn)在我們?nèi)绾卧O(shè)置延時(shí),讓我們能更清楚的觀察燈的亮滅過(guò)程?思路很簡(jiǎn)單,讓單片機(jī)點(diǎn)亮LED后,去干點(diǎn)別的事情,然后再熄滅LED。這個(gè)就好比你坐火車(chē)時(shí),提前到了一個(gè)小時(shí),你可以看看書(shū),玩玩手機(jī)。目的是坐火車(chē),看書(shū),玩手機(jī)只起到消磨時(shí)間的作用。那么同樣,在本例中,我們讓單片機(jī)干什么事情呢?可以選擇休眠(我們后面講到),或者讓它去數(shù)數(shù)。比如從1數(shù)到10000等等。這種方式就叫做軟件延時(shí)。

          #include

          sbit LED = P1^0;

          void main(void)

          {

          unsigned int i;

          while(1)

          {

          LED = 0;

          for(i=0;i<40000;i++);

          LED = 1;

          for(i=0;i<40000;i++);

          }

          }

          將以上代碼復(fù)制到led.c文件中并保存。該段代碼中,通過(guò)去做別的事情來(lái)達(dá)到延時(shí)的作用。我們?cè)俅握{(diào)試看看LED熄滅和點(diǎn)亮?xí)r間的間隔,設(shè)置斷點(diǎn)如下:

          以上可以看出,1.60636393s-0.00042318s 大約1.6s,遠(yuǎn)遠(yuǎn)大于人的分辨時(shí)間。

          既然我們能控制一個(gè)LED的亮滅了,那么同理可知,我們當(dāng)然知道如何控制并延時(shí)其他LED了,這樣我們就學(xué)會(huì)如何操作單片機(jī)的IO端口以及如何通過(guò)軟件延時(shí)了。

          下面我們來(lái)看看就這兩招能干什么事情?



          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();