目錄
名稱:獨立按鍵控制直流電機調速
內容:對應的電機接口需用杜邦線連接到uln2003電機控制端;
使用5V-12V 小功率電機皆可 2個按鍵分別加速和減速;
采用8個8段數碼管的后兩位顯示0~10級速度;
P3連接按鍵;P0連接8x八段數碼管,P22段碼鎖存,P23位碼鎖存;P1.1連接ULN2003的一個輸入;直流電機端連接ULN2003對應的輸出,另一端連接VCC。
本文主要目的不是介紹如何實現功能,而是如何做一種方便復用和理解的框架。如下圖左USER文件中的文件屬於最高層(離用戶最近);FUNC文件夾中的文件屬於功能層(用戶層文件可以調用功能層實現的各種功能,同時功能層內部也有少量的相互調用);INTE文件夾主要是中斷層(本來想把中斷單獨拿出來,但是中斷子程序和用戶層交叉太多,所以僅在這里實現中斷初始化函數,中斷子程序依然放在main.c文件中)
注:注意main.c中的引用!(因為在keil里的文件夾和外部並沒有直接對應關系,外部是我手動建的)
--> 4.1 delay說明:對外提供兩個延時函數(在I2C、按鍵消抖等地方要用到)
1 #include<reg52.h> 2 3 void DelayUs2x(unsigned char t);//us級延時函數聲明 4 void DelayMs(unsigned char t); //ms級延時
--> 4.2 key8說明:對外提供按鍵掃描函數,如果有按鍵按下則返回對應的鍵值(這是8按鍵的,不是4x4的)
1 #include<reg52.h> 2 3 #define KeyPort P3 4 5 unsigned char KeyScan(void);//按鍵掃描函數,返回掃描鍵值
應用示例:如下KeyScan()被調用來檢測按鍵實現按鍵控制功能~
--> 4.3 led8說明:對外提供在8x八段數碼管顯示功能(這里要做特殊處理)
1 #include<reg52.h> 2 3 #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換 4 sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存 5 sbit LATCH2=P2^3;// 位鎖存 6 7 void Display(unsigned char FirstBit,unsigned char Num);
應用示例:如下把要顯示的2位的整數PWN_ON顯示在8X八段數碼管上。在1的地方要分別取PWN_ON的十位和個位然后通過DuanMa轉換為相應的數碼管燈的顯示數值;然后在中斷或具有頻繁周期刷新的函數體內調用display函數進行顯示(display的第一個參數是選擇8x八段數碼管的第幾位開始顯示,0表示從第1位開始;第二個參數是說明要顯示幾位)
特別注意:這里的display(6,2)意思是把一個兩位整數顯示在8個數碼管的后兩個上,而給TempData賦值並不是TempData[6]和TempData[7]!
今后便可采用相同的方法不斷擴充FUNC層,當遇到具體問題可以在main和中斷中做調整。
https://github.com/beautifulzzzz/stc89c51-or-stc89c52