注意51系列8位(bit)一個字節(jié),應用匯編語言簡潔高效。16位的處理器需要用0000 0000H 表示。16或32位以上,使用操作系統(tǒng)(WinCE、Linux等)更有效,可以利用大量的、底層的、專業(yè)化、標準化的面向控制的庫函數(shù)(如:API等)。高級語言具有對底層硬件的無關性,則可移植性好、可重用性好;高級語言描述控制更接近人的自然語言,可描述性好,表達力好。Linux的代碼與模塊的開放性、可剪裁性、自我構造等特點使其前景廣闊。
1.單個LED燈,單個按鍵
//C語言的頭文件
//預處理命令
#include
#define uchar unsigned char
#define uint unsigned int
//聲明變量
//延時子程序 ― 這是一個常用的模塊,可視為標準程序段,
程序說明:
While(條件語句) 與 for(條件語句) 單獨使用所表達的循環(huán),是在句首先執(zhí)行判斷,為真循環(huán),為假轉下一句執(zhí)行。其中語句的括號內為判斷條件語句。
Do-while合用,是需要對do的過程再進行一次判斷。While(條件語句)為真循環(huán),為假跳轉。while(1)表示高電平為真循環(huán)do,否則,低電平跳轉。由于P1.0 口為高電平結尾,因此,又回到do再循環(huán),無限反復。
#include
#include <> //預處理命令
void main(void)
{
unsigned int a;
do{
P1_0 = 0;
for (a=0; a<500; a++);
P1_0 = 1;
}
while(1);
}
2.多個LED燈,單個按鍵
對于多個LED燈(LED數(shù) < 8個)來說,在硬件連接方面、軟件編寫方面均沒有大的難點。按照單個LED的連接方式增加便可?刂瞥绦蚓帉懟旧弦彩侵貜托怨ぷ—用COPY簡單修改即可。
對于LED數(shù)> 8個且不能被8整除的需要用位操作指令。
對于LED數(shù)> 8個的情況,需要解決兩個方面的問題。一個是硬件的連接方法,一個是控制程序的編寫指令—用詞方法。硬件方面可以用單個或多個成組的LED多個或總線接口、單個接口擴展等。程序編寫則可以使用重復性工作、可以使用字節(jié)命令而摒棄位命令,使得程序簡潔、可讀性好、硬件運行效率高。
對于LED數(shù)= 8個或是8的倍數(shù)的情況,硬件方面可以用單個或多個成組的LED多個或總線接口、單個接口擴展等。程序編寫則可以使用重復性工作、可以使用字節(jié)操作指令而摒棄位操作指令,使得程序簡潔、可讀性好、硬件運行效率高。
#include < reg51.h >
#include <> //預處理命令
void main(void)
{
unsigned int a;
do{
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
for (a=0; a<500; a++);
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
}
while(1);
}
程序說明:
每個口用位賦值指令來開關P1口的各個LED?梢杂米止(jié)賦值指令一次性的開關8位P1口LED。
P1=0;
P1=1;
對于多燈的情況,可以使用多個數(shù)據(jù)口來進行系統(tǒng)設計(也可單口擴展),在圖2系統(tǒng)的基礎上,添加P3口為一個字節(jié)形式的輸出口。用LED組件的形式顯示輸出要求。
改造結果如圖3所示。
#include
#define uchar unsigned char
#define uint unsigned int
//聲明變量
//延時子程序
程序說明:
上面的單片機系統(tǒng)和C語言控制指令,很容易被更改為多口、多位的單鍵控制系統(tǒng)。圖3為多個LED燈-單個按鍵的運行結果與C語言。圖中對P2.0口采用了雙擲開關,實現(xiàn)P2.0口的兩種電平狀態(tài)。
3.LED循環(huán)問題(跑馬燈、流水燈):
每個口用位賦值指令來開關P1口的各個LED,用位指令賦值順序開關,實現(xiàn)跑馬燈。
先通過單個燈的閃爍來體驗C語言描述單口或多口(位)的高低電平變換。
n
n
n
#include
#include
#define uchar unsigned char
#define uint unsigned int
//聲明變量 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
//延時子程序
4.多數(shù)碼管
對于多個數(shù)碼管的情形,需要注意通過控制
#define LEDS 4
#include"reg51.h"
//led T選iffl1號
unsigned char code Select[]={0x01,0x02,0x04,0x08,0x10};//,0x20};
//unsigned char code Select[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,};
unsigned char code LED_CODES[]=
{ 0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,//0-9
0x88,0x83,0xC6,0xA1 ,0x86,0x8E,0xFF,0x0C,0x89,0x7F,0xBF//A,...F,空格,P,H,.,-
};
void main()
{
char i=0;
long int j;
long int n;
while(1)
{
P2=0;
P2=LED_CODES[n];
//P1=1;
P1=Select[i];
for(j=20000;j>0;j--);
i++;
if(i>4) i=0;
n++;
if(n>15) n=0;
}
}
5.單個LED燈,單個按鍵
//C語言的頭文件
#include
#include <> //預處理命令
void main(void)
{
unsigned int a;
do{
P1_0 = 0;
for (a=0; a<500; a++);
P1_0 = 1;
}
while(1);
}
程序說明:
While(條件語句) 與 for(條件語句) 單獨使用所表達的循環(huán),是在句首先執(zhí)行判斷,為真循環(huán),為假轉下一句執(zhí)行。其中語句的括號內為判斷條件語句。
Do-while合用,是需要對do的過程再進行一次判斷。While(條件語句)為真循環(huán),為假跳轉。while(1)表示高電平為真循環(huán)do,否則,低電平跳轉。由于P1.0 口為高電平結尾,因此,又回到do再循環(huán),無限反復。
6.多個LED燈,單個按鍵
#include
#include <> //預處理命令
void main(void)
{
unsigned int a;
do{
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
for (a=0; a<500; a++);
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
}
while(1);
}
程序說明:
每個口用位賦值指令來開關P1口的各個LED?梢杂米止(jié)賦值指令一次性的開關8位P1口LED。
P1=0;
P1=1;
#include
#include <> //預處理命令
void main(void)
{
unsigned int a;
do{
P1 = 0;
for (a=0; a<500; a++);
P = 1;
}
while(1);
}
l
每個口用位賦值指令來開關P1口的各個LED,用位指令賦值順序開關,實現(xiàn)跑馬燈。
#include
#include <> //預處理命令
void main(void)
{
unsigned int a;
do{
P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
for (a=0; a<500; a++);
P1_0 = 1;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
for (a=0; a<500; a++);
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 1;
for (a=0; a<500; a++);
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
for (a=0; a<500; a++);
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
}
while(1);
}
用循環(huán)語句實現(xiàn)跑馬燈,需要使用數(shù)組—表data。每個字節(jié)--8位來表達P1口各個位的電平高低,也就是亮與滅。
#include
#include <> //預處理命令
void main(void)
{
unsigned int a;
do{
P1 = 0;
for (a=0; a<500; a++);
P = 1;
}
while(1);
}