相信大多數的朋友學習單片機都是從51單片機開始的,51的學習教程也很多。可是這些教程也太亂了,關鍵部分總是一帶而過,而浪費了大量的篇幅講一些大家都知道的東西,讓學習者失去興趣。
本文以一個學習者的角度,根據自己的親曆來寫這篇51單片機的入門文章,主要将一些實用的東西。去掉那些純理論的,真正讓人人都能看懂,都能學會,都能感興趣。
本人也是單片機的門外漢,此文旨在抛磚引玉,隻适用于單片機門外漢小白,高手請直接無視,謝謝!
點亮第一個LED
要是LED點亮,就要使LED流過約2-10mA的電流,如圖1 ,就是要讓單片機的P1^0輸出一個低電平。
好,開始寫程序。
# include <reg52.h> //頭文件,必須調用,以井号開頭
sbit D1=P1^0; //給與LED負極相連的叫取個名字,這裡注意要以分号結尾
void main() //主函數,任何c語言程序必須有,而且隻能有一個,注意雙括号結尾
{ //主函數内容必須在大括号裡
D1=0; //讓P0^1輸出低電平
} //大括号結尾
好了,就這麼簡單,其實真正就一句話,其它的都是C語言的一個基本框架結構。D1=0.太簡單了吧?生産一個HEX文件燒錄到你的單片機裡看一下吧?
你也可以的吧,現在你就可以說:“我也可以玩單片機啦!”,有興趣,有信心了吧?
OK, Let’s go on!
二,讓我們簡單的程序再規範點吧
好,有了興趣和信心就好辦了,接着來!
上面寫的那個簡單的程序可以工作了吧?好,你已經成功了第一步了。可難道就這麼簡單?就一句D1=0就好了。也可以說,就這麼簡單的。可是這樣的程序雖然可以工作,但是給内行的人一看就知道是個菜鳥寫的,因為它并不完整。單片機執行了D1=0之後他要幹什麼呢?沒人給它指令!事實上,就算沒有給它指令它會跳到最前面的一條指令繼續執行的,我們隻有一條指令,所以他會一直執行。好了,為了規範,還是正式一些吧。
# include <reg52.h>
sbit D1=P1^0;
void main()
{
D1=0;
While(1); //就加上這麼一句
}
簡單講一下while語句。
語句格式:while(表達式)
{ 内部語句();
}
解釋一下,while其實也是一個判斷語句,先判斷括号裡的表達式是不是真的,然後再執行内部語句。那麼什麼樣是真的呢?不等于0就是真的!如果等于0了,就會跳出語句。内部語句如果是空的可以不寫,大括号也就可以省了,但是分号一定要記得寫喲!我們分析一下我們上面的這句while(1)吧。
我們寫的while(1);事實上可以寫為
While(1)
{ ()
};但是内部語句都是空的,所以可以寫成:while(1);
先判斷表達式,表達式是1.1不是0,所以是真,執行内部語句,内部語句為空,不要執行什麼。因為1永遠是1,不可能為0的,所以就不會跳出。因此就會一直執行此語句。
# include <reg52.h>
sbit D1=P1^0;
void main()
{
D1=0;
while(1); }
所以上面的程序就會讓LED一直點亮着。好了,點亮LED的程序就講到這裡了,大家應該都明白了吧!
三.讓LED閃起來
LED成功點亮了,是不是很興奮?玩了一會兒有沒有覺得好單調喲,LED一直亮着好沒意思!那麼好吧,follow me !讓我們的LED閃動起來!
分析:閃動,就是讓LED先亮起來,再熄滅,在亮起來。如此反複就形成了閃動了。
首先讓LED亮起來!這個大家會了吧?好,成功一半了。那麼再把它熄滅吧。怎麼才能讓LED熄滅呢?聰明的你一定會想到,LED亮起來是讓LED負極為低電位,那麼熄滅一定是高電位了。程序裡亮起來是寫D1=0,那麼熄滅應該是寫D1=1吧?完全正确!那麼我沒寫一個看看!
# include <reg52.h> //頭文件,必須調用,以井号開頭
sbit D1=P1^0; //給與LED負極相連的叫取個名字,這裡注意要以分号結尾
void main() //主函數,任何c語言程序必須有,而且隻能有一個,注意雙括号結尾
{ //主函數内容必須在大括号裡
D1=0; //讓P0^1輸出低電平
D1=1; //讓P0^1輸出高電平
while(1);
} //大括号結尾
寫好了,是這樣吧?先D1=0,LED亮起來,再LED=1,熄滅LED.好像是這樣,生産HEX文件燒錄到單片機看看吧。
咦?!怎麼了?怎麼還一樣啊!失敗了,為什麼這樣?
分析原因:為什麼呢?我們知道,人的眼睛看東西的時候也會有一個響應時間的,如果過快的話會看到的和實際的是有區别的,這就好比看電影,電影其實就是一幅幅的圖畫構成的,按照一定的速度播放我們就覺得是很流暢的動作,而不是一幅幅的圖畫。如果速度過慢的話我們看到的就是一幅幅的圖畫,那麼過快呢,像快進的畫面,再快呢,那麼我們将看到的是一片模糊什麼也看不到。
同理,我們的LED的亮與滅也要有一定的時間,那樣我們才能看到它是在閃動的。那麼是多長的時間呢?說真的,這個我還真不知道,我們就先随便寫一個時間看看呗!
好,知道了原因了。那麼動手繼續寫程序。
這裡就要用到了一個延時了,我們先用一個最簡單的延時來做吧。
For 語句 格式: for(表達式1;表達式2;表達式3)
{語句()
}
解釋一下,先求解表達式1,再求解表達式2,判斷一下,如果表達式2是真的就執行語句,再執行表達式3 。如果表達式2 是假的,則跳出語句,不再執行表達式3了。
我們開始試着寫看看。先照搬語句格式
for(a;a>0;a--)
{語句()
}
咦?那個a是什麼?
哦,解釋一下,這裡是定義了一個變量。既然定義了一個變量a,那麼我們一定首先要申明一下的,不然單片機也不知道的,不過它不會這樣問我,它不知道的話就直接罷工了。好那麼我就先告訴它一聲吧。“喂,單片機,我馬上要用到一個變量,我給它取名字叫a”
unsigned char a; //喂,單片機,我馬上要用到一個變量,我給它取名字叫a
for(a;a>0;a--)
{語句()
}
這樣對了嗎?呵呵,還不行的,還沒給變量賦值呢!再重寫
unsigned char a; //喂,單片機,我馬上要用到一個變量,我給它取名字叫a
for(a=100;a>0;a--)//給變量a賦值了
{語句()
}
這下一個差不多了,那麼語句寫什麼呢?
語句嘛,就是要看你想讓它做什麼了。我們這裡就是要它一直亮滅亮滅的循環。
哦,我知道了,那不就可以用錢買講過的while(1);不就可以了?
OK,沒錯,咱們就這麼幹!
unsigned char a; //喂,單片機,我馬上要用到一個變量,我給它取名字叫a!
for(a=100;a>0;a--)//給變量a賦值了
{while(1);
}
對了,現在我們寫一個完整的看看。
# include <reg52.h> //頭文件,必須調用,以井号開頭
sbit D1=P1^0; //給與LED負極相連的叫取個名字,這裡注意要以分号結尾
unsigned char a; //喂,單片機,我馬上要用到一個變量,我給它取名字叫a
void main() //主函數,任何c語言程序必須有,而且隻能有一個,注意雙括号結尾
{ //主函數内容必須在大括号裡
D1=0; //讓P0^1輸出低電平
For(a=100;a>0;a--)//給變量a賦值了
D1=1; //讓P0^1輸出高電平
For(a=100;a>0;a--)//給變量a賦值了
{while(1);
}
}
可以了嗎?
好了,生成HEX文件下載到單片機看看效果!
哦!好像還不行呀!
嗯。。。 。。。哦,應該是時間還是太短了。
那我們把100改成1000不就可以了嗎?
哦!這樣的思路是對的,但是不可以直接改的,因為char形的最大是255,超過255它就不認識了。我們來用for嵌套吧。就是用2個for語句。這樣的話我們就要定義2個變量了。寫成這樣:
unsigned char a,b ; //喂,單片機,我馬上要用到2個變量,我給它取名字叫a和b
for(a=100;a>0;a--)//給變量a賦值了 注意,這個語句後面不加分号
for (b=100;b>0:b--);//給變量b賦值了
好了,我們完整寫一遍吧!
# include <reg52.h> //頭文件,必須調用,以井号開頭
sbit D1=P1^0; //給與LED負極相連的叫取個名字,這裡注意要以分号結尾
unsigned char a,b; //喂,單片機,我馬上要用到2個變量,我給它取名字叫a和b
void main() //主函數,任何c語言程序必須有,而且隻能有一個,注意雙括号結尾
{ while(1) //主函數内容必須在大括号裡
{
D1=0; //讓P0^1輸出低電平
for(a=200;a>0;a--)//給變量a賦值了,判斷100>0是真的,執行a自減
for(b=200;b>0;b--);//給變量b賦值了,判斷100>0是真的,執行b自減
D1=1;
for(a=200;a>0;a--)//給變量a賦值了,判斷100>0是真的,執行a自減
for(b=200;b>0;b--);//給變量b賦值了,判斷100>0是真的,執行b自減
};
}OK了,現在下載到單片機吧!
至此我們已經熟練掌握了用單片機控制1個LED了。
下面再精簡一下程序。
# include <reg52.h> //頭文件,必須調用,以井号開頭
#define uchar unsigned char
void delay(uint ms)//延時函數
{
uchar a,b,c;
for(a=200;a>0;a--)//給變量a賦值了,判斷100>0是真的,執行a自減
for(b=200;b>0;b--);//給變量b賦值了,判斷100>0是真的,執行b自減
}
sbit D1=P1^0; //給與LED負極相連的叫取個名字,這裡注意要以分号結尾
void main() //主函數,任何c語言程序必須有,而且隻能有一個,注意雙括号結尾
{ while(1) //主函數内容必須在大括号裡
{
D1=0; //讓P0^1輸出低電平
delay();
D1=1;
delay();
};
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!