天天看點

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

點亮第一個發光二極管2

昨天因為STC-ISP的問題,折騰了一個晚上,是以昨天沒有更新,今天多寫一點

接上一篇筆記

按照之前的代碼,如果我們要點亮多個發光二極管的時候,我們需要定義多個I/O口,那麼顯得及其麻煩,今天介紹一種總線操作法。

我們在原有的工程裡面在建立一個檔案,然後删掉原來的檔案,因為一個工程中隻能有一個主函數。

輸入新的語句

#include <reg52.h>       //52系列單片機頭檔案
void main()
{
    P1=0xaa;
}
           

這裡的

P1=0xaa

是對單片機的8個I/O口同時進行操作。在前面的筆記中我們了解到,對于單片機來說,1和0代表着高電平和低電平,當某個I/O口為0,即低電平的狀态下,對應的發光二極管就會發亮,這個原因是發光二極管一端連着單片機色I/O口,一端連着電阻,電阻的另一端連着Vcc,即電源,5V,為了讓電流通過發光二極管,肯定要I/O口是低電平,即0。0xaa,是個十六進制數,轉換成二進制數位10101010,這個二進制數從最小位開始對應P1^0口,是以這時候是1、3、5、7管亮,2、4、6、8管滅。如果想單單第一個發光二極管發亮,我們就應該輸入

P1=0xfe

,轉換成二進制數就是,11111110,這時候,P1口為低電平,第一個二極管點亮。

總線操作法适用于同時控制多個端口的情況,但是要注意對每個口的控制是要在十六進制那個數中展現出來。

2.3 while語句

針對while語句,在C語言中已經大緻了解了,這裡就在強調幾點

  1. C語言中一般把“0”視為“假”,“非0”視為“真”,while的判斷條件即“()”裡面如果最後的結果是0或者判斷為假,則不再執行while中的語句。
  2. while的内部語句可以為空,就是“{}”裡面的東西,有時候甚至這個花括号都可以省略。但是要注意,如果花括号省略了,必須要在“()”後面加一個分号,例如

    while(1);

    ,否則系統會自動把緊跟着while的第一行代碼當成while中的内容。
  3. 如果while的判斷語句中隻有一個1,那麼單片機将一直執行while的内部語句
    while(1)
    {
        P1=0xfe;
    }
    
               
    如圖,這個程式中,我們先判斷while的表達式,這裡是1,是以執行内部語句

    P1=0xfe;

    ,執行完了再次判斷表達式,還是是1,是以再次執行内部語句。

    這裡可以保持二極管一直發光,之前的

    P1^0=0

    也可以保持,但這裡的單片機其實還在一直工作,一直在判斷while是真是假,前面的程式執行了一次後,單片機就沒有工作了。單片機隻要它有電,有晶振在起振,就不會停止工作。

2.4 for語句及簡單延時語句

for的格式就不再贅述了,在c語言中已經學過。

在keil中,for語句往往被用來寫成延時語句。通俗的來說,單片機中晶振是用來控制每條代碼執行的時間的,晶振的頻率越高,代碼執行的越快,但是總歸是有個時間的,于是我們可以利用這一事實,多次重複for語句,進而達到大緻的時間控制效果。

例如

unsigned char i,j;
for (i=100;i>0;i--)
   for(j=200;j>0;j--);
           

在這裡,我們在第一層for語句中有嵌套了一層for語句,每當對i的判斷進行一次,我們就要将下面的for語句判斷執行200次,這樣有上萬次的判斷執行,積累出了相當長的時間,以至于人眼可以判斷出停頓了。當然,如果想時間再長一點,我們就可以讓for語句重複的次數更加多,不過要注意的是,我們在定義變量以及确定時間的時候,要確定變量的取值在範圍内,别定義i為字元型變量,最大位255,你給我整個

i=256

出來。

2.5 Keil仿真及延時語句的精确計算

在keil中輸入以下代碼;

#include <reg52.h>
#define uint unsigned int         //宏定義
sbit led1=P1^0;                   //聲明單片機P1口的第一位
uint i,j;
void main()
{
  while(1)
  {
    led1=0;
    for (i=1000;i>0;i--)           //延時
       for(j=110;j>0;j--);
    led1=1;
    for (i=1000;i>0;i--)
       for(j=110;j>0;j--);        
  }
}
           
  1. 宏定義#define
    1. #define指令用它後面的第一個字母組合代替該字母組合後面的所有内容,這裡就是用uint代替了unsigned int這一串字母,之後在這條宏定義後面的所有代碼裡,當我們打出了uint的時候,其實就是等同于unsigned int。

      uint i,j;

      其實就是相當于将i,j定義為無符号整型變量。
    2. 宏定義的後面是沒有分号的。
    3. 對于同一個字母組合,宏定義隻能定義一次,不能夠二次定義,否則會導緻重複定義的錯誤。

軟體調試模式

在Keil中,有個軟體調試模式(Keil仿真),裡面有很多有用的功能。

首先得打開

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

其中的12.0代表着筆者所設起來的晶振頻率值,前面說過,晶振頻率對代碼的執行時間有關系,為了達到現實中的效果,我們得将仿真模式中的晶振頻率調到和現實中的一樣。

之後點選右上角的放大鏡圖示,跳出軟體調試模式

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

在該模式下,我們可以設定斷點、單步、全速、進入某個函數内部運作程式,還可以檢視變量變化過程,模拟硬體I/O口電平狀态變化、檢視代碼執行時間等。

首先我們得熟悉調試按鈕

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算
從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

——将程式複位到主函數的最開始處,準備重新運作程式

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

——全速運作,運作程式時中間不停止

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

——停止全速運作

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

——進入子函數内部

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

——單步執行代碼,它不會進入子函數内部,會直接跳過

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

——跳出目前進入的函數,隻有進入子函數内部該按鈕才會激活

從無到有,學習單片機的第4天點亮第一個發光二極管22.3 while語句2.4 for語句及簡單延時語句2.5 Keil仿真及延時語句的精确計算

——程式運作之目前光标所在行

今天先這樣啦,明天正式了解該模式

繼續閱讀