⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcu1_main.c

📁 单片机实现的遥控小汽车的设计研究论文与程序
💻 C
📖 第 1 页 / 共 3 页
字号:

                default:

                      break;
            }
        }
}
/*
//////////////////////////////////////////////////////////////
//记录一条命令
static data uint temp_licheng; //暂存里程
void writecommand(uchar com,uchar flag)
{
        static data uchar n;           //当前记录的条数

        data uint temp_record; //暂存本次将要保存的记录
        static data uchar page; //路线保存在24C08中的页号

        switch(flag)
        {
                case FLAG_BEGIN:
                     page=(com-1);                 //此时com传递的页号
                     n=0;                      //初始化记录数
                     temp_licheng=getlicheng();//初始化里程值
                     writerecord(page,0,0);    //记录数清0,表示删除原来的那条路线数据
                     return;
                case FLAG_END:
                     n++;
                     writerecord(page,n,(getlicheng()-temp_licheng));
                     writerecord(page,0,n);//写入本条路线的记录条数
                     return;
                case FLAG_COM:
                     temp_record=(getlicheng()-temp_licheng);
                     temp_licheng=getlicheng();
                     temp_record&=0x0fff;
                     temp_record|=(com<<12);
                     if(n<127)
                     {
                        n++;
                        writerecord(page,n,temp_record);
                     }
                      return;
                default:
                     return;
         }
}
 */

data int source_dg; //暂存光源角度值
data uchar lc;      //暂存需要行走的里程值
data uchar fangxiang; //暂存光源的方向标志,0:前方  1:左侧  2:右侧
data uchar dg;      //暂存光源和正前方的夹角
bdata bit flag;     //是否找到光源标志

uchar qianzhang(void);//前方有障碍,后方无障碍的处理
uchar houzhang(void);//前方无障碍,后方有障碍的处理
uchar qianhouwuzhang(void);//前方无障碍,后方也无障碍的处理
///////////////////////////////////////////////////////////////
//自动寻找光源模式处理函数
uchar zidong(void)
{

        setspeed(0);//停车
        delay_ms(200);//等待200毫秒
        loufen(0);  //停止漏粉
        setlicheng(0);//复位里程值
        resettime();//复位系统时间
        setdispmode(MODE_TIME);

        while(1)
        {
                setspeed(0);//停车
                sendmsg(MSG_ENDFIND);//向从机发送停止寻找光源命令
                delay_ms(200);
                sendmsg(MSG_BEGINFIND);//向从机发送寻找光源命令
                //等待5秒,若等待过程中按下停止键则转到ENDFIND出作处理
                //if(MSG_K_TING==wait_time(10000));
                //led[3]=0;
                if(MSG_K_TING==wait_time(6000))goto ENDFIND;
                //led[3]=1;
                if(flag=testfound())//如果发现光源
                {
                        source_dg=getsourcedegree(); //取光源方位
                        if(source_dg<(-10))   //光源在左侧
                        {
                                fangxiang=-1;
                                dg=(uchar)(-source_dg/2);
                        }
                        else if(source_dg>10)  //光源在右侧
                        {
                                fangxiang=1;
                                dg=(uchar)(source_dg/2);
                        }
                        else                  //光源在前方
                        {
                                fangxiang=0;
                        }
                        dg/=2;
               }

               if(getqianzhang()&&(!gethouzhang()))//前方有障碍,后方无障碍
               {

                        if(flag&&(fangxiang==0))//找到光源,结束
                        {
                                //led[3]=3;
                                setdispmode(MODE_USER);
                                led[0]=0;
                                led[1]=0;
                                led[2]=0;
                                led[3]=0;
                                //显示:Find
                                led[0]=CHAR_F|LED_SHANSHUO;
                                led[1]=1|LED_SHANSHUO;
                                led[2]=CHAR_n|LED_SHANSHUO;
                                led[3]=CHAR_d|LED_SHANSHUO;
                                beep(3);
                                while(1)
                                 {
                                        wait_time(60000);
                                        goto ENDFIND;
                                 }
                          }
                          else
                          {
                                //led[3]=4;
                                if(MSG_K_TING==qianzhang())goto ENDFIND;
                          }

               }
               else if((!getqianzhang())&&gethouzhang())//前方无障碍,后方有障碍
               {
                        //led[3]=5;
                        if(MSG_K_TING==houzhang())goto ENDFIND;

               }
               else if((!getqianzhang())&&(!gethouzhang()))//前方无障碍,后方也无障碍
               {
                        //led[3]=6;
                        if(MSG_K_TING==qianhouwuzhang())goto ENDFIND;

               }
               else if(getqianzhang()&&gethouzhang())//前方有障碍,后方也有障碍
               {
                        //led[3]=7;
                        beep(10);
                        goto ENDFIND;//强行停止寻找光源
               }
        }
ENDFIND://强行停止寻找光源处理
        beep(1);
        imstop();
        while(1)
        {
                //led[3]=8;
                switch(getmsg())
                {
                        case MSG_K_MODE:
                             beep(1);
                             return selmode();
                        case MSG_K_DISPMODE:
                             beep(1);
                             if(MODE_TIME==getdispmode())
                             setdispmode(MODE_LICHENG);
                             else setdispmode(MODE_TIME);
                             break;
                        default:
                             break;
               }
        }
}
////////////////////////////////////////////////////////////////////
//前方有障碍,后方无障碍的处理
uchar qianzhang(void)
{
        //led[2]=0;
        if(flag)  //发现光源
        {
                //led[2]=1;
               if(fangxiang==-1)//光源在左侧
               {
                        //led[2]=2;
                      turnright();//右转
                      setspeed(-1);//倒车
                      if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
                      return 0;
               }
               if(fangxiang==1)//光源在右侧
               {
                        //led[2]=3;
                      turnleft();//左转
                      setspeed(-1);//倒车
                      if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
                      return 0;
               }
               if(fangxiang==0)//光源在前方,认为找到光源
               {
                  //上一层函数已处理此种情况
               }
        }
        else      //未发现光源
        {
                //led[2]=4;
                 turnleft();
                 //led[2]=5;
                 setspeed(-1);
                 if(MSG_K_TING==wait_lc(40))return MSG_K_TING;
                 return 0;
        }
}

