點亮第一個發光二極管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語言中已經大緻了解了,這裡就在強調幾點
- C語言中一般把“0”視為“假”,“非0”視為“真”,while的判斷條件即“()”裡面如果最後的結果是0或者判斷為假,則不再執行while中的語句。
- while的内部語句可以為空,就是“{}”裡面的東西,有時候甚至這個花括号都可以省略。但是要注意,如果花括号省略了,必須要在“()”後面加一個分号,例如
,否則系統會自動把緊跟着while的第一行代碼當成while中的内容。while(1);
- 如果while的判斷語句中隻有一個1,那麼單片機将一直執行while的内部語句
如圖,這個程式中,我們先判斷while的表達式,這裡是1,是以執行内部語句while(1) { P1=0xfe; }
P1=0xfe;
,執行完了再次判斷表達式,還是是1,是以再次執行内部語句。
這裡可以保持二極管一直發光,之前的
也可以保持,但這裡的單片機其實還在一直工作,一直在判斷while是真是假,前面的程式執行了一次後,單片機就沒有工作了。單片機隻要它有電,有晶振在起振,就不會停止工作。P1^0=0
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--);
}
}
- 宏定義#define
- #define指令用它後面的第一個字母組合代替該字母組合後面的所有内容,這裡就是用uint代替了unsigned int這一串字母,之後在這條宏定義後面的所有代碼裡,當我們打出了uint的時候,其實就是等同于unsigned int。
其實就是相當于将i,j定義為無符号整型變量。uint i,j;
- 宏定義的後面是沒有分号的。
- 對于同一個字母組合,宏定義隻能定義一次,不能夠二次定義,否則會導緻重複定義的錯誤。
- #define指令用它後面的第一個字母組合代替該字母組合後面的所有内容,這裡就是用uint代替了unsigned int這一串字母,之後在這條宏定義後面的所有代碼裡,當我們打出了uint的時候,其實就是等同于unsigned int。
軟體調試模式
在Keil中,有個軟體調試模式(Keil仿真),裡面有很多有用的功能。
首先得打開
其中的12.0代表着筆者所設起來的晶振頻率值,前面說過,晶振頻率對代碼的執行時間有關系,為了達到現實中的效果,我們得将仿真模式中的晶振頻率調到和現實中的一樣。
之後點選右上角的放大鏡圖示,跳出軟體調試模式
在該模式下,我們可以設定斷點、單步、全速、進入某個函數内部運作程式,還可以檢視變量變化過程,模拟硬體I/O口電平狀态變化、檢視代碼執行時間等。
首先我們得熟悉調試按鈕
——将程式複位到主函數的最開始處,準備重新運作程式
——全速運作,運作程式時中間不停止
——停止全速運作
——進入子函數内部
——單步執行代碼,它不會進入子函數内部,會直接跳過
——跳出目前進入的函數,隻有進入子函數内部該按鈕才會激活
——程式運作之目前光标所在行
今天先這樣啦,明天正式了解該模式