最近學習單片機就沒有以前那么快了,難度越來越大,程序越來越復雜,需要的技巧越來越多。有些東西真的只有在理解的基礎上背下來才行,只理解即使懂了也不會運用,只背那就更不行了,這兩者都有同時進行。所以需要更大的決心來面對這一切,不能半途而廢。
這幾天的學習主要總結了一下幾點: 一、就是步進電機的驅動,在接觸之前我以為步進電機只要給電就能轉動,接觸之后才發現這是不可能的,里面需要做很多的工作。如28BYJ-48型步進電機是四相八拍的步進電機,它的控制順序(反向就是反著讀)為: 
二、在程序里面,定時器的部分。當我們需要確定的值的時候,我們就可以直接對TH,TL進行賦值,但有的時候不知道賦值多少,因為是變動的,就需要根據自己需要的時間來進行賦值,例程如下: void ConfigTimer0(unsigned int ms){ unsigned long tmp; tmp=11059200/12; //定時器計數頻率 tmp=(tmp*ms)/1000;// 定時xms時間需要的計數值 tmp=65536-tmp;// 需要裝載的計數初值 tmp=tmp+18; //補償中斷響應延時造成的誤差 T0RH=(unsigned char)(tmp<<8); //定時器重載值拆分為高低字節 T0RL=(unsigned char)tmp; TMOD&=0xF0; //清零 T0 的控制位 TMOD|=0x01; 配置 T0 為模式 1 TH0=T0RH; //加載 T0 重載值 TL0=T0RL; ET0=1; TR0=1;}三、數碼管掃描函數算法改進 以前的 函數形式為; switch (i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break; default: break; } 改變后的函數形式: P1 = (P1 & 0xF8) | i; P0 = LedBuff; if (i < 5) i++; else i = 0; 其中,ADDR0,ADDR1,ADDR2是連在P1口的第三位,通過P1 = (P1 & 0xF8) | i;就可以直接改變第三位的值,所以非常簡便。 四、就是程序的模塊化,把各種功能的程序分別寫成獨立的模塊,然后在需要的程序里面進行調用,這樣可以讓程序看起來更加的簡單清晰,也便于后面的維護。 總之,寫程序真不是一件容易的事情,不僅需要足夠嚴謹的邏輯思維,還需要足夠的細心,在程序的編寫中可能一個小錯誤就可能導致得不到想要的結果,這種問題是經常遇到的。不過也要盡力去解決這些問題,增加自己的經驗,遇到什么樣的問題就可以直接對癥下藥,而不是丈二的和尚,摸不著頭腦,什么都不知道。
|