////////////////////////////////////////////////////////////////////
//前方无障碍,后方有障碍的处理
uchar houzhang(void)
{
        if(flag)  //发现光源
        {
               if(fangxiang==-1)//光源在左侧
               {
                      turnleft();//左转
                      setspeed(1);//前进
                      if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
                      return 0;
               }
               if(fangxiang==1)//光源在右侧
               {
                      turnright();//右转
                      setspeed(1);//前进
                      if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
                      return 0;
               }
               if(fangxiang==0)//光源在前方
               {
                        turnmid();
                        setspeed(1);  //前进
                        if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
                        return 0;
               }
        }
        else      //未发现光源
        {
                 turnmid();
                 setspeed(1);   //前进
                 if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
                 return 0;
        }


}

////////////////////////////////////////////////////////////////////
//前方无障碍,后方也无障碍的处理
uchar qianhouwuzhang(void)
{
         if(flag)  //发现光源
        {
               if(fangxiang==-1)//光源在左侧
               {
                      turnleft();//左转
                      setspeed(1);//前进
                      if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
                      return 0;
               }
               if(fangxiang==1)//光源在右侧
               {
                      turnright();//右转
                      setspeed(1);//前进
                      if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
                      return 0;
               }
               if(fangxiang==0)//光源在前方
               {
                      turnmid();
                      setspeed(1);
                      if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
                      return 0;
               }
        }
        else      //未发现光源
        {
                 turnmid();
                 setspeed(1);
                 if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
                 return 0;
        }
}


///////////////////////////////////////////////////////////////////////
//重放路线模式处理函数,包括走数字
//前四条路线为用户记录的路线,存在24C08串行EEPROM
//后四条路线为系统预先定义好的路线,
//是用一段程序来控制小车走一段路线
uchar zouluxian(void)
{
        data uchar n;
        data uchar ch;

        setspeed(0);  //停车
        setdegree(0); //转正
        loufen(0);    //停止漏粉
        do
        {
                if(n=sel_record(9))  //选择了一条路线重放
                {
                        setlicheng(0);    //重设里程值为0
                        setdispmode(MODE_LICHENG); //显示里程
                        LED_RECORD=1;
                        SSLED_RECORD=0;
                        switch(n)
                        {
                                case 5:       //走系统预定义的2字
                                     go_2();
                                     break;
                                case 6:       //走系统预定义的3字
                                     go_3();
                                     break;
                                case 7:       //走系统预定义的5字
                                     go_5();
                                     break;
                                case 8:       //走系统预定义的8字
                                     go_8();
                                     break;
                                case 9:
                                     read();  //调试命令,读出路线记录并显示
                                     break;
                                case 1:
                                case 2:
                                case 3:
                                case 4:
                                     replay(n); //重放用户记录的路线1~4
                                     break;
                                default:
                                     break;
                        }
                }
                setspeed(0);
                setdegree(0);
                LED_RECORD=0;
                setdispmode(MODE_USER);   //显示提示信息:End
                led[0]=CHAR_MIE;
                led[1]=CHAR_E|LED_SHANSHUO;
                led[2]=CHAR_n|LED_SHANSHUO;
                led[3]=CHAR_d|LED_SHANSHUO;
                beep(2);
                loufen(0);//停止漏粉
                while(1)
                {
                        ch=getmsg();     //读取按键
                        if(ch==MSG_K_MODE) //模式选择
                        {
                                beep(1);
                                return selmode();
                        }
                        else if(ch==MSG_K_REC) //重房另一条路线
                        {
                                beep(1);
                                break;
                        }
                        else
                        {
                                continue;
                        }
                }
        }while(1);

}

/////////////////////////////////////////////////////////////////////
//重放记录在24C08中用户记录的路线
void replay(uchar n)
{
       data uchar cmd;    //暂存命令值
       data uint temp_rec;//暂存读出的记录
       data uint temp_lc; //暂存里程
       data uchar m;      //当前重放第m个记录
       data uchar m_total;//总记录数

       n--;  //n--后为记录存放在24C08中的页号
       m_total=(uchar)getrecord(n,0);  //取本条路线的总记录数

       if(!m_total)return;      //有效的数目在1~127之间
       if(m_total>127)return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -