第二章 流水燈設計
§2.1 點亮第一個發光二極管
例2.1.1
◤
#include //52系列單片機頭文件
sbitled1=P1^0; //聲明單片機P1口的第一位
voidmain() //主函數
{
led1=0;
}
◣
例2.1.2
◤
#include
void mian()
{
P1=0xfe;
}
◣
★ reg52.h頭文件的作用
在代碼中引用頭文件,其實際意義就是將這個頭文件中的全部內容放到引用頭文件的位置處,免去我們每次編寫同類程序都要將頭文件中的語句重復編寫.
#include :編譯器先進入到軟件安裝文件夾處開始搜索這個頭文件
#include “reg52.h”:編譯器先進入當前工程所在文件夾處開始搜索這個頭文件
★ 特殊功能位定義sbit 定義sfr的某一位
§2.2 while語句
★ 格式:while(表達式)
{內部語句(內部可為空)}
特點:先判斷表達式,若不是0,即為真,那么執行內部語句。否則跳出while語句,執行后面的語句。
例2.2.1
◤
#include
void main()
{
P1=0xfe;
while(1);
}
◣
§2.3 for語句及簡單的延時語句
★ 格式:for(表達式1;表達式2;表達式3)
{語句(內部可為空)}
特點:求解一次表達式1。求解表達式2,若其值為真,則執行for中的語句,然后求解執行表示3,再回到求解表達式2開始一直循環。若不是真直接跳出,不執行表達式3。
例2.3.1 實驗板上第一個發光二極管以間隔1s亮滅閃動
◤
#include
#define uint unsignedint //宏定義
sbitled1=P1^0; //聲明單片機P1口的第一位
uint i,j;
voidmain() //主函數
{
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 新名稱原內容
§2.4 不帶參數函數的寫法及調用
voiddelay1s() //子函數體
{
uint i,j;
for(i=1000;i>0;i--) // i=1000即延時約1000毫秒
for(j=110;j>0;j--);
}
§2.5 帶參數函數的寫法及調用
void delayms(unsigned int xms)
{
uint i;j;
for(i=xms;i>0;i--) // i=xns即延時約xms毫秒
for(j=110;j>0;j--);
}
例2.5.1 完整程序,讓實驗板上第一個發光二極管亮200ms、滅800ms
◤
#include //52系列單片機頭文件
#define uint unsigned int //宏定義
sbit led1=P1^0; //聲明單片機P1口的第一位
voiddelayms(uint); //聲明子函數
voidmain() //主函數
{
while(1) //大循環
{
led1=0;
delayms(200); //延時200毫秒
led1=1;
delayms(800); //延時800毫秒
}
}
void delayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}
◣
§2.6 利用C51庫函數實現流水燈
★ 移位操作
(1):左移“<<”
每執行一次左移指令,被操作的數將最高位移入單片機PSW寄存器的CY位,CY位中原來的數丟棄,最低位補0,其他位一次向左移動一位。
(2):右移“>>”
每執行一次右移指令,被操作的數將最低位移入單片機PSW寄存器的CY位,CY位中原來的數丟棄,最高位補0,其他位一次向右移動一位。
(3):循環左移。
最高位移入最低位,其他位一次向左移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以實現循環左移,或直接利用C51庫中自帶的函數_crol_實現。
(4):循環右移。
最低位移入最高位,其他位一次向右移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以實現循環右移,或直接利用C51庫中自帶的函數_cror_實現。
★ PSW寄存器
PSW(Program StatusWord)全稱為程序狀態字標志寄存器。是一個8為寄存器,位于單片機片內的特殊功能寄存器區,字節地址為D0H,用來存放運算結果的一些特征,如有無進位、借位等。其每位的具體含義如下圖所示。

①CY—進位標志位。它表示運算是否有進位(或借位)。如果操作結果在最高位有進位(加法)或者借位(減法),則該位為1,否則為0。
②AC—輔助進位標志,又稱半進位標志。它指兩個8位運算低4位是否有半進位,即低4位相加(或相減)是否進位(或借位),如有AC為1,否則為0。
③ F0—由用戶使用的一個狀態標志位。可用軟件來使它置1或清0,也可由軟件來測試它,以控制程序的流向。
④ RS1,RS0,—4組工作寄存器區選擇控制位。在匯編語言中這兩位用來選擇4組工作寄存器區中的哪一組為當前工作寄存區。
⑤ OV—溢出標志位。反映帶符號數的運算結果是否有溢出。有溢出時,此位為1,否則為0。
⑥P—奇偶標志位。反映累加器ACC內容的奇偶性,如果ACC中的運算結果有偶數個1(如11001100B,其中有4個1),則P為0,否則P為1。
例2.6.1 利用C51自帶的庫函數_crol_(),以間隔500ms,在實驗板上實現流水燈程序
◤
#include //52系列單片機頭文件
#include //包含_crol_函數所在的頭文件
#define uint unsigned int //宏定義
#define uchar unsigned char
voiddelayms(uint); //聲明子函數
ucharaa; //定義一個變量,用來給P1口賦值
voidmain() //主函數
{
aa=0xfe; //賦初值11111110
while(1) //大循環
{
P1=aa; //先點亮第一個發光管
delayms(500); //延時500毫秒
aa=_crol_(aa,1); //將aa循環左移1位后再賦給aa
}
}
void delayms(uintxms)
{
uint i,j;
f
|