最近公司要做智能小車的改裝。筆者很是慚愧,渾渾噩噩在大學讀了4年的電子專業,到頭來單片機都沒玩過2次。
計劃花一段時間來玩單片機,從最簡單的LED入手。
該系列的學習筆記 開發環境是:
開發板:HC800EM3 感覺是一塊很不錯的開發板,提供的外部接口不少,板子還提供了單片機與ARM的“轉換接口”。
單片機型號:STC90C516RD+
ARM:STM32
開發工具:keil 3 (單片機版)
一、原理圖
由於網上的教程很多,對於keil的使用以及板子的電路分析 就不具體介紹了。(很慶幸,板子的原理圖多少還能看的懂,以後要惡補啊~)。
很容易理解,將1管腳置0,這燈D8會亮。
二、單片機延時程序的粗淺分析
爲了讓LED燈能夠具有多種效果(例如閃爍),必然要用到延時程序。部分網友說,單片機的延時程序精度不高,建議用定時器。但是畢竟是入門,之後再研究定時器吧。
下面的程序是在12MHZ 晶振源,延時1ms的c程序。
void delay_ms(void)
{
unsigned char a,b,c;
for(c = 1;c > 0; c--)
for(b = 142; b > 0; b--)
for(a = 2; a>0; a--);
}
1、機器週期
一個機器週期包含12個時鐘週期。時鐘週期的計算公式=(1/晶振頻率)秒。
例如,晶振爲12MHZ
該單片機的時鐘週期=(1/12)微秒,由此可以得到機器週期爲1us。
在這裏機器週期可以理解爲指令週期,就是單片機執行一條指令花費的時間。注:這裏的指令並不是C語言的指令,而且機器指令,可以通過反彙編查看。
2、反彙編
我們要計算一個程序執行的時間,畢竟查看其對應的反彙編代碼。這裏附上上面程序的反彙編代碼,keil 可以調出反彙編代碼查看窗口。
54: void delay(void)
55: {
56: unsigned char a,b,c;
57: for(c=1;c>0;c--)
C:0x0045 7F01 MOV R7,#0x01
58: for(b=142;b>0;b--)
C:0x0047 7E8E MOV R6,#0x8E
59: for(a=2;a>0;a--);
C:0x0049 7D02 MOV R5,#0x02
C:0x004B DDFE DJNZ R5,C:004B
C:0x004D DEFA DJNZ R6,C:0049
C:0x004F DFF6 DJNZ R7,C:0047
60: }
C:0x0051 22 RET
3、反彙編分析
下面列出了 delay_ms() 每條指令對應的機器週期。
這裏附上8051 的指令週期表下載地址。
指令 機器週期
C:0x0045 7F01 MOV R7,#0x01 1
C:0x0047 7E8E MOV R6,#0x8E 1
C:0x0049 7D02 MOV R5,#0x02 1
C:0x004B DDFE DJNZ R5,C:004B 2
C:0x004D DEFA DJNZ R6,C:0049 2
C:0x004F DFF6 DJNZ R7,C:0047 2
C:0x0051 22 RET 2
下面我們來計算 該程序 需要耗費多少時間。(不理解彙編指令的話,可以查看8051 指令週期表)
DJNZ R5,C:004B,執行該循環所用的機器週期數爲2*2=4。
從第三條指令到第五條指令的循環,執行該循環所用的機器週期數爲(1+2*2+2)*142
從第二條指令到第六條指令的循環,執行該循環所用的機器週期數爲(1+(1+2*2+2)*142+2)*1
delay_time = 1+(1+(1+2*2+2)*142+2)*1+2 秒
網上提供了一個很不錯的延時程序計算軟件。單片機小精靈軟件三、主程序
int main(void) { P2 = 0xFE; while(1) { delay_ms(100); //延時100ms P2 ^= (1 << 0); //取反 } return 0; }程序的執行效果是 D1每隔100ms會閃爍一次
有興趣的朋友,可以自己修改主程序,讓LED燈顯示不同的效果。單片機挺有趣的~~今天就先寫到這。
以上純屬個人學習筆記,如果哪裏錯了,希望提出。願和大家一起共同學習,一起進步。我的郵箱地址是:[email protected]