基于MSP430送药小车 ----- 拓展篇【2021年全国电赛(F题)】

news/2024/10/18 3:32:19/

文章目录

    • 该篇文章并非完全按照赛题要求完成,仅当做个人休闲娱乐产品!!!!
  • 一、赛题分析
  • 二、逻辑处理分析
    • 1. 近端病房
    • 2. 中端病房
    • 3. 远端病房
  • 三、程序设计
    • 1. 近端送药
    • 2. 中端送药
    • 3. 远端送药
    • 4. 通信处理
      • ①蓝牙
      • ②OpenMV


该篇文章并非完全按照赛题要求完成,仅当做个人休闲娱乐产品!!!!

衔接上篇 基于MSP430送药小车 ----- 基础篇

该篇的主要内容为赛题的拓展部分,所以这里我就在完成基础部分的前提下继续介绍拓展部分。

本篇代码在上篇代码中做了许些修改(本人有点强迫症,看见bug就像修,修着修着就把许多代码改动了),但本质逻辑处理上都是一致的,所以想要追求完美,本人更推荐参考该篇的代码部分。

一、赛题分析

  • 两个小车协同运送药品到同一指定的中部病房。小车1识别病房号装载药品后开始运送,到达病房后等待卸载药品;然后,小车2识别病房号装载药品后启动运送,到达自选暂停点后暂停,点亮黄色指示灯,等待小车1卸载;小车1卸载药品,开始返回,同时控制小车2熄灭黄色指示灯并继续运送。要求从小车2启动运送开始,到小车1返回到药房且小车2到达病房的总时间(不包括小车2黄灯亮时的暂停时间)越短越好,超过60s 计0分。

  • 两个小车协同到不同的远端病房送、取药品,小车1送药,小车2取药。小车1识别病房号装载药品后开始运送,小车2于药房处识别病房号等待小车1的取药开始指令;小车1到达病房后卸载药品,开始返回,同时向小车2发送启动取药指令;小车2收到取药指令后开始启动,到达病房后停止,亮红色指示灯。要求从小车1返回开始,到小车1返回到药房且小车2到达取药病房的总时间越短越好,超过60s计0分。

  • 其他。

从上面赛题中可知,拓展任务需要俩辆车同时进行工作,车1和车2需将药品送到相同药房,中途相撞、暂停点距离过短、时间超过60s扣分,越快越好等等。

所以在该题中,俩辆车是需要有交互的,也就是通信,所以需要外加通信模块(蓝牙、Zigbee、LORA、WiFi等等),以上模块都可通过串口实现,且都可在预先在上位机配置连接后直接透传,以下我选择的是蓝牙进行通信,具体配置可参考“ HC-05 蓝牙模块之间的通信配置 ”。其次在第二辆车硬件方面,与其第一辆车相比,可以不用视觉模块(OpenMV、K210等等),具体送至哪个药房通过车1发送的指令获得信息,其他硬件、排线与车1保持一致即可。在软件上,代码也与车1大致相同,改动的地方为:外加串口初始化函数,用作蓝牙通信使用,其中相比上篇蓝牙收发消息体现在(以中端病房为例),当车1在去往中端药房的途中路径第一个十字路口(一共途径2个十字路口)时,发送消息给车2,这时车2接收到消息,开始装药 启动出发,在车1成功停靠在病房门口时,车2紧随其后,相继停靠在对面的中端药房,等待车1的下一步指令,当车1卸完药品后,途径回程中的第一个十字路口时,发送第二个指令给车2,车2接到指令立即原地调头(一开始停靠时车2的车头是面向病房的),然后开往目的药房,卸药回城。

Tips: 以下推荐几篇上述几种通信模块简介,仅供参考!

  1. HC-05 蓝牙
  2. ESP8266WiFi
  3. LORA 无线通信
  4. Zigbee 无线通信

二、逻辑处理分析

1. 近端病房

如上赛题分析所说,拓展部分相比较于基础部分,不大相同的地方为:由原来的一辆车送药变为俩辆车一起送药,小车之间通过无线串口通信模块进行数据传输,其余地方基本无太大变化。

车2设计如下:
在车1启动之后,车2在药房门前保持就绪状态,当车1途径第一个十字路口(也就是第一个转向口)时,发送启动指令给车2,人工装药后启动,车1会在病房前停止等待人工卸药,而车2会去往另一个近端病房,避免俩车会车(相撞),当车1卸药完成后,回程途径第一个十字路口时,发送第二个指令给车2,车2接收到指令立即回转直奔目的病房,随后按照以往操作,卸药完成后返回药房。

