很長一段時(shí)間沒有接觸單片機(jī)了,剛才瀏覽工控平臺(tái)中的單片機(jī)論壇,讓我想起了學(xué)習(xí)單片機(jī)時(shí)中的樂趣。我就把我原來自己動(dòng)手做的一個(gè)小項(xiàng)目(基于freescale尋跡賽車小車的設(shè)計(jì))重新整理出來,希望大家喜歡。
在我們學(xué)習(xí)時(shí),剛開始都是從接觸51單片機(jī)開始的,了解它的接口,了解它的定時(shí),中斷等性能,然后開始用它來做我們想做的事情。呵呵。其實(shí)只要把一種單片機(jī)學(xué)好了,學(xué)習(xí)其他單片機(jī)都是非常容易的,F(xiàn)在freescale單片機(jī)在國內(nèi)還用的比較少,如果大家有興趣可以去學(xué)習(xí),而且這種單片計(jì)算機(jī)還是比較穩(wěn)定,比較好用。而且現(xiàn)在好像有freescale杯賽,很長時(shí)間沒有去關(guān)注了。呵呵
項(xiàng)目的功能有:尋跡,調(diào)速測速,路程顯示,按鍵掃描,躲避障礙。尋跡中用了PID控制算法,調(diào)速是通過PWM來調(diào)節(jié)電機(jī)來實(shí)現(xiàn)的。PID算法和PWM脈寬調(diào)制這方面的資料很多,我不多說了。
整個(gè)系統(tǒng)方框圖如下:

軟件設(shè)計(jì)方框圖:

子程序:

掃描子程序:
void scaning()
{
unsigned char temp,i;
//int key;
int n=255;
for(i=0;i<4;i++)
{
temp=key_val[i]&0x0f;
if(temp!=0x0f)
{
Delay_ms(100);
//LED_delay();
switch(key_val[i])
{
//掃描第一列
case 0xE7: Disp_Flag=1; break;
case 0xD7: Disp_Flag=0; break;
case 0xB7: Disp_Flag=2; break;
case 0x77: key=n; break;
//掃描第二列
case 0xEb: Disp_Flag=1; break;
case 0xDb: Disp_Flag=0; break;
case 0xBb: Disp_Flag=2; break;
case 0x7b: key=n; break;
}
}
}
}
PWM調(diào)速子程序:
void PWMInit(unsigned int Period)
{
unsigned int Temp=Period;
//不允許溢出中斷,不啟動(dòng)計(jì)數(shù),分頻因子=64,置位TSTOP,TRST
T1SC = 0b00110110;
//[設(shè)置PWM周期]
T1MODH = (Temp>>8);
T1MODL = Period;
//[初始化設(shè)置PWM脈寬為0]
T1CH0H = 0x00;
T1CH0L = 0x00;
//設(shè)為PWM模式,不允許輸出比較中斷,輸出低電平,帶緩沖
T1SC0 = 0b00111110;
//允許定時(shí)器1計(jì)數(shù)寄存器計(jì)數(shù)
T1SC &= 0b11011111;
}
整個(gè)系統(tǒng)運(yùn)行起來的效果比較良好,哪為兄弟想得到更詳細(xì)的資料,可以回復(fù)本人。
QQ:287756221
|