您现在所在的是:

单片机论坛

回帖:0个,阅读:898 [上一页] [1] [下一页]
1156
jieken
文章数:10
年度积分:50
历史总积分:1156
注册时间:2008/9/29
发站内信
发表于: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

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

31.2002