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