打印

帮我改一下下面的程序

[复制链接]
1922|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
古温|  楼主 | 2008-12-1 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在住程序里面改成小车能按照黑色轨迹来走就可以了。a0是左边的传感器,a1是右边的传感器。a<100是在黑色轨迹上。a>100是在白色纸张上。要遥控启动车子。是智能小车来的。




#include <hidef.h> /* for EnableInterrupts macro */
#include "MC68HC908JL3.h" /* include peripheral declarations */
#define MiddleLight            PTD_PTD5 /* 前进方向指示灯控制变量 */
#define LeftLight              PTD_PTD4 /* 左转方向指示灯控制变量 */
#define RightLight             PTD_PTD2 /* 右转方向指示灯控制变量 */
#define On                     0        /* 指示灯为共阳接法       */
#define Off                    1        /* 指示灯为共阳接法       */
#define True                   1        /*        */
#define False                  0        /*        */

#define SoundControl           PTD_PTD0 /* 蜂鸣器的控制变量       */

#define LA                     PTA_PTA3 /* 左电机LA */
#define LB                     PTA_PTA2 /* 左电机LB */
#define RA                     PTD_PTD7 /* 右电机LA */
#define RB                     PTD_PTD6 /* 右电机LB */

#define FrontSensor            PTA_PTA5//PTA_PTA5 /* 前端传感器,0:有障碍物 */
#define BackSensor             PTB_PTB0 /* 后端传感器,0:有障碍物 */
#define FrontLeftInfrared      PTB_PTB1 /* 左前红外传感器,0:有障碍物 */
#define FrontRightInfrared     PTB_PTB2 /* 右前红外传感器,0:有障碍物 */
#define FrontMiddleInfrared    PTB_PTB3 /* 右后红外传感器,0:有障碍物 */
#define BackLeftInfrared       PTB_PTB4 /* 左后红外传感器,0:有障碍物 */



//定义变量=================================================================

uchar cont_10ms; //为得到10ms时间平台计数器
uchar AD_buf;//保存AD转换值

//蜂鸣器相关变量==========================================================
uchar beef_daley;//响蜂鸣持续时间
uchar beef_figer;//响蜂鸣器标记
uchar beef_time;  //设置响蜂鸣器次数的变量
//=======================================================================
uchar ch;
uchar a[7];

uchar run_mode;

//遥控相关的变量===========================================================
uchar rest_time;//遥控接收时间计数器计数时间平台0.125ms
uchar rxtime_buf;//暂存遥控接收时间计数器数据的变量
uchar rx_figer;  //头码接收标记
uchar RCV_STEP;  //接收阶段
uchar RCV_CONT;  //接收数据位数计数变量
uchar rx_data;//遥控返回的得到内码
uchar RCV_BUF[4]={0};//接收数据缓冲数组
uchar RCV_CODE[9]={0x1a,0x13,0x0a,0x0b,0x0f,0x02,0xfc,0x0e,0x12 };//查遥控内码表



//以下为用户程序编写区 ============================================================

//初始化AD==================================================================  
void initAd(void) 
 {  
     ADICLK = 0x30;  //设置AD转换器的时钟源及分频系数
     ADSCR=ch;  //设置AD转换器的启动,中断允许及转换通道
 }
  





//AD管理=====================================================================
void AD_porm(void)  //每次调用该函数则启动一次AD转换,该AD通道为1
{   initAd();
            for(;;)
                {
            
                  if(0x80==(ADSCR&0x80))  //等待转换结束
                     {  a[ch-1]=ADR;    //将AD转换得到值保存在AD_buf里
                        ch++;
                        if(ch>7)
                        ch=1;
                        break;
                     }
                 }
             
           
            
  
          
}




  //蜂鸣器管理================================================================
 void beef_conr(void) 
 { if(beef_daley==0)  //若蜂鸣器工作时间结束,
      { if(beef_figer==1)//若已响过蜂鸣则要关掉蜂器
          { 
            beef_daley=20;//送蜂鸣器间隔时间
            beef_figer=0;//清响蜂鸣器标记
            
            
          } 
        else 
          {if(beef_time>0)//若前面没有响蜂鸣且还没有达到要响次数则继续响
              {beef_figer=1; //允许响蜂鸣器
               beef_time--;  //响的次数减1
               beef_daley=20;//响蜂鸣器的时间
              }
           
          }
          
        
        
      }
 }





