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