?? 專欄簡(jiǎn)介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過(guò)程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。
?? 專欄適用人群 :適用于想要從零基礎(chǔ)開(kāi)始學(xué)習(xí)入門單片機(jī),且有一定C語(yǔ)言基礎(chǔ)的的童鞋。
??專欄目標(biāo):實(shí)現(xiàn)從零基礎(chǔ)入門51單片機(jī)和STM32單片機(jī),力求在玩好單片機(jī)的同時(shí),能夠了解一些計(jì)算機(jī)的基本概念,了解電路及其元器件的基本理論等。?? 專欄主要內(nèi)容: 主要學(xué)習(xí)51單片機(jī)的功能、各個(gè)模塊、單片機(jī)的外設(shè)、驅(qū)動(dòng)等,最終玩好單片機(jī)和單片機(jī)的外設(shè),全程手敲代碼,實(shí)現(xiàn)我們所要實(shí)現(xiàn)的功能。
?? 專欄說(shuō)明 :如果文章知識(shí)點(diǎn)有錯(cuò)誤的地方,歡迎大家隨時(shí)在文章下面評(píng)論,我會(huì)第一時(shí)間改正。讓我們一起學(xué)習(xí),一起進(jìn)步。
??專欄主頁(yè):http://t.csdn.cn/HCD8v
本學(xué)習(xí)過(guò)程參考:https://space.bilibili.com/383400717
單片機(jī)安裝軟件、各種資料以及源碼的路徑:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取碼:gdzf
本節(jié)目標(biāo)
本節(jié)會(huì)學(xué)習(xí)如何利用51單片機(jī)去控制開(kāi)發(fā)板上的LED。LED模塊在開(kāi)發(fā)板上的位置如下圖所示:圖中紅框框出來(lái)的就是LED模塊;
本節(jié)將寫三個(gè)程序代碼,分別實(shí)現(xiàn)的功能是:
第一個(gè)代碼點(diǎn)亮一個(gè)LED:
第二個(gè)代碼實(shí)現(xiàn)的功能是讓第一個(gè)燈以1s為周期閃爍:
第三個(gè)代碼實(shí)現(xiàn)的功能是D1-D88個(gè)燈循環(huán)閃爍的流水燈:
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-424274.html
一、準(zhǔn)備工作
1.1 LED原理介紹(很重要?。。。。?/h3>
LED燈在開(kāi)發(fā)板上的連接方式:
請(qǐng)見(jiàn)51單片機(jī)入門教程資料\開(kāi)發(fā)板資料包\HC6800-ES V2.0\開(kāi)發(fā)板原理圖\HC6800-ES+V2.0+新版.pdf
按照左邊紅色的引腳圖,結(jié)合pdf文件中的MCU引腳圖總覽可以看到,LED是大致接在MCU的右下角位置的,如下圖所示:
LED具體結(jié)構(gòu)如下:
單片機(jī)的P2口(P20-P27)都對(duì)應(yīng)著TTL電平,即高電平5v低電平0v,例如當(dāng)P20口輸出低電平時(shí),則D1燈點(diǎn)亮,P20口輸出高電平時(shí),D1燈不亮;所以控制單片機(jī)接口的高低電平輸出,即可實(shí)現(xiàn)對(duì)D1等LED燈的控制;那么如何實(shí)現(xiàn)對(duì)P20口高低電平的控制呢?
以P2口為例,MCU中的結(jié)構(gòu)如上圖所示,CPU和寄存器相連,寄存器和硬件i/o口相連;寄存器寄存器8個(gè)為一組,分別對(duì)應(yīng)著硬件i/o口的P20-P27,最下面的低地址寄存器對(duì)應(yīng)著P20口,依次類推,最上面的高地址寄存器對(duì)應(yīng)著P27口;每個(gè)寄存器中存放1和0兩個(gè)數(shù)字,如果寄存器中放的是數(shù)字1,那么對(duì)應(yīng)的i/o口就會(huì)輸出高電平,反之,如果寄存器中放的是數(shù)字0,那么對(duì)應(yīng)的i/o口就會(huì)輸出低電平;所以i/o口輸出高電平還是低電平,就由CPU向寄存器中寫入的數(shù)字決定;例如,如果寄存器中存放的數(shù)字是1111 1110(從左往右是高地址->低地址,即對(duì)應(yīng)著上圖中的寄存器從上到下) ,即說(shuō)明P27口到P21口都是1即高電平,P20口對(duì)應(yīng)的是低電平,則只有P20口對(duì)應(yīng)的LED燈會(huì)亮。
即CPU通過(guò)配置寄存器中的1和0,實(shí)現(xiàn)對(duì)硬件電路i/o口的高低電平配置
。
1.2 建立keil工程并添加源文件
打開(kāi)keil5軟件,新建一個(gè)工程:
選擇路徑
然后彈出窗口讓我們選擇單片機(jī)的型號(hào),找到我們單片機(jī)的型號(hào),比如本文用的是STC89C52,但是keil軟件里對(duì)中國(guó)生產(chǎn)的單片機(jī)不太友好,找不到該型號(hào),因此可以選擇Atmel里的AT89C5代替:
是否自動(dòng)添加啟動(dòng)文件,選擇否即可:
此時(shí)我們的工程就建好了,其中Source Group 1就是我們編寫代碼的文件夾:
在Source Group 1上面右鍵,添加代碼文件(我們選擇C語(yǔ)言文件),并起名為main:
然后就可以對(duì)main.c進(jìn)行編寫,編譯,構(gòu)建等操作了:
一般我們寫好代碼之后都會(huì)點(diǎn)擊build進(jìn)行構(gòu)建,如下例子,我們寫個(gè)main函數(shù),進(jìn)行構(gòu)建:
會(huì)發(fā)現(xiàn)構(gòu)建結(jié)果為0錯(cuò)誤0警告。
1.3 選擇生成hex文件
要想將程序下載到單片機(jī)中,必須生成HEX文件,配置過(guò)程如下步驟1 2 3 4所示:
二、點(diǎn)亮一個(gè)LED
有了1.1 LED介紹
節(jié)的基礎(chǔ),我們可以知道操作P2口對(duì)應(yīng)的寄存器即可實(shí)現(xiàn)對(duì)P2口高低電平的控制,進(jìn)而控制P2口對(duì)應(yīng)的LED燈的亮和滅,在main.c中輸入以下代碼:
其中P2定義在REGX52.H
頭文件中,代表P2口,0xFE代表16進(jìn)制,換算成2進(jìn)制就是1111 1110;然后將這段代碼build,會(huì)發(fā)現(xiàn)0錯(cuò)誤0警告:
#include <REGX52.H>
void main()
{
P2=0xFE; //1111 1110
while(1)
{
}
}
然后將此段代碼下載到單片機(jī)中,打開(kāi)STC-ISP軟件,單片機(jī)型號(hào)選擇STC89C52系列下面的STC89C52,如下圖
串口號(hào)選擇如下:
然后“打開(kāi)程序文件”,選擇剛剛我們建好的工程下面build生成的的Project.hex文件,打開(kāi)->下載/編程:
然后將開(kāi)發(fā)板上的開(kāi)關(guān)按兩次,即可發(fā)現(xiàn)第一個(gè)LED燈亮了。
三、LED閃爍
源碼路徑:51單片機(jī)入門教程資料\課件及程序源碼\程序源碼\KeilProject\2-2 LED閃爍
按照上面1.2和1.3新建另一個(gè)工程,可以起名為2-2LED燈閃爍,并新增源文件。源文件中輸入以下代碼:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE; //1111 1110
Delay500ms();
P2=0xFF; //1111 1111
Delay500ms();
}
}
下面解釋一下代碼的含義:
首先P2=0xFE; //1111 1110
,通過(guò)上面的學(xué)習(xí),可以得知該代碼可以控制第一個(gè)LED亮。Delay500ms()
函數(shù)的功能是延時(shí)500ms,至于這個(gè)函數(shù)是如何生成的,下面會(huì)講解。P2=0xFF
可以控制第一個(gè)LED亮;
所以代碼最終的效果是,第一個(gè)LED燈先亮,500ms后滅,500ms后再亮,一直循環(huán)。
那Delay500ms()
函數(shù)是如何實(shí)現(xiàn)的呢?過(guò)程如下:
在STC-ISP工具中,找到“軟件延時(shí)計(jì)算器”,按照下圖分別設(shè)置系統(tǒng)頻率、定時(shí)長(zhǎng)度和8051指令集,然后點(diǎn)復(fù)制代碼,在Keil5中粘貼即可。
需要注意的是,Delay500ms()
中包含_nop_()
函數(shù),該函數(shù)是包含在INTRINS.H
頭文件中的,所以在main.c文件中要包含該頭文件。
代碼寫好后,點(diǎn)擊rebuild,然后參考第一節(jié)的過(guò)程,將寫好的程序下載到單片機(jī)上,重新開(kāi)關(guān)兩次開(kāi)發(fā)板的開(kāi)關(guān),即可看到LED燈閃爍的效果。
四、LED流水燈
源碼路徑:51單片機(jī)入門教程資料\課件及程序源碼\程序源碼\KeilProject\2-3 LED流水燈
和 51單片機(jī)入門教程資料\課件及程序源碼\程序源碼\KeilProject\2-4 LED流水燈Plus
和第二節(jié)類似,重新建立工程,將main.c文件換成以下代碼,提供兩種方法:
方法1:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;//1111 1110
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
}
方法2:
#include <REGX52.H>
void Delay1ms(unsigned int xms); //@12.000MHz
void main()
{
while(1)
{
P2=0xFE;//1111 1110
Delay1ms(1000);
P2=0xFD;//1111 1101
Delay1ms(1000);
P2=0xFB;//1111 1011
Delay1ms(100);
P2=0xF7;//1111 0111
Delay1ms(100);
P2=0xEF;//1110 1111
Delay1ms(100);
P2=0xDF;//1101 1111
Delay1ms(100);
P2=0xBF;//1011 1111
Delay1ms(100);
P2=0x7F;//0111 1111
Delay1ms(100);
}
}
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
兩種代碼都和第二節(jié)種的代碼類似,就不一行一行的講解了。如果有不理解的地方歡迎留言討論。同樣的過(guò)程,下載到單片機(jī)中即可看到流水燈的效果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-424274.html
到了這里,關(guān)于51單片機(jī)(二)成功點(diǎn)亮LED的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!