以下是我在做畢設(shè)寫代碼時(shí)候的一些心得體會(huì)
(1)旋轉(zhuǎn)編碼器檢測(cè)
旋轉(zhuǎn)編碼器的AB相分別接入單片機(jī)的P1.1和P1.2,并在軟件中申請(qǐng)變量PINB和PINA進(jìn)行檢測(cè)。首先把接收的引腳置高電平,并申請(qǐng)一個(gè)變量EncOld記錄編碼器初始的狀態(tài)(00,01,10,11),用一個(gè)變量EncNew記錄編碼器現(xiàn)在的狀態(tài),對(duì)兩個(gè)狀態(tài)進(jìn)行比較,如果兩個(gè)數(shù)據(jù)相同則返回0,如果兩個(gè)數(shù)據(jù)不同則通過判斷改變的順序判斷方向,00-10-11或11-01-00表示右轉(zhuǎn),返回R,00-01-11或11-10-00表示左轉(zhuǎn),返回L。另外由于旋轉(zhuǎn)編碼器具有開關(guān)特性,所以使用時(shí)需要延時(shí)消除抖動(dòng)的影響。
(2)計(jì)時(shí)實(shí)現(xiàn)
在主程序中申請(qǐng)定時(shí)器中斷,根據(jù)計(jì)算定時(shí)器中斷初始化為TH0=0xdc,
TL0=0x00定時(shí)器每10ms中斷一次,也就是0.01秒,我們申請(qǐng)一個(gè)全局變量ms_10記錄定時(shí)器中斷次數(shù),一個(gè)6位數(shù)組存儲(chǔ)秒十位個(gè)位,分十位個(gè)位,時(shí)十位個(gè)位。當(dāng)中斷執(zhí)行100次時(shí),也就是ms_10=100時(shí)清零ms_10,把秒個(gè)位自加1。當(dāng)秒個(gè)位自加到10時(shí),把秒十位自加1并清零秒個(gè)位。當(dāng)秒十位自加到6時(shí),把秒十位清零并把分個(gè)位自加1,同理記錄分十位,時(shí)個(gè)位十位。當(dāng)每次定時(shí)器執(zhí)行完一次重復(fù)執(zhí)行主程序打開定時(shí)器,則可以實(shí)現(xiàn)計(jì)時(shí)。值得注意的是,計(jì)時(shí)器中斷的功能軟件中不能由太多延時(shí)時(shí)間,或者通過一步步調(diào)試通過調(diào)試軟件的時(shí)間對(duì)延時(shí)初值進(jìn)行調(diào)整,否則會(huì)出現(xiàn)計(jì)時(shí)不準(zhǔn)的情況發(fā)生。
(3)顯示實(shí)現(xiàn)
使用LCD屏需要三個(gè)子程序通過RS和RW的引腳拉高和拉低實(shí)現(xiàn)對(duì)液晶屏判斷是否正在工作、寫一個(gè)字節(jié)和寫一個(gè)命令。再通過初始化LCD屏程序把計(jì)時(shí)器和誤操作次數(shù)顯示到LCD屏中,具體操作如下:使用寫命令子程序設(shè)置16*2顯示開顯示,關(guān)顯示光標(biāo),使用寫一個(gè)字節(jié)程序執(zhí)行清屏操作和顯示TIME和DEGREE作為標(biāo)題。再申請(qǐng)一個(gè)play函數(shù),顯示行車時(shí)間和誤操作次數(shù),只需要使用寫一個(gè)字節(jié)把時(shí)間數(shù)組中的數(shù)據(jù)寫在屏幕上。
(4)掉電保護(hù)
掉電保護(hù)通過把數(shù)據(jù)寫入24C02的方法實(shí)現(xiàn),24C02需要使用I2C通信,所以我們需要使用程序模擬I2C總線通信的方法,根據(jù)I2C總線通信方法需要申請(qǐng)SCL和SDA通過改變它們的數(shù)值實(shí)現(xiàn)對(duì)24C02的寫入和讀取。另外掉電保護(hù)寫入需要時(shí)間所以要加入延時(shí)保證寫入程序的順利執(zhí)行。
(5)串口通信
使用串口通信時(shí),需要在串口助手中選擇與串口通信軟件中申請(qǐng)的相同波特率,并且申請(qǐng)計(jì)時(shí)器作為波特率發(fā)生器,初始化時(shí)打開計(jì)時(shí)器即可使用串口通信。根據(jù)計(jì)算,串口初始化波特率9600時(shí),初值為0xfdfd,工作方式為自動(dòng)重裝。
在接收到計(jì)算機(jī)發(fā)送的數(shù)據(jù)時(shí)進(jìn)入串口中斷服務(wù)程序,接收之后存入一個(gè)臨時(shí)變量中,并對(duì)這個(gè)數(shù)進(jìn)行判斷,如果為0,把存儲(chǔ)芯片中數(shù)據(jù)以一定的順序放入輸出數(shù)組,并發(fā)送給計(jì)算機(jī);如果接收到的數(shù)據(jù)為1時(shí),把存儲(chǔ)芯片的數(shù)據(jù)清零,即可實(shí)現(xiàn)清零功能。
(6)主程序
每次上電時(shí),首先初始化24C02芯片,讀取芯片中的信息放入誤操作次數(shù)和時(shí)間數(shù)組的全局變量中,然后執(zhí)行顯示初始化和時(shí)間顯示,并啟動(dòng)定時(shí)器。
如果光電門檢測(cè)有脈沖,進(jìn)入行車循環(huán)檢測(cè),啟動(dòng)中斷和使用時(shí)間顯示,判斷開關(guān)角度變量是否為0,為0時(shí)車門已經(jīng)關(guān)緊,否則車門沒有關(guān)緊,如果車門沒有關(guān)緊則記錄紅燈亮、警報(bào)器響直到行車停止,也就是光電門不再有脈沖一段時(shí)間。誤操作次數(shù)加一,并寫入到掉電保護(hù)芯片中。而且每循環(huán)一次都把時(shí)間數(shù)組寫入到掉電保護(hù)芯片中,在每次上電的時(shí)候讀取并寫入其中。
進(jìn)入停車循環(huán),執(zhí)行掃描旋轉(zhuǎn)編碼器并記錄旋轉(zhuǎn)編碼器的開關(guān)角度,左轉(zhuǎn)變量自減1,右轉(zhuǎn)自加1,如果車門關(guān)緊紅燈滅、綠燈亮,如果車門每關(guān)緊紅燈亮,綠燈滅,并記錄車門是否關(guān)緊的變量x,當(dāng)行車循環(huán)檢測(cè)時(shí)進(jìn)行判斷,以提醒司機(jī)行車狀態(tài)。