//溢出中断==================================================================    
  
  interrupt 6 void Timer_Interrupt(void)
  {  
       TSC=TSC&0x7f; //清溢出中断标记
       TMODH = 0;    
         TMODL = 250;
         
         rest_time++;
         if(rest_time>159) 
         { rx_figer=0;
         RCV_STEP=0;
         RCV_CONT=0; 
          rest_time=0;
          
         }
         
         //蜂鸣器驱动===========================================
       if(beef_figer==1)
          PTD=PTD^1;//对PTD的第0位引脚取反产生振荡信号
        else
          PTD=PTD&0xfe;
        
        
       //=====================================================
        cont_10ms++; //为得到10ms计数器,每隔0.125ms计数一次
        if(cont_10ms>79)
         {
               //10ms时间平台====================================
             
              cont_10ms=0;
              if(beef_daley>0)
                  beef_daley--;  //对自减响蜂鸣的时间
              
            
            
         }
         
     
     
   }
   
   
   
    
 //外中断=====================================================================
//外中断主要负责遥控接收每按一次遥控器键盘时返回一个遥控内码保存在rx_data变量里
interrupt 2 void IRQ_Interrupt(void)  
 {
    char i; 
    rxtime_buf=rest_time;
    rest_time=0;
    if(rx_figer&1) 
       { if((rxtime_buf>4)&&(rxtime_buf<23)) 
            { if(rxtime_buf<=13) 
               { 
                    RCV_CONT++;
                    RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]>>1; 
                    RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]|0x80;
                 
                }
                 
               else 
               if(rxtime_buf>=14) 
                { 
                    RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]>>1; 
                    RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]&0x7f;
                    RCV_CONT++;
                   
                } 
               
                
              if(RCV_CONT==8) 
                {  
                     RCV_STEP++;
                     RCV_CONT=0;
                     
                }
                
              if(RCV_STEP>3) 
                { 
                      rx_figer=0;
                      RCV_STEP=0;
                      RCV_CONT=0;
                      
                      for(i=0;i<10;i++) 
                       {    if(RCV_BUF[3]==RCV_CODE
                            { 
                                
                                rx_data=i;
                                
                                beef_time=rx_data;
                                break; 
                            }
                            
                      }
                 
                  
                  
                    ;
                  
                 }
            
            }
       
       } 
          
    else
       { if((rxtime_buf>104)&&(rxtime_buf<112)) 
          { 
            rx_figer=1;
            RCV_STEP=0;
            RCV_CONT=0; 
          }
           
        
        
       }

 }
 
 
 
  
//外中断初始化=============================================================
 
 
 void init_IRQ(void)
 
 { INTSCR=0x00;//设置外中断信号为下降沿触发
 
 }
 
 
 
    
//定时器初始化==============================================================
void InitTimer(void) 
 {
          
      TMODH = 0;    //设置定时器预置寄存器的高8位值为0
      TMODL = 250;  //设置定时器预置寄存器的低8位值为250
    TSC=0x40;     //
 }
 
 
//软件延时==================================================================
void daley(int x)
{
   int c; 
   for(c=0;c<x;c++) 
   ;
 }
 
 


 
 
 //MCU初始化================================================================
void MCU_init(void)
 {   CONFIG1=1; 
   
    
    PTD=0x00;
    PTB=0xff;
    PTA=0;
    DDRA=0xff;
    DDRD=0xff; //PTD口作为输出
    DDRB=0x00;  //PTB口作为输入
    InitTimer(); //定时器初始化
    init_IRQ();
    EnableInterrupts//开总断 
  } 
  
  
  
 //========================================================================= 
/********* 停止模块 ***********/
void RunStop(void) 
{                        
      //设置电机控制变量
      LA = 0;
      LB = 0;
      RA = 0;
      RB = 0;
      
      //设置指示灯
      MiddleLight = Off;
      LeftLight   = Off;
      RightLight  = Off;
}

/********* 前进模块 ***********/
void RunForward(void) 
{                        
     
            LA = 1;
            LB = 0;
            RA = 1;
            RB = 0;
     
     
      //设置指示灯
      MiddleLight = On;
      LeftLight   = Off;
      RightLight  = Off;
}

/********* 后退模块 ***********/
void RunBackward(void) 
{                        
      //设置电机控制变量
      LA = 0;
      LB = 1;
      RA = 0;
      RB = 1;
      
      //设置指示灯
      MiddleLight = On;
      LeftLight   = On;
      RightLight  = On;
}

/********* 左转模块 ***********/
void RunLeft(void) 
{                        
      //设置电机控制变量
      LA = 0;
      LB = 1;
      RA = 1;
      RB = 0;
      
      //设置指示灯
      MiddleLight = Off;
      LeftLight   = On;
      RightLight  = Off;
}

/********* 原地左转模块 *******/
void RunLeftRoundLeft(void) 
{                        
      //设置电机控制变量
      LA = 0;
      LB = 0;
      RA = 1;
      RB = 0;
      
      //设置指示灯
      MiddleLight = Off;
      LeftLight   = On;
      RightLight  = Off;
}

/********* 右转模块 ***********/
void RunRight(void) 
{                        
      //设置电机控制变量
      LA = 1;
      LB = 0;
      RA = 0;
      RB = 1;
      
      //设置指示灯
      MiddleLight = Off;
      LeftLight   = Off;
      RightLight  = On;
}