在近端送药时与一辆车相比,其实就单单多了俩条接收语句,简单来说,当车2接收到出发指令,将其原来在第一个十字路口左拐的指令改成右拐,且又继续等待车1的指令,当车1再一次发送指令过来时,车2调头途径十字路口时无需做任何操作,按照默认的循迹即可,那么当途径十字路口段时该怎么处理呢?即在接收到第二条指令的同时设立标志位,用作无视第一个十字路口段,当成功将药品送到指令病房后,又将标志位设成原来的值,即按照最开始的单量小车送药模式执行。

2. 中端病房

中端病房相比较于近端病房,从赛题中就可以注意到只是多了一个岔路口,也就是近端病房在第一个岔路口转向,而中端病房在第二个岔路口转向,具体设计如下。

车2设计如下:
当车1识别目的病房后启动,在途径第一个岔路口的时候就可以给车2发送出发指令,因为车1、车2的循迹速度都是保持一致的,且路况和其他因素也相差无几,所以车1在这时发送指令驱动车2送药,距离和时间上都是安全的,车1和车2都通过设立标志位忽略第一条岔路口,保持巡线状态,直到俩车都到达对应的停靠点,车1卸药完成后立即原路返回,车2则继续去往指定病房,随即同样安装车1的轨迹回程。

3. 远端病房

远端病房则相比较于近端、中端稍难一点,不过没关系,只要功夫深,铁杵都能磨成针,所以不要急,请听我一一道来。

下面我以5号病号为例(假如它位于赛题左上方处)
首先设定俩个标志位flag1和flag2,用作去程和回程的路向判断,每去往病房经过一个十字路口时flag1变换状态,当flag1第一次变换时车1发送第一条指令给车2,车2接收到消息马上装药启程,按照同车1一样的速度向目的药房行驶,当flag1变换到第三种状态时车1向左继续行驶,且标志位继续变化,再当标志位发生变化时向右行驶,随即到达指定药房处,而当flag1发生第四次变化时车2理当向右行驶,但考虑到车1卸完操作并未完成,所以选择在5号对面的药房作为临时停靠点,即在flag1发生第四次变化时车2向左行驶,等待车1第二个指令的到来。当车1卸完药品后回程途径第一个岔路口发送第二条指令给车2,车2接收到指令立即调头直行抵达目的病房,后面再安照以往操作正常回程。相比病房5,其他远端病房6,7,8都与5号在逻辑设计上一毛一样,只是路段的转向不同。

Tips: 在实现多功能情况下做项目开发时,切记不要开启低功耗模式(除非在功耗方面上有过多要求),不然会导致程序阻塞,反应迟钝等问题;在实现单功能情况下,如果对功耗也没过多要求,像我一样的新手可以关闭低功耗,直接使用,简单粗暴。

三、程序设计

1. 近端送药

① 车1

void judge1(void)
{xunji();if(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3)){while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));if(flag1==-100){UCA1TXBUF='a';right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}flag1++;if(flag1==1){left();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));}if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){if( pill==0 && ((P7IN&BIT4)==BIT4) )     //拿走药品{pill=1;back();SetPwm_Init(24,1000,400);//左边SetPwm_Init(25,1000,400);//右边delay_us(700000);left();SetPwm_Init(24,1000,550);//左边SetPwm_Init(25,1000,650);//右边delay_us(700000);flag1=-100;while(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) && (((P7IN&BIT0)!=BIT0)||((P6IN&BIT5)!=BIT5)) && (((P6IN&BIT0)!=BIT0)||((P6IN&BIT4)!=BIT4)));}else{stop();SetPwm_Init(24,1000,0);//左边SetPwm_Init(25,1000,0);//右边}}}

② 车2

void judge1(void)
{xunji();if(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3)){while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));if(flag1==-100){right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}flag1++;if(flag1==1){right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));}if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){if( pill==0 && ((P7IN&BIT4)==BIT4) )     //拿走药品{pill=1;back();SetPwm_Init(24,1000,400);//左边SetPwm_Init(25,1000,400);//右边delay_us(700000);left();SetPwm_Init(24,1000,550);//左边SetPwm_Init(25,1000,650);//右边delay_us(700000);flag1=-100;while(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) && (((P7IN&BIT0)!=BIT0)||((P6IN&BIT5)!=BIT5)) && (((P6IN&BIT0)!=BIT0)||((P6IN&BIT4)!=BIT4)));}else{stop();SetPwm_Init(24,1000,0);//左边SetPwm_Init(25,1000,0);//右边if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){UCA1IE |= UCRXIE;}else{UCA1IE &= ~UCRXIE;}}}}

2. 中端送药

① 车1

void judge3(void)
{xunji();if(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3)){while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));if(flag3==-100){right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);UCA1TXBUF='a';}flag3++;if(flag3==1)    {delay_us(150000);}if(flag3>=2&& flag3<=6){flag3=10;left();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));}if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){if( pill==0 && ((P7IN&BIT4)==BIT4) )     //拿走药品{pill=1;back();SetPwm_Init(24,1000,400);//左边SetPwm_Init(25,1000,400);//右边delay_us(700000);left();SetPwm_Init(24,1000,550);//左边SetPwm_Init(25,1000,650);//右边delay_us(700000);flag3=-100;while(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) && (((P7IN&BIT0)!=BIT0)||((P6IN&BIT5)!=BIT5)) && (((P6IN&BIT0)!=BIT0)||((P6IN&BIT4)!=BIT4)));}else{stop();SetPwm_Init(24,1000,0);//左边SetPwm_Init(25,1000,0);//右边}}}

② 车2

void judge3(void)
{xunji();if(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3)){while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));if(flag3==-100){right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}flag3++;if(flag3==1)    delay_us(150000);if(flag3>=2&& flag3<=6){flag3=10;right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));}if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){if( pill==0 && ((P7IN&BIT4)==BIT4) )     //拿走药品{pill=1;back();SetPwm_Init(24,1000,400);//左边SetPwm_Init(25,1000,400);//右边delay_us(700000);left();SetPwm_Init(24,1000,550);//左边SetPwm_Init(25,1000,650);//右边delay_us(700000);flag3=-100;while(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) && (((P7IN&BIT0)!=BIT0)||((P6IN&BIT5)!=BIT5)) && (((P6IN&BIT0)!=BIT0)||((P6IN&BIT4)!=BIT4)));}else{stop();SetPwm_Init(24,1000,0);//左边SetPwm_Init(25,1000,0);//右边if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){UCA1IE |= UCRXIE;}else{UCA1IE &= ~UCRXIE;}}}}

3. 远端送药

① 车1

void judge6(void)
{xunji();if(flag66!=0){if(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1))&&flag66==1){while(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1)));left();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);UCA1TXBUF='a';flag66++;}if(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1))&&flag66==2){while(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1)));left();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);flag66=0;}}if(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3)){while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));flag6++;if(flag6==1 || flag6==2)    delay_us(150000);if(flag6>=3&& flag6<=6){flag6=10;right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}if(flag6>10){flag6=-100;right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));}if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){if( pill==0 && ((P7IN&BIT4)==BIT4) )     //拿走药品{pill=1;back();SetPwm_Init(24,1000,400);//左边SetPwm_Init(25,1000,400);//右边delay_us(700000);left();SetPwm_Init(24,1000,550);//左边SetPwm_Init(25,1000,650);//右边delay_us(700000);while(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) && (((P7IN&BIT0)!=BIT0)||((P6IN&BIT5)!=BIT5)) && (((P6IN&BIT0)!=BIT0)||((P6IN&BIT4)!=BIT4)));flag66=1;}else{stop();SetPwm_Init(24,1000,0);//左边SetPwm_Init(25,1000,0);//右边}}
}

② 车2

