C51單片機學習手記之1:一盞閃爍
閑言碎語不要講,下面我就來說說這邁出的第一步,我從2010年才接觸到單片機,想想比別人晚了10多年,不過沒關系,只要有心學習,從0-1很難,但從1到100、1000、...可能就沒有那么麻煩了。主要要自學單片機原理、電子線路、匯編語言,C語言,如果你剛好學過,那就恭喜啦。
本文旨在介紹單片機入門的基礎知識,為和我一樣的新手提供一個交流的平臺。仿真所使用單片機為ATMEL公司的AT89C52,軟件為PROTEUS和KEIL;只提供原理圖和KEIL環(huán)境下的注釋,希望對廣大即將接觸單片機的人有所幫助,如果有錯誤歡迎回帖指出與本人交流或QQ聯(lián)系(93542746),共同進步。
一盞閃爍的LED
本人用Proteus畫得原理圖如下所示,該電路較簡單,在P1.7上接一個發(fā)光二極管,為防止電流過大燒壞二極管(LED的Imax=10mA),因此接了一個限流電阻。單片機31引腳(EA/Vpp)要接高電平,因為單片機訪問的是下載到單片機內(nèi)部的程序。
原理圖:
![點擊瀏覽下一頁](http://editerupload.eepw.com.cn/fetch/20140120/218118_1_1.jpg)
![點擊瀏覽下一頁](http://editerupload.eepw.com.cn/fetch/20140120/218118_1_1.jpg)
匯編程序:
org 000h
ajmp main
org 003h
main: mov P1,#07fh;7fh的二進制數(shù)為01111111,P1.7輸出低電平
acall del;調(diào)用延時子程序
mov p1,#0ffh;ffh的二進制數(shù)為11111111,P1.7輸出高電平
acall del
ajmp main
del: mov r5,#04h
del1: mov r6,#0ffh
del2: mov r7,#0ffh
del3: djnz r7,del3;r7中內(nèi)容減1后判斷,為0,向下執(zhí)行;不為0,執(zhí)行本身
djnz r6,del2
djnz r5,del1;共做04h*ffh*ffh次減1,即4*256*256次
ret
end
ajmp main
org 003h
main: mov P1,#07fh;7fh的二進制數(shù)為01111111,P1.7輸出低電平
acall del;調(diào)用延時子程序
mov p1,#0ffh;ffh的二進制數(shù)為11111111,P1.7輸出高電平
acall del
ajmp main
del: mov r5,#04h
del1: mov r6,#0ffh
del2: mov r7,#0ffh
del3: djnz r7,del3;r7中內(nèi)容減1后判斷,為0,向下執(zhí)行;不為0,執(zhí)行本身
djnz r6,del2
djnz r5,del1;共做04h*ffh*ffh次減1,即4*256*256次
ret
end
C程序:
#include reg52.h> //通用89C52頭文件
/*************************************************************
* IO定義 *
/*************************************************************/
sbit LED = P1 ^ 7;//定義P1.7為LED控制口,低電平LED亮
* IO定義 *
/*************************************************************/
sbit LED = P1 ^ 7;//定義P1.7為LED控制口,低電平LED亮
/*************************************************************
* 毫秒級延時函數(shù) *
調(diào)用函數(shù)必須給延時函數(shù)一個0~65535的延時值對應0MS到65535MS
備 注:應用于1T單片機時i600,應用于12T單片機時i125
/*************************************************************/
void Delay (unsigned int a){//需要輸入變量值0~65535
unsigned int i;
while( --a != 0){//i 從0加到125,CPU大概就耗時1毫秒
for(i = 0; i 125; i++);//空指令循環(huán)
}
}
/*************************************************************
* 主函數(shù) *
/*************************************************************/
void main (void){
* 毫秒級延時函數(shù) *
調(diào)用函數(shù)必須給延時函數(shù)一個0~65535的延時值對應0MS到65535MS
備 注:應用于1T單片機時i600,應用于12T單片機時i125
/*************************************************************/
void Delay (unsigned int a){//需要輸入變量值0~65535
unsigned int i;
while( --a != 0){//i 從0加到125,CPU大概就耗時1毫秒
for(i = 0; i 125; i++);//空指令循環(huán)
}
}
/*************************************************************
* 主函數(shù) *
/*************************************************************/
void main (void){
while(1){//無限循環(huán)以下程序
LED = ~LED;//取LED相反狀態(tài)
Delay(150);//延時150ms
LED = ~LED;//取LED相反狀態(tài)
Delay(150);//延時150ms
}//(0~65535之間)
}
}
評論