tft每日頭條

 > 圖文

 > 51單片機學習資料整合大全

51單片機學習資料整合大全

圖文 更新时间:2024-11-24 20:34:17

相信大多數的朋友學習單片機都是從51單片機開始的,51的學習教程也很多。可是這些教程也太亂了,關鍵部分總是一帶而過,而浪費了大量的篇幅講一些大家都知道的東西,讓學習者失去興趣。

本文以一個學習者的角度,根據自己的親曆來寫這篇51單片機的入門文章,主要将一些實用的東西。去掉那些純理論的,真正讓人人都能看懂,都能學會,都能感興趣。

本人也是單片機的門外漢,此文旨在抛磚引玉,隻适用于單片機門外漢小白,高手請直接無視,謝謝!

  1. 點亮第一個LED

要是LED點亮,就要使LED流過約2-10mA的電流,如圖1 ,就是要讓單片機的P1^0輸出一個低電平。

51單片機學習資料整合大全(和我一起入門51單片機)1

51單片機學習資料整合大全(和我一起入門51單片機)2

好,開始寫程序。

# 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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved