很长一段时间没有接触单片机了,刚才浏览工控平台中的单片机论坛,让我想起了学习单片机时中的乐趣。我就把我原来自己动手做的一个小项目(基于freescale寻迹赛车小车的设计)重新整理出来,希望大家喜欢。
在我们学习时,刚开始都是从接触51单片机开始的,了解它的接口,了解它的定时,中断等性能,然后开始用它来做我们想做的事情。呵呵。其实只要把一种单片机学好了,学习其他单片机都是非常容易的。现在freescale单片机在国内还用的比较少,如果大家有兴趣可以去学习,而且这种单片计算机还是比较稳定,比较好用。而且现在好像有freescale杯赛,很长时间没有去关注了。呵呵
项目的功能有:寻迹,调速测速,路程显示,按键扫描,躲避障碍。寻迹中用了PID控制算法,调速是通过PWM来调节电机来实现的。PID算法和PWM脉宽调制这方面的资料很多,我不多说了。
整个系统方框图如下:

软件设计方框图:

子程序:

扫描子程序:
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调速子程序:
void PWMInit(unsigned int Period)
{
unsigned int Temp=Period;
//不允许溢出中断,不启动计数,分频因子=64,置位TSTOP,TRST
T1SC = 0b00110110;
//[设置PWM周期]
T1MODH = (Temp>>8);
T1MODL = Period;
//[初始化设置PWM脉宽为0]
T1CH0H = 0x00;
T1CH0L = 0x00;
//设为PWM模式,不允许输出比较中断,输出低电平,带缓冲
T1SC0 = 0b00111110;
//允许定时器1计数寄存器计数
T1SC &= 0b11011111;
}
整个系统运行起来的效果比较良好,哪为兄弟想得到更详细的资料,可以回复本人。
QQ:287756221
|