void judge6(void)
{xunji();if(flag66!=0){if(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1))&&flag66==1){while(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1)));left();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);flag66++;}if(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1))&&flag66==2){while(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)!=BIT0) && (((P6IN&BIT2)==BIT2)||((P6IN&BIT1)==BIT1)));left();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);flag66=0;}}if(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3)){while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));flag6++;if(flag6==1 || flag6==2)    delay_us(150000);if(flag6>=3&& flag6<=6){flag6=10;right();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}if(flag6>10){flag6=-100;left();SetPwm_Init(24,1000,700);//左边SetPwm_Init(25,1000,700);//右边delay_us(300000);}while(((P6IN&BIT1)==BIT1)  && ((P6IN&BIT2)==BIT2) && ((P6IN&BIT3)==BIT3));}if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){if( pill==0 && ((P7IN&BIT4)==BIT4) )     //拿走药品{pill=1;back();SetPwm_Init(24,1000,400);//左边SetPwm_Init(25,1000,400);//右边delay_us(700000);left();SetPwm_Init(24,1000,550);//左边SetPwm_Init(25,1000,650);//右边delay_us(700000);while(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) && (((P7IN&BIT0)!=BIT0)||((P6IN&BIT5)!=BIT5)) && (((P6IN&BIT0)!=BIT0)||((P6IN&BIT4)!=BIT4)));flag66=1;}else{stop();SetPwm_Init(24,1000,0);//左边SetPwm_Init(25,1000,0);//右边if(((P6IN&BIT1)!=BIT1) && ((P6IN&BIT2)!=BIT2) && ((P6IN&BIT3)!=BIT3) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0)) || (((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)!=BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))||(((P6IN&BIT5)!=BIT5)  && ((P6IN&BIT0)==BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)!=BIT2) &&((P6IN&BIT3)==BIT3) &&((P6IN&BIT4)!=BIT4)&&((P7IN&BIT0)==BIT0))||(((P6IN&BIT5)==BIT5)  && ((P6IN&BIT0)!=BIT0) &&((P6IN&BIT1)==BIT1)&&((P6IN&BIT2)==BIT2) &&((P6IN&BIT3)!=BIT3) &&((P6IN&BIT4)==BIT4)&&((P7IN&BIT0)!=BIT0))){UCA1IE |= UCRXIE;}else{UCA1IE &= ~UCRXIE;}}}
}

4. 通信处理

①蓝牙

  • 车1
void blue_init(void){P4SEL |=BIT4+BIT5 ;                             // P4.5 P4.4 = USCI_A1 TXD/RXDUCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**UCA1CTL1 |= UCSSEL_2;                     // SMCLKUCA1BR0 = 9;                              // 1MHz 115200 (see User's Guide)UCA1BR1 = 0;                              // 1MHz 115200UCA1MCTL |= UCBRS_1 + UCBRF_0;            // Modulation UCBRSx=1, UCBRFx=0UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**UCA1IE &= ~UCRXIE;                         // 关闭UART1的接收中断__enable_interrupt(); // 开启全局中断
}
  • 车2
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{switch(__even_in_range(UCA1IV,4)){case 0:     break;                             // Vector 0 - no interruptcase 2:                                   // Vector 2 - RXIFG  接受中断while (!(UCA1IFG&UCTXIFG));    // USCI_A1 TX buffer ready?   UCTXIFG(USCI Transmit Interrupt Flag)//等待数据发送完成 完成UCTXIFG置1 跳出循环rx_flag++;if(rx_flag==11){UCA1IE &= ~UCRXIE;   //关闭蓝牙接收back();SetPwm_Init(24,1000,400);//左边SetPwm_Init(25,1000,400);//右边delay_us(700000);left();SetPwm_Init(24,1000,550);//左边SetPwm_Init(25,1000,650);//右边delay_us(700000);}if(rx_flag==2){rx_flag=10;if(UCA1RXBUF=='2'){find_num=2;}if(UCA1RXBUF=='4'){find_num=4;}if(UCA1RXBUF=='6'){find_num=6;}if(UCA1RXBUF=='8'){find_num=8;}if(UCA1RXBUF=='5'){find_num=5;}if(UCA1RXBUF=='1'){find_num=1;}if(UCA1RXBUF=='3'){find_num=3;}if(UCA1RXBUF=='7'){find_num=7;}UCA1IE &= ~UCRXIE;   //关闭蓝牙接收}break;case 4:break;                             // Vector 4 - TXIFG  发送中断default: break;}
}

②OpenMV

void openmv_init(void){P3SEL |=BIT3+BIT4 ;                             // P4.5 P4.4 = USCI_A1 TXD/RXDUCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**UCA0CTL1 |= UCSSEL_2;                     // SMCLKUCA0BR0 = 9;                              // 1MHz 115200 (see User's Guide)UCA0BR1 = 0;                              // 1MHz 115200UCA0MCTL |= UCBRS_1 + UCBRF_0;            // Modulation UCBRSx=1, UCBRFx=0UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**UCA0IE |= UCRXIE;                         // Enable USCI_A1 RX interrupt__enable_interrupt(); // 开启全局中断
}#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{switch(__even_in_range(UCA0IV,4)){case 0:     break;                             // Vector 0 - no interruptcase 2:                                   // Vector 2 - RXIFG  接受中断while (!(UCA0IFG&UCTXIFG));    // USCI_A1 TX buffer ready?   UCTXIFG(USCI Transmit Interrupt Flag)//等待数据发送完成 完成UCTXIFG置1 跳出循环if(UCA0RXBUF=='2'){find_num=2;UCA1TXBUF='2';}if(UCA0RXBUF=='4'){find_num=4;UCA1TXBUF='4';}if(UCA0RXBUF=='6'){find_num=6;UCA1TXBUF='6';}if(UCA0RXBUF=='8'){find_num=8;UCA1TXBUF='8';}if(UCA0RXBUF=='5'){find_num=5;UCA1TXBUF='5';}if(UCA0RXBUF=='1'){find_num=1;UCA1TXBUF='1';}if(UCA0RXBUF=='3'){find_num=3;UCA1TXBUF='3';}if(UCA0RXBUF=='7'){find_num=7;UCA1TXBUF='7';}UCA0IE &= ~(UCRXIE); break;case 4:break;                       default: break;}
}

