學了這么久還是不知道每一行的C語言代碼什么意思,每次都要翻資料看意思(苦惱呀!要背一大堆的函數(shù)和格式,看別人的代碼寫的都不知道什么意思的你要怎么學好單片機呢?)
for.jpg (594.54 KB, 下載次數(shù): 70)
下載附件
2022-4-30 18:02 上傳
單片機仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (11.94 KB, 下載次數(shù): 61)
下載附件
2022-5-1 03:40 上傳
單片機C語言源程序如下:
- #include <REGX52.H> //頭文件 【正式語句】
- #define uint unsigned int //宏定義 uint 【無符號整型(范圍:0~65535)】
- sbit led=P1^0; // 聲明單片機P1口(led) 【正式語句】 在Pro仿真中:LED-YELLOW燈泡腳連接P1.0口
- uint i,j; //定義兩個(無符號整型)變量 ,分別為 i ,j
- void main() //主函數(shù) 【正式語句】
- {
- while(1) //大循環(huán)【正式語句】
- {
- led=0; //點亮第一個發(fā)光二極管 【正式語句】
- for(i=2;i>0;i--) //延時 【延時語句】 2*6000=12000
- for(j=6000;j>0;j--);
- led=1; //關(guān)閉第一個發(fā)光二極管 【正式語句】
- for(i=6;i>0;i--) //延時 【延時語句】 6*126=756
- for(j=126;j>0;j--);
- }
- }
- /********************************************************
- 知識點: C語言中注釋寫法
- 在C語言中.注釋有兩種解法:
- (1)//..... 兩個斜杠后面跟著的為注釋語句。這個寫法只能注釋一行, 當換行時,又必須在新行上重新寫兩個斜杠。
- (2)/*.....*/ /* 一杠與星號結(jié)合使用,這種寫法可以注釋任意行。其斜杠星號與星號斜杠之間的所有文字都作為注釋。
- 所有注釋都不參與程序編譯。在編譯過程中會自動刪去注釋,注釋的目是為了我們讀程序的方便。一般在編寫較大的程序時分段
- 加入注釋,這樣當回過頭來再次讀程序時,因為有注釋,其代碼的意義變一目了然了。若無注釋,是不是特別費力地將程序重新閱
- 讀一遍方可知道之后代碼含義。
- *********************************************************/
- /*************************************************************************************************************
- 知識點:#define宏定義
- 格式:#define 新名稱 原來內(nèi)容
- 注意后面沒有分號,#define命令用它后面的第一個字母組合代替該字母組合后面的所有內(nèi)容,也就是相當于我們給“原內(nèi)容”
- 重新起一個比較簡單的“新名稱” 方便以后在程序中直接寫簡短的新名稱,而不必每次都寫繁瑣的原內(nèi)容。
- 上例中我們使用宏定義的目的就是將unsigned int用uint代替,在上面的程序中可以看到,當我們需要定義unsigned int型
- 變量時,并沒有寫“unsigned int i,j;”取而代之的是“uint i,j;在一個程序代碼中,只要宏定義過一次,若定義兩次,那么在整
- 個代碼中都可以直接使用它的“新名稱”。注意,對同一個內(nèi)容,宏定義只能定義一次,若定義兩次,將會出現(xiàn)重復定義的錯誤提示。
-
- 這里使用while(1){}語句,因為while里的表達式是1,永遠為真,所以程序?qū)⒂肋h循環(huán)執(zhí)行這個大括號中的所有語句。單片機
- 在執(zhí)行指令的時候是按代碼從上向下順序執(zhí)行的,我們分析while大括號里的語句含義是“點亮燈 → 延時一會兒 → 關(guān)閉燈 → 再延時
- 一會兒 → 點亮燈 → 延時一會兒················”如此循環(huán)下去,當我們把程序下載到實驗板上便可看到小燈亮滅閃動的效果。
- 這個延時語句究竟是延長多少時間呢?到(工程 → 為目標’目標1‘設(shè)置選項)對話框,在【Target】標簽下的【Xtal(MHz):】后
- 面將原來的默認值修改為單片機實驗板上的晶振頻率值 11.0592MHz 。
- 編譯程序時,計算代碼執(zhí)行時間與該數(shù)值有關(guān),既然我們要模擬真實時間,那么軟件模擬運行速度就要與實際硬件一一對應(yīng)。
- *************************************************************************************************************/
- /**************************************************************************************************************
- 知識點:for語句【及簡單延時語句】
- 格式:for(表達式1;表達式2;表達式3)
- {語句(內(nèi)部可為空)}
- 執(zhí)行過程:
- 第一步:求解一次表達式1.
- 第二步:求解一次表達式2.若其值為真(非0即為真),則執(zhí)行for中語句,然后執(zhí)行第三步;否則結(jié)束for語句,直接跳出,不再執(zhí)行第三步。
- 第三步:求解一次表達式3
- 第四步:跳到第二步重復執(zhí)行。
- 需要注意的是,三個表達式之間必須用分號隔開。
- 利用for語句和while語句寫簡單的延時語句,下面用for語句寫一個簡單的延時語句 ,并進一步了解for語句的用法。
- unsigned char i; //沒簡化的字符型變量(i)
- for(i=2;i>0;i--);
- 上面這兩句,首先定義一個無符號字符型變量i ,然后執(zhí)行for語句,表達式1是給i賦一個初值2,表達式2是判斷i大于0是真還是假,表達
- 式3是i自減1,我們分析執(zhí)行過程:
- 第1步,給i賦初值2,此時i=2。
- 第2步,因為2>0條件成立,所以其值為真,那么執(zhí)行一次for中的語句,因為for內(nèi)部語句為空,即什么也不執(zhí)行。
- 第3步, i自減1,即i=2-1=1.
- 第4步, 跳到第2步,因為1>0條件成立所以其為真,那么執(zhí)行一次for中的語句,因為for內(nèi)部語句為空,即什么也不執(zhí)行。
- 第5步,i自減1,即i=1-1=0.
- 第6步,跳到第2步,因為0>0條件不成立,所以其值為假,那么結(jié)束for語句,直接跳出。
- 以上六步,這個for語句就執(zhí)行完了,單片機在執(zhí)行這個for語句的時候是需要時間的,上面i的初值較小,當給i賦的初值越大,它執(zhí)行所
- 需的時間就越長,因此就可以利用單片機執(zhí)行這個for語句的時間來作為一個簡單廷時語句。
- 要寫一個延時比較長的語句時,因為在這里i是一個字符型變量,它的最大值為255,當你給它賦一個比最大值都大的數(shù)時,編譯器自然就
- 出錯誤了,每次給變量賦初值時,都要首先考慮變量類型,然后根據(jù)變量類型賦一個合理的值。
- 怎樣才能寫出長時間的延時語句呢?就要用到for語句的嵌套。
- unsigned char i,j; //沒簡化的字符型變量 定義:(i和j)
- for(i=100;i>0;i--);
- for(j=200;j>0;j--);
- 上面這個例子是for語句的兩層嵌套,第一個for后面沒有分號,那么編譯器默認第二個for語句就是第一個for語句的內(nèi)部語句,而第二個for語
- 句內(nèi)部語句為空,程序在執(zhí)行時,第一個for語句中的i每減一次,第二個for語句便執(zhí)行200次,因此上面這個例子便相當于共執(zhí)行了100X200次
- for語句。通過這種嵌套我們便可以寫出比較長時間的延時語句,我們還可以進行3層、4層嵌套來増加時間,或是改變變量類型,將變量初值再
- 增大也可以増加執(zhí)行時間。
- 這種for語句的延時時間到底有沒有精確算法呢?在c語句中這種延時語句不好算出它的精確時間,需要計算非常精確的延時時間,就要利用單
- 片機的內(nèi)部的定時器來延時,它的精度非常高,可以精確到微秒級。而一般簡單延時語句實際上并不需要太精確.
- **************************************************************************************************************/
復制代碼 Keil代碼與Proteus仿真下載:
for語句入門2.rar
(69.44 KB, 下載次數(shù): 21)
2022-4-30 18:08 上傳
點擊文件名下載附件
if語句 下載積分: 黑幣 -5
|