历史上的今天
返回首页

历史上的今天

今天是:2024年12月13日(星期五)

正在发生

2018年12月13日 | 51循迹小车+蓝牙

2018-12-13 来源:eefocus

/*

*******************************************************************************

* 文件名:main.c

* 描  述:寻迹小车

* 作  者:刘悦

* 版本号:v1.2

* 日  期: 2018年5月11日

* 备  注:注意了,所有的左右都是传感器位于自己前方看的!

*******************************************************************************

*/

#include


//关于寻迹、蓝牙,取消哪个宏定义表示选择哪项模式

#define TRACE

#define BLUETOOTH


//电机引脚定义

sbit MotorRight_P = P1^0;//右电机正相

sbit MotorRight_N = P1^1;//右电机反相

sbit MotorLeft_P  = P1^2;//左电机正相

sbit MotorLeft_N  = P1^3;//左电机反相


//红外传感器检测引脚定义

//左右的序号分别从中间往两边开始1.2

sbit Left1   = P1^7;

sbit Left2   = P1^4;

sbit Right1  = P1^6;    

sbit Right2  = P1^5;


//数据类型定义

typedef unsigned char u8;

typedef unsigned int  u16;

typedef unsigned long u32;


//电机运动相关的宏定义

#define MotorLeft_Go()    {MotorLeft_P =1; MotorLeft_N =0;}//左电机正转

#define MotorLeft_Back()  {MotorLeft_P =0; MotorLeft_N =1;}//左电机反转

#define MotorLeft_Stop()  {MotorLeft_P =0; MotorLeft_N =0;}//左电机停止

#define MotorRight_Go()   {MotorRight_P=1; MotorRight_N=0;}//右电机正转

#define MotorRight_Back() {MotorRight_P=0; MotorRight_N=1;}//右电机反转

#define MotorRight_Stop() {MotorRight_P=0; MotorRight_N=0;}//右电机停止


//函数声明

void GoStaright();

void Back();

void TurnAdvanceLeft();

void TurnAdvanceRight();

void TurnNormalLeft();

void TurnNormalRight();

void Stop();

void Timer0Init(void);

void UartInit(void);


void main()

{

    u8 TypeFlag=2; //左强拐-0 左普拐-1 直走-2 右普拐-3 右强拐-4

    char ch;


    EA = 1;

    Timer0Init();

    UartInit();


    while(1)

    {       


//蓝牙模式      

#ifdef BLUETOOTH//蓝牙

        if(RI)

        {

            RI = 0;

            ch = SBUF;

        }


        if(ch == 'g') GoStaright();

        else if(ch == 'b') Back();

        else if(ch == 'l') TurnNormalLeft();

        else if(ch == 'r') TurnNormalRight();

//      else Stop(); 

#endif


//寻迹模式

#ifdef TRACE


        //另一种方案


        else if((Left2==1)&&(Left1==1)&&(Right1==1)&&(Right2==1))

        //if((Left2==1)&&(Left1==1)&&(Right1==1)&&(Right2==1))

        {

            TurnNormalRight();

            TypeFlag = 3;

        }


        //直行

        else if((Left2==0)&&(Left1==1)&&(Right1==1)&&(Right2==0))

        {

            GoStaright();

            TypeFlag = 2;

        }

        else if((Left2==0)&&(Left1==0)&&(Right1==1)&&(Right2==0))

        {

            GoStaright();

            TypeFlag = 2;

        }

        else if((Left2==0)&&(Left1==1)&&(Right1==0)&&(Right2==0))

        {

            GoStaright();

            TypeFlag = 2;

        }


        //左转

        else if((Left2==1)&&(Left1==1)&&(Right1==1)&&(Right2==0))

        {

            TurnAdvanceLeft();

            TypeFlag = 0;

        }

        else if((Left2==1)&&(Left1==0)&&(Right1==0)&&(Right2==0))

        {       

            TurnAdvanceLeft();

            TypeFlag = 0;

        }

        else if((Left2==1)&&(Left1==1)&&(Right1==0)&&(Right2==0))

        {

            TurnNormalLeft();

            TypeFlag = 1; 

        }

        else if((Left2==1)&&(Left1==0)&&(Right1==1)&&(Right2==0))

        {

            TurnAdvanceLeft();

            TypeFlag = 0;

        }


        //右转

        else if((Left2==0)&&(Left1==1)&&(Right1==1)&&(Right2==1))

        {

            TurnAdvanceRight();

            TypeFlag = 4;

        }

        else if((Left2==0)&&(Left1==0)&&(Right1==0)&&(Right2==1))

        {

            TurnAdvanceRight();

            TypeFlag = 4;

        }

        else if((Left2==0)&&(Left1==1)&&(Right1==0)&&(Right2==1))

        {

            TurnAdvanceRight();

            TypeFlag = 4;

        }

        else if((Left2==0)&&(Left1==0)&&(Right1==1)&&(Right2==1))

        {

            TurnNormalRight();

            TypeFlag = 3;

        }


        //都没检测到时,为防止车抖动,可继续执行上次的动作

        else if((Left2==0)&&(Left1==0)&&(Right1==0)&&(Right2==0))

        {

            if(TypeFlag == 0)

            {

                TurnAdvanceLeft();

            }

            else if(TypeFlag == 1)

            {

                TurnNormalLeft();

            }

            else if(TypeFlag == 2)

            {

                GoStaright();

            }

            else if(TypeFlag == 3)

            {

                TurnNormalRight();

            }

            else if(TypeFlag == 4)

            {

                TurnAdvanceRight();

            }

        }


        //其余所有情况均直行

        else

        {

            GoStaright();

        }

#endif


    }

}


void UartInit(void)     //4800bps@12.000MHz

{

    PCON |= 0x80;       //使能波特率倍速位SMOD

    SCON = 0x50;        //8位数据,可变波特率

//  AUXR &= 0xBF;       //定时器1时钟为Fosc/12,即12T

//  AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器

    TMOD &= 0x0F;       //清除定时器1模式位

    TMOD |= 0x20;       //设定定时器1为8位自动重装方式

    TL1 = 0xF3;     //设定定时初值

    TH1 = 0xF3;     //设定定时器重装值

    ET1 = 0;        //禁止定时器1中断

    TR1 = 1;        //启动定时器1

}


void Timer0Init(void)       //10微秒@12.000MHz

{

//  AUXR &= 0x7F;       //定时器时钟12T模式

    TMOD &= 0xF0;       //设置定时器模式

    TMOD |= 0x01;       //设置定时器模式

    TL0 = 0xF6;     //设置定时初值

    TH0 = 0xFF;     //设置定时初值

    TF0 = 0;        //清除TF0标志

    ET0 = 1;  //关闭定时器0中断

    TR0 = 1;        //定时器0开始计时

}


void GoStaright()

{

    static unsigned char Clck = 0;

    u16  OutPWM_L=12,OutPWM_R=15;


    TL0 = 0xF6;     //设置定时初值

    TH0 = 0xFF;     //设置定时初值       

    if(Clck++ >= 100) Clck = 0;//100us   +1   1ms清零一次

    if(Clck

    {   

        MotorLeft_Go();

    }

    else

    {

        MotorLeft_Stop();

    }

    if(Clck

    {

        MotorRight_Go();    

    }

    else 

    {

        MotorRight_Stop();  

    }   

}


void Back()

{

    static unsigned char Clck = 0;

    u16  OutPWM_L=12,OutPWM_R=15;

    TL0 = 0xF6;     //设置定时初值

    TH0 = 0xFF;     //设置定时初值       

    if(Clck++ >= 100) Clck = 0;//100us   +1   1ms清零一次

    if(Clck

    {   

        MotorLeft_Back();

    }

    else

    {

        MotorLeft_Stop();

    }

    if(Clck

    {

        MotorRight_Back();  

    }

    else 

    {

        MotorRight_Stop();  

    }       

}


void TurnAdvanceRight()

{

    static unsigned char Clck = 0;

    u16  OutPWM_L=15,OutPWM_R=15;

    TL0 = 0xF6;     //设置定时初值

    TH0 = 0xFF;     //设置定时初值       

    if(Clck++ >= 100) Clck = 0;//100us   +1   1ms清零一次

    if(Clck

    {   

        MotorLeft_Go();

    }

    else

    {

        MotorLeft_Stop();

    }

    if(Clck

    {

        MotorRight_Back();  

    }

    else 

    {

        MotorRight_Stop();  

    }

}


void TurnAdvanceLeft()

{

    static unsigned char Clck = 0;

    u16  OutPWM_L=15,OutPWM_R=15;

    TL0 = 0xF6;     //设置定时初值

    TH0 = 0xFF;     //设置定时初值       

    if(Clck++ >= 100) Clck = 0;//100us   +1   1ms清零一次

    if(Clck

    {   

        MotorLeft_Back();

    }

    else

    {

        MotorLeft_Stop();

    }

    if(Clck

    {

        MotorRight_Go();    

    }

    else 

    {

        MotorRight_Stop();  

    }

}


void TurnNormalRight()

{

    static unsigned char Clck = 0;

    u16  OutPWM_L=15,OutPWM_R=15;

    TL0 = 0xF6;     //设置定时初值

    TH0 = 0xFF;     //设置定时初值       

    if(Clck++ >= 100) Clck = 0;//100us   +1   1ms清零一次

    if(Clck

    {   

        MotorLeft_Go();

    }

    else

    {

        MotorLeft_Stop();

    }   

    MotorRight_Stop();  

}


void TurnNormalLeft()

{

    static unsigned char Clck = 0;

    u16  OutPWM_L=15,OutPWM_R=15;

    TL0 = 0xF6;     //设置定时初值

    TH0 = 0xFF;     //设置定时初值       

    if(Clck++ >= 100) Clck = 0;//100us   +1   1ms清零一次


    MotorLeft_Stop();

    if(Clck

    {

        MotorRight_Go();    

    }

    else 

    {

        MotorRight_Stop();  

    }

}


void Stop()

{

    MotorLeft_Stop();

    MotorRight_Stop();

}


推荐阅读

史海拾趣

G-Two Inc公司的发展小趣事

背景:随着企业规模的扩大和业务的拓展,福斯特对资金的需求也越来越大。

发展:2014年,福斯特成功在上交所上市,通过资本市场融资,为公司的发展注入了强劲动力。上市后,公司继续加大研发投入和市场开拓力度,加速企业发展步伐。

成果:上市以来,福斯特的营收和利润均保持快速增长态势,企业规模和实力不断提升。同时,公司还通过并购重组等方式,进一步巩固和扩大市场份额。

以上五个故事概述了福斯特在电子行业,特别是光伏材料领域的发展历程和成就。这些故事不仅展现了福斯特的创业精神和创新能力,也反映了中国光伏产业从无到有、从小到大的发展历程。

Data Delay Devices公司的发展小趣事

在竞争激烈的电子行业中,质量管理是企业生存和发展的关键。DDD公司高度重视产品质量管理,建立了完善的质量管理体系和检测机制。公司从原材料采购、生产过程到成品检验都实行严格的质量控制,确保每一件产品都符合客户的要求和行业标准。这种对质量的执着追求使得DDD公司的产品在市场上赢得了良好的口碑和信誉。

台湾奇力(Chip)公司的发展小趣事

奇力公司一直致力于环保和社会责任。在生产过程中,奇力公司采用环保材料和工艺,减少对环境的影响。同时,奇力公司还积极参与社会公益活动,回馈社会。这种环保和社会责任的理念也赢得了客户和社会的认可和支持。

以上五个故事分别从不同角度展现了台湾奇力(Chip)公司的发展过程。这些故事不仅体现了奇力公司的技术实力和市场策略,也展现了其持续创新、绿色环保和社会责任的企业形象。

Antenna Factor公司的发展小趣事

随着无线通信技术的快速发展,Antenna Factor公司始终保持敏锐的洞察力,不断推出创新产品。他们研发的智能天线系统,能够根据信号环境的变化自动调整参数,显著提高通信质量和稳定性。这一技术创新在市场上引起了广泛的关注,使得Antenna Factor公司在行业中树立了技术领先的形象。

Elec & Eltek公司的发展小趣事

在国内市场取得一定成绩后,Elec公司开始将目光投向国际市场。为了更好地适应国际市场的需求,Elec公司积极引进国际先进技术和管理经验,并加强与国际知名企业的合作。同时,Elec公司还加大了在海外市场的营销力度,通过参加国际展会、举办技术研讨会等方式提高品牌知名度。经过多年的努力,Elec公司的产品已远销欧美、东南亚等多个国家和地区,成为国际市场上具有竞争力的电子品牌。

广州基安彼(GMB)公司的发展小趣事

Elec公司成立于20世纪初,最初只是一家小型电子元件生产商。创始人李明(化名)对电子技术有着深厚的兴趣和独到的见解。在他的带领下,Elec公司逐步研发出具有竞争力的电阻、电容等基础元件,并逐渐在市场中崭露头角。随着电子技术的不断发展,Elec公司敏锐地捕捉到半导体技术的潜力,开始投入巨资研发。经过数年的努力,Elec公司成功研发出具有自主知识产权的半导体芯片,这一突破让Elec公司在电子行业中声名鹊起。

问答坊 | AI 解惑

FSA4157模拟开关

大家有谁知道什么产品上还在使用FSA4157模拟开关,希望知道的能够帮帮我!谢谢…

查看全部问答>

大家找工作都通过什么渠道?

失业了,想听听大家的方法学习下。…

查看全部问答>

向今天已开始工作的表示敬意

今天是初七,按国家规定已经要上班了。不过EEWORLD明天才上班,所以还有一天的轻松。不过,要向今天已开始紧张工作的坛友们表示崇高的敬意,并由衷地说一声“你们辛苦了”!!!…

查看全部问答>

30岁面霸IT男30次面试失败经历

背景:硕士,IT行业工作3年,男,28岁,离职后,待业了一段时间(想创业)后,几个月的时间内面试了30几家公司均无功而返。 概要描述:   一个“离职”(离职和在职找工作是不同的,离职状态别人会压你的价格,所以,下文是离职的条件)优秀男 ...…

查看全部问答>

郁闷了好几天了,请教uc/os问题

uc/os在开中断和关中断时有没有修个OSTCBCur和OSPrioCur值啊,我把uc/os扩展成支持时间片轮转时,为什么开中断和关中断时会出现OSTCBCur和OSPrioCur值被修改的情况呢,而且奇怪的是在低优先级任务里面创建高优先级任务时出现这种问题,不知道那里问 ...…

查看全部问答>

两片计数器连接,进行扩展,消除毛刺的问题,求助!!

我用两个十进制的74160连接成60进制的,采用整体置数方式,计数到59的时候,置为零。不是很复杂。但是,要将置零信号进一步作为时钟信号输入到另一个计数器中,有毛刺的问题,老是不正确。 请问,如何消除毛刺,使其在上升沿触发时,发出一个信号 ...…

查看全部问答>

430RAM问题!

正进行一个设计 考虑使用MSP430F148,有2KRAM 但是我一次AD要采1250个数据,而且外围控制功能还有点多 不知道RAM够用不,怎么考虑需要多少的RAM…

查看全部问答>

随笔

其实,有时也会感觉无聊……工作快一年了,有时公司的事情真的让人很无语!有时让人想马上辞职走人,有时又有长期干下去的冲动,工作的那点事情,有时会感觉很累,有时却又干的不亦乐乎。搞技术的都是这样,有时真的不是在乎钱,不会太在乎工资的多 ...…

查看全部问答>

求高手帮解个题,占空比问题!

高手们,帮解个题:MSP430G2231 的MCLK=SMCLK=TACLK=8Mhz,Pin13 (TA0.1)配置成TimerA输出,TimerA工作在continuous模式,TACCR1=30000,TACCTL1=OUT_MOD2, 请问Pin13输出的波形频率是多少,占空比是多少? A 122Hz, ...…

查看全部问答>