http://www.ppmy.cn/news/327762.html

相关文章

企业邮箱哪个好,邮箱品牌介绍—TOM邮箱

TOM邮箱TOM集团旗下的互联网产品&#xff0c; 1998年推出免费邮箱业务&#xff0c;是目前中国最大的电子邮箱服务提供商之一。自成立以来&#xff0c;TOM邮箱一直致力于为用户提供更安全、更稳定的邮箱服务系统。同时全面拓展邮箱业务&#xff0c;2001年开通VIP收费邮箱服务&am…

C语言 数组,指针,结构体,文件的训练内容

《计算思维&#xff08;二&#xff09;》实验报告 基础实践二 班级&#xff1a; 学号&#xff1a; 姓名&#xff1a; 实验时间&#xff1a; 2023 年 第01~12周 成绩 哈尔滨工程大学计算机基础课程教学中心 实验五&#xff1a;数组 实验题目1&a…

使用Java调用Yolo模型的准备工作与输入输出

当今社会&#xff0c;人工智能技术正日益成为各行各业的关键工具。其中&#xff0c;目标检测技术是计算机视觉领域中的一项重要任务。Yolo&#xff08;You Only Look Once&#xff09;是一种流行的目标检测算法&#xff0c;具有高效、准确的特点。本文将介绍如何使用Java语言调…

苹果4s怎么越狱教程_教你苹果手机(iPhone)上怎么装KODI (不用越狱)

教你怎么在苹果手机&#xff08;iPhone&#xff09;上装KODI &#xff08;不用越狱&#xff09; 不管你是喜欢在网上追剧的还是喜欢看4k电影的&#xff0c;当提到KODI&#xff08;XBMC&#xff09;估计没有人不认识&#xff0c;KODI前身叫XBMC&#xff0c;因为强大的解码能力和…

Learning C++ No.30 【lambda表达式实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/9/9:13&#xff0c;今天8:15起床&#xff0c;可能是最近课非常少&#xff0c;导致写博客没什么压力&#xff0c;什么时间都能写&#xff0c;导致7点起不来&#xff0c;哈哈哈&#xff0c;习惯睡懒觉了&#xff0c;但是问题不大&a…

【JMeter压力测试】通过jmeter压测surging

目录 前言 环境 下载配置源码 JMeter和JDK下载 JDKJmeter安装 Jmeter非GUI运行压测 结尾 前言 surging是异构微服务引擎&#xff0c;提供了模块化RPC请求通道&#xff0c;引擎在RPC服务治理基础之上还提供了各种协议&#xff0c;并且还提供了stage组件&#xff0c;以便针…

华为OD机试 JavaScript 实现【简单密码】【牛客练习题 HJ21】,附详细解题思路

一、题目描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应&#xff1a; 1--1&#xff0c; abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0&#xff0c;把密码中出现的小写字母都变成九键键盘对应的数字&#xff0c;如&#xff1a;a …

oracle 慢sql查询语句

select * from (select sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS “执行次数”, round(sa.ELAPSED_TIME / 1000000, 2) “总执行时间”, round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) “平均执行时间”, sa.COMMAND_TYPE, sa.last_load_time, sa.PARSING_USER_I…