前言:
為未來拼搏的第n天,從單片機開始。
為什么要學習單片機呢,單片機的工作涉及范圍及其廣如:消費電子,游戲機·音響;
工業控制:機器人控制;醫療設備,通信設備,物聯網等等。
前途大大滴!! 好好學吧。
本章節我們要了解的是51單片機。51單片機也是單片機中最簡單的,最基礎的,最好理解的。
PS 在學習單片機前還是要有一定的c語言基礎的,模電數電可以邊學單片機邊學習,問題不大
一·原理圖
學習51單片機需要了解他的原理圖,才能更好的理解。
這是各個功能 模塊的原理圖
這是板子的真實摸樣還有個lcd屏幕沒有安裝,也就是顯示屏
引腳示意圖
- 電源引腳:
- VCC(引腳 40):主電源輸入端,提供 + 5V 電壓。
- GND(引腳 20):接地端。
- I/O 端口引腳:
- P0.0-P0.7(引腳 32-39):雙功能端口,可作為通用 I/O 端口或地址 / 數據總線使用。當用作地址 / 數據總線時,需要外接上拉電阻。
- P1.0-P1.7(引腳 1-8):通用雙向 I/O 端口,每個引腳均可獨立配置為輸入或輸出,內部提供上拉電阻。
- P2.0-P2.7(引腳 21-28):通用雙向 I/O 端口,也可用于擴展外部存儲器的高 8 位地址。
- P3.0-P3.7(引腳 10-17):通用雙向 I/O 端口,同時具備復用功能,如 P3.0 為 RXD 串行輸入端,P3.1 為 TXD 串行輸出端,P3.2 為 INT0 外部中斷請求 0 輸入等。
- 控制引腳:
- RST(引腳 9):復位輸入端,高電平有效,保持兩個機器周期的高電平可使單片機復位。
- ALE/PSEN(引腳 29):地址鎖存允許 / 程序存儲使能信號,訪問外部存儲器時,ALE 用于鎖存地址的低字節,PSEN 用于選通外部程序存儲器。
- EA/VPP(引腳 30):訪問外部程序存儲器信號,當 EA=1 時,優先訪問內部程序存儲器;當 EA=0 時,僅訪問外部程序存儲器。在 Flash 編程期間,此引腳也用于施加 12V 編程電源(VPP)。
- 時鐘引腳:
- XTAL1(引腳 19):反相振蕩放大器的輸入及內部時鐘工作電路的輸入。
- XTAL2(引腳 18):反相振蕩放大器的輸出,外接晶振和電容構成時鐘電路。
需要軟件
? ?編程軟件:Keil C51 是常用的集成開發環境,它提供了 C 編譯器、宏匯編、鏈接器、庫管理和仿真調試器等完整的開發方案,可以方便地進行單片機的程序編寫、編譯和調試,支持 C 語言和匯編語言編程。
燒錄軟件:STC-ISP?它們都能實現將編譯好的程序燒錄到芯片中。
芯片推薦STC89C52。結構經典、資料海量、成本極低,是理解底層原理的理想起點。
入門內容
led燈的點亮 閃爍?獨立按鍵控制,流水燈。
點亮:
#include <REGX52.H>void main()
{P2=0x5d;while(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;Delay500ms();//Delay500us();P2=0xFF;Delay500ms();}}
這里添加了延遲代碼delay
這個函數自己可以編輯,也可以由stc提供
如下:
流水燈:
#include <REGX52.H>void Delay1ms(unsigned int xms) //@12.000MHz
{unsigned char i, j;while (xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main()
{while(1){P2=0xFE;Delay1ms(500);P2=0xFD;Delay1ms(500);P2=0xFC;Delay1ms(500);P2=0xFB;Delay1ms(500);P2=0xF7;//1110 1111Delay1ms(500);P2=0xEF;Delay1ms(500);P2=0xDF;Delay1ms(500);P2=0xCF;Delay1ms(500);P2=0xBF;Delay1ms(500);P2=0x7F;Delay1ms(500);}}
按鍵控制:
#include <REGX52.H>void main()
{while(1){if (P3_0==0 || P3_1==0)//當按下鍵后亮燈 松開后就熄滅{P2_0=0;//亮}else//按下其他鍵無反應{P2_0=1;//滅}}
}
按鍵控制亮滅狀態:
#include <REGX52.H> // 包含STC89C52寄存器定義頭文件// 延時函數:精確延時x毫秒(12MHz晶振)
void Delay1ms(unsigned int xms)
{unsigned char i, j;while (xms){i = 2;j = 239;do{while (--j); // 內層循環延時} while (--i); // 外層循環延時xms--;}
}// 主函數
void main()
{while(1) // 無限循環{if(P3_0 == 0) // 檢測按鍵按下(P3.0低電平){ Delay1ms(30); // 按下消抖延時30mswhile(P3_0 == 0); // 等待按鍵釋放(阻塞式)Delay1ms(20); // 釋放消抖延時20msP2_0 = ~P2_0; // LED狀態翻轉(P2.0取反)}}
}
~是取反符號 狀態取反
數碼管顯示
#include <REGX52.H>unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39};
void shuma(unsigned char Loction,Number )
{switch(Loction){case 1: P2_4=1;P2_3=1;P2_2=1;break;case 2: P2_4=1;P2_3=1;P2_2=0;break;case 3: P2_4=1;P2_3=0;P2_2=1;break;case 4: P2_4=1;P2_3=0;P2_2=0;break;case 5: P2_4=0;P2_3=1;P2_2=1;break;case 6: P2_4=0;P2_3=1;P2_2=0;break;case 7: P2_4=0;P2_3=0;P2_2=1;break;case 8: P2_4=0;P2_3=0;P2_2=0;break;}P0=table[Number];
}void main()
{shuma(3,3);while(1){}
}
可以更改shuma中的數子,位置,顯示數字。