/********* 原地右转模块 *******/
void RunRightRoundRight(void) 
{                        
      //设置电机控制变量
      LA = 1;
      LB = 0;
      RA = 0;
      RB = 0;
      
      //设置指示灯
      MiddleLight = Off;
      LeftLight   = Off;
      RightLight  = On;
}  
 
 
void run_md(void)
   { if(run_mode==1)
        RunStop();
   else
      if(run_mode==2)
       RunForward();
   else
       if(run_mode==3)
       RunLeft();
   else
       if(run_mode==4) 
       RunRight();  
    
 
 
 
 }
 
 
 void ad_to_mode(void)
     {if((a[0]<240)&&(a[1]<240)) 
             {if(a[0]>a[1]) 
                   {
                    if((a[0]-a[1])>25)
                     run_mode=3;
                    else
                    run_mode=2;
                    } 
              else
                    if(a[1]>a[0]) 
                    {if((a[1]-a[0])>25)
                     run_mode=4;
                     else
                     run_mode=2;
                    }
             }
       else
         if((a[0]>240)&&(a[1]<240)) 
             { 
               if(a[1]>220)
                run_mode=4;
               else
                if(a[1]<180)
                run_mode=3;
               else
                if((a[1]>180)&&(a[1]<220))
                run_mode=2;
             
              
             } 
        else
          if((a[1]>240)&&(a[0]<240)) 
             { 
               if(a[0]>220)
                run_mode=3;
               else
                if(a[0]<180)
                run_mode=4;
               else
                if((a[0]>180)&&(a[0]<220))
                run_mode=2;
             
              
             }
          
                   
       
            
     }

//main程序===================================================================  
void main(void) 
{
 
  daley(100);//系统延时
  MCU_init();//单片机初始化
  EnableInterrupts;
  beef_time=1;
 //主控程序============================================== 
  for(;;) 
        {   beef_conr();  
            AD_porm();
          //run_md();
          //ad_to_mode();
            // 
            
            //if((a[0]<100)&&(a[1]<100))
            //{
                  
            ///      RunBackward(); 
            //}
            //else
            //{      RunForward(); 
            
            //}
            if(rx_data==8)
            {     rx_data=0;
                  RunForward();
            }
            else
            if(rx_data==1)
            {     rx_data=0;  
                  RunLeftRoundLeft();
            }
            else 
            if(rx_data==3)
            {     rx_data=0;  
                  RunStop();
            } 
            
           
         }
        
        
        
  } 
  
  
  
//下面的与应用程序无关不必去看========================================================================== 
  
interrupt 15 void Timer15_Interrupt(void) {   ;}
interrupt 14 void Timer14_Interrupt(void) {   ;} 
interrupt 13 void Timer13_Interrupt(void) {   ;} 
interrupt 12 void Timer12_Interrupt(void) {   ;}
interrupt 11 void Timer11_Interrupt(void) {   ;}
interrupt 10 void Timer10_Interrupt(void) {   ;}
interrupt 9  void Timer9_Interrupt(void)   {   ;} 
interrupt 8  void Timer8_Interrupt(void)   {   ;} 
interrupt 7  void Timer7_Interrupt(void)   {   ;}
interrupt 5  void Timer5_Interrupt(void)   {   ;}
interrupt 4  void Timer4_Interrupt(void)   {   ;}
interrupt 3  void Timer3_Interrupt(void)   {   ;} 

interrupt 1  void Timer1_Interrupt(void)   {   ;}

相关帖子

沙发
dhh278| | 2008-12-2 10:47 | 只看该作者

楼主无私奉献、可惜我还在学习成长中、不敢妄下结论

使用特权

评论回复
板凳
古温|  楼主 | 2008-12-2 12:27 | 只看该作者

就在主程序里面改一下就可以了,

按要求改一下。主程序里面的程序不用理。安各位老师的意思做。谢谢。小弟有点急

使用特权

评论回复
地板
古温|  楼主 | 2008-12-2 18:53 | 只看该作者

怎么都没人改啊

不是很难啊。按你们的水平应该很容易啊。

使用特权

评论回复
5
keyanfeng| | 2008-12-2 21:09 | 只看该作者

黑色的轨迹是什么呀?

都不知道黑色的轨迹是什么,
该不会是
(a[0]<100)&&(a[1]<100)吧?

而且小车的运动有多种模式,
RunForward,RunBackward,RunLeft,RunLeftRoundLeft,RunRight,
RunRightRoundRight。
在某个运行的转折点应该要进行不同的运动模式切换吧。

使用特权

评论回复
6
古温|  楼主 | 2008-12-2 22:51 | 只看该作者

差不多是这个意思了。

使用特权

评论回复
7
古温|  楼主 | 2008-12-3 18:39 | 只看该作者

这么简单的问题。都没人帮我啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

38

帖子

0

粉丝