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

📄 mcu1_main.c

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

       m=1;
       while(m<=m_total)
       {
                temp_rec=getrecord(n,m);
                cmd=temp_rec>>12;
                temp_lc=temp_rec&0x0fff;
                switch(cmd)
                {
                        case COM_QIAN:     //前进命令
                             //等待一段里程,长度为该命令和上一个命令之间的距离
                             //wait_lc()函数正常返回时返回0
                             //若在等待的过程中按下“停止”键或出现障碍返回非0值
                             if(wait_lc(temp_lc))return;
                             setspeed(1);
                             break;
                        case COM_HOU:    //后退命令
                             if(wait_lc(temp_lc))return;
                             setspeed(-1);
                             break;
                        case COM_ZUO:    //左转命令
                             if(wait_lc(temp_lc))return;
                             if(getnowdegree()>10)turnmid();
                             else if(getnowdegree()>(-10))turnleft();
                             if(!getspeed())delay_ms(2000);
                             break;
                        case COM_YOU:    //右转命令
                             if(wait_lc(temp_lc))return;
                             if(getnowdegree()<(-10))turnmid();
                             else if(getnowdegree()<10)turnright();
                             if(!getspeed())delay_ms(2000);
                             break;
                        case COM_FEN:    //漏粉命令
                             if(wait_lc(temp_lc))return;
                             loufen(1); //开始漏粉
                             break;
                        case COM_NOFEN:  //停止漏粉命令
                             if(wait_lc(temp_lc))return;
                             loufen(0);  //停止漏粉
                             break;
                        case COM_TING:   //停车命令
                             if(wait_lc(temp_lc))return;
                             setspeed(0);
                             delay_ms(1000);
                             break;
                }
                m++;
       }
}
/////////////////////////////////////////////////////////////////////
//走2字
void go_2(void)
{
       setdegree(50);
       delay_ms(2000);
       loufen(1);//开始漏粉
       setspeed(1);
       if(wait_lc(100))return;
       setdegree(0);
       if(wait_lc(80))return;
       setdegree(-50);
       if(wait_lc(20))return;
       setdegree(0);
       if(wait_lc(10))return;
       loufen(0);//停止漏粉
       if(wait_lc(30))return;
       setspeed(0);
       delay_ms(1000);
       setdegree(-50);
       delay_ms(2000);
       setspeed(-1);
       if(wait_lc(47))return;
       setspeed(0);
       delay_ms(1000);
       setdegree(0);
       delay_ms(2000);
       setspeed(1);
       if(wait_lc(30))return;
       setspeed(0);
       delay_ms(1000);
       setspeed(-1);
       loufen(1);//开始漏粉
       if(wait_lc(60))return;
       setspeed(0);
       loufen(0);//停止漏粉
}

/////////////////////////////////////////////////////////////////////
//走3字
void go_3(void)
{
        setdegree(50);
        delay_ms(1000);
        loufen(1);//开始漏粉
        setspeed(1);
        if(wait_lc(142))return;
        setspeed(0);
        delay_ms(1000);
        setdegree(-50);
        delay_ms(1000);
        setspeed(-1);
        if(wait_lc(150))return;
        setdegree(0);
        setspeed(0);
        loufen(0);//停止漏粉

}

/////////////////////////////////////////////////////////////////////
//走5字
void go_5(void)
{
        setdegree(0);
        delay_ms(1000);
        setspeed(1);
        loufen(1);//开始漏粉
        if(wait_lc(60))return;
        setspeed(0);
        delay_ms(1000);
        loufen(0);//停止漏粉
        setspeed(-1);
        if(wait_lc(30))return;
        setspeed(0);
        delay_ms(500);
        setdegree(50);
        delay_ms(2000);
        setspeed(1);
        if(wait_lc(47))return;
        setspeed(0);
        delay_ms(500);
        setdegree(0);
        delay_ms(2000);
        setspeed(-1);
        if(wait_lc(30))return;
        loufen(1);//开始漏粉
        if(wait_lc(30))return;
        loufen(0);//停止漏粉
        setspeed(0);
        delay_ms(1000);
        setspeed(1);
        if(wait_lc(30))return;
        setspeed(0);
        delay_ms(500);
        setdegree(50);
        delay_ms(2000);
        setspeed(-1);
        if(wait_lc(47))return;
        setspeed(0);
        delay_ms(500);
        setdegree(0);
        delay_ms(2000);
        setspeed(1);
        if(wait_lc(30))return;
        setspeed(0);
        delay_ms(1000);
        setspeed(-1);
        loufen(1);//开始漏粉
        if(wait_lc(28))return;
        setdegree(-50);
        if(wait_lc(47))return;
        setdegree(0);
        if(wait_lc(28))return;
        setdegree(-50);
        if(wait_lc(100))return;
        setspeed(0);
        setdegree(0);
        loufen(0);//停止漏粉

}

