发表于:2008/10/12 15:55:00
#0楼
很长一段时间没有接触单片机了,刚才浏览工控平台中的单片机论坛,让我想起了学习单片机时中的乐趣。我就把我原来自己动手做的一个小项目(基于freescale寻迹赛车小车的设计)重新整理出来,希望大家喜欢。
在我们学习时,刚开始都是从接触51单片机开始的,了解它的接口,了解它的定时,中断等性能,然后开始用它来做我们想做的事情。呵呵。其实只要把一种单片机学好了,学习其他单片机都是非常容易的。现在freescale单片机在国内还用的比较少,如果大家有兴趣可以去学习,而且这种单片计算机还是比较稳定,比较好用。而且现在好像有freescale杯赛,很长时间没有去关注了。呵呵
项目的功能有:寻迹,调速测速,路程显示,按键扫描,躲避障碍。寻迹中用了pid控制算法,调速是通过pwm来调节电机来实现的。pid算法和pwm脉宽调制这方面的资料很多,我不多说了。
整个系统方框图如下:
软件设计方框图:
子程序:
扫描子程序:
void scaning()
{
unsigned char temp,i;
//int key;
int n=255;
for(i=0;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;
}
整个系统运行起来的效果比较良好。哪为兄弟想得到更详细的资料,可以回复本人。
msn:linjun-jieken@hotmail.com
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=64105&Name=jiekenblog
在我们学习时,刚开始都是从接触51单片机开始的,了解它的接口,了解它的定时,中断等性能,然后开始用它来做我们想做的事情。呵呵。其实只要把一种单片机学好了,学习其他单片机都是非常容易的。现在freescale单片机在国内还用的比较少,如果大家有兴趣可以去学习,而且这种单片计算机还是比较稳定,比较好用。而且现在好像有freescale杯赛,很长时间没有去关注了。呵呵
项目的功能有:寻迹,调速测速,路程显示,按键扫描,躲避障碍。寻迹中用了pid控制算法,调速是通过pwm来调节电机来实现的。pid算法和pwm脉宽调制这方面的资料很多,我不多说了。
整个系统方框图如下:
软件设计方框图:
子程序:
扫描子程序:
void scaning()
{
unsigned char temp,i;
//int key;
int n=255;
for(i=0;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;
}
整个系统运行起来的效果比较良好。哪为兄弟想得到更详细的资料,可以回复本人。
msn:linjun-jieken@hotmail.com
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=64105&Name=jiekenblog