/////////////////////////////////////////////////////////////////////
//走8字
void go_8(void)
{
        delay_ms(500);

        setdegree(-50);
        delay_ms(2000);
        loufen(1);//开始漏粉
        setspeed(1);
        if(wait_lc(190))return;
        setspeed(0);
        setdegree(50);
        delay_ms(2000);
        setspeed(1);
        if(wait_lc(185))return;
        setdegree(0);
        setspeed(0);
        loufen(0);//停止漏粉
}
////////////////////////////////////////////////////////////////////
//等待一段时间后返回0
//当遇到障碍或按下停止键后返回相应的消息值
uchar wait_time(uint ms)
{
        data unsigned long temp_time;
        bdata bit flag_ting=1;
        bdata bit flag_dispmode=0;

        temp_time=gettime();
        temp_time+=(unsigned long)ms;
        while(1)
        {
                if(temp_time<gettime())return 0;
                if((KEY_TING==imgetch())&&(!flag_ting))   //等待过程中按下停止键则返回1
                {
                        beep(1);
                        return MSG_K_TING;//等待过程按下停止键返回停止键消息
                }
                else flag_ting=0; //刚进入该函数时KEY_TING键可能是按下的
                                //等到该键松开后置标志flag_ch=0
                if((KEY_DISPMODE==imgetch())&&(!flag_dispmode))   //数码管显示模式切换
                {
                        beep(1);
                        flag_dispmode=1;
                        if(MODE_TIME==getdispmode())setdispmode(MODE_LICHENG);
                        else if(MODE_LICHENG==getdispmode())setdispmode(MODE_TIME);
                }
                else if(KEY_DISPMODE!=imgetch())
                {
                        flag_dispmode=0;
                }

                if(getqianzhang()&&(getspeed()>0))
                {
                        warning();//报警
                        return MSG_QIANZHANG; //前进时前方遇到障碍返回前障消息
                }
                if(gethouzhang()&&(getspeed()<0))
                {
                        warning(); //报警
                        return MSG_HOUZHANG;  //后退时后方遇到障碍返回后障消息
                }
        }
}

////////////////////////////////////////////////////////////////////
//等待一段里程后返回0
//当遇到障碍或按下停止键后返回非0值
uchar wait_lc(uint licheng)
{
        data uint temp_licheng;
        bdata bit flag_ting=1;
        bdata bit flag_dispmode=0;
        if(!getspeed())return 0;
        temp_licheng=getlicheng();
        temp_licheng+=licheng;
        while(1)
        {
                if(getlicheng()>temp_licheng)return 0;//正常情况下,等到预定里程值返回0
                if((KEY_TING==imgetch())&&(flag_ting==0))   //等待过程中按下停止键则返回1
                {
                        beep(1);
                        return MSG_K_TING;//等待过程按下停止键返回停止键消息
                }
                else if(KEY_TING!=imgetch())
                {
                        flag_ting=0; //刚进入该函数时KEY_TING键可能是按下的
                }                  //等到该键松开后置标志flag_ch=0
                if((KEY_DISPMODE==imgetch())&&(!flag_dispmode))   //数码管显示模式切换
                {
                        beep(1);
                        flag_dispmode=1;
                        if(MODE_TIME==getdispmode())setdispmode(MODE_LICHENG);
                        else if(MODE_LICHENG==getdispmode())setdispmode(MODE_TIME);
                }
                else if(KEY_DISPMODE!=imgetch())
                {
                        flag_dispmode=0;
                }


                if(getqianzhang()&&(getspeed()>0))
                {
                        warning();//报警
                        return MSG_QIANZHANG; //前进时前方遇到障碍返回前障消息
                }
                if(gethouzhang()&&(getspeed()<0))
                {
                        warning(); //报警
                        return MSG_HOUZHANG;  //后退时后方遇到障碍返回后障消息
                }
        }
}

///////////////////////////////////////////////////////////////////
//遇到障碍时的报警处理
//可以在此处添加更多的障碍处理功能
void warning(void)
{
        imstop();//刹车
        beep(5);
        if(getqianzhang())LED_QZ=1; //障碍指示灯亮
        if(gethouzhang())LED_HZ=1;
}

///////////////////////////////////////////////////////////////////
//解除警报函数
void nowarning(void)
{
        if(!getqianzhang())LED_QZ=0;  //障碍指示等灭
        if(!gethouzhang())LED_HZ=0;
}
////////////////////////////////////////////////////////////////////////
//选择模式函数
//返回所选择的模式代码MODE_SHOUDONG,MODE_ZIDONG或MODE_ZOULUXIAN
uchar selmode(void)
{
        data uchar ch;
        data uchar temp_mode;

        setdispmode(MODE_USER);
        led[0]=5|LED_SHANSHUO;     //前三个数码管显示:SEL字符
        led[1]=CHAR_E|LED_SHANSHUO;
        led[2]=CHAR_L|LED_DP|LED_SHANSHUO;
        led[3]=1;           //默认选择第一种模式(手动模式)

        LED_SHOUDONG=1;
        LED_ZIDONG=0;
        LED_ZOUSHUZI=0;
        SSLED_SHOUDONG=1;
        SSLED_ZIDONG=1;
        SSLED_ZOUSHUZI=1;
        setspeed(0);
        //setdegree(0);
        delay_ms(300);
        while(1)
        {
            ch=getmsg();
            switch(ch)
            {
                case  MSG_K_QIAN:          //选择下一种模式
                      beep(1);
                      led[3]++;
                      if(led[3]>3)led[3]=1;
                      goto LEDSDEAL;

                case  MSG_K_HOU:          //选择上一种模式
                      beep(1);
                      led[3]--;
                      if(led[3]<1)led[3]=3;
              LEDSDEAL:
                      LED_SHOUDONG=0;
                      LED_ZIDONG=0;
                      LED_ZOUSHUZI=0;
                      switch(led[3])
                      {
                                case 1:
                                     LED_SHOUDONG=1;
                                     break;
                                case 2:
                                     LED_ZIDONG=1;
                                     break;
                                case 3:
                                     LED_ZOUSHUZI=1;
                                     break;
                                default:
                                     break;
                      }
                      break;

                case  MSG_K_TING:          //确定选择
                      beep(2);
                      temp_mode=led[3]&0x07;
                      SSLED_SHOUDONG=0;
                      SSLED_ZIDONG=0;
                      SSLED_ZOUSHUZI=0;
                      return temp_mode;
                      break;

                case  MSG_K_MODE:          //取消选择
                      beep(1);
                      //return 0;
                      break;

                default:

                      break;
           }
     }
}

⌨️ 快捷键说明

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