17.5.9——智能避障小车

来源:互联网 发布:js中 符号代表什么 编辑:程序博客网 时间:2024/05/17 22:36

学校说好的在4月份的比赛又推迟了闲来无事再做一个小车,本来计划是让这个小车可壁障还可以寻找火源进行灭火的但是坑的就在这。。。。4月份说推迟没说日期,我加班加点弄车做完壁障还没开始弄寻火时突然告诉我报名表明天交(4月26日)无奈只好填上壁障小车交。
然后我开始学STM32。恩,重点来了。几天后突然又来一个消息“因为部分同学作品未完成,先拟将截止时间推迟到5月28日“ 我。。。。。。。。。。
我也是没做好的好吗,我材料都交了你给我看这个。心塞。
因此灭火小车烂尾了只剩壁障小车,电路我也懒得画了,直接用最小系统板加模块搭。

材料
1:MCU STC15W4K56S2
2:电机驱动 L293D
3:舵机 SG90
4:超声波模块 US-015
5:红外测距模块 (可以不用)

代码如下(比较乱,懒的整理了)

#include "STC15.H"#include <intrins.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned int#define CCP_S0 0x10#define CCP_S1 0x20sbit Trig = P0^0;sbit Echo = P0^1;sbit dj = P3^2;uchar flag;     //测量溢出标志float jl;uint time;uint m;void Delay15us()        //@11.0592MHz{    unsigned char i;    i = 39;    while (--i);}void delay1ms(uint n){    unsigned char i, j, k;    for(k = 0;k < n;k++)    {        _nop_();        _nop_();        _nop_();        i = 11;        j = 190;        do        {            while (--j);        } while (--i);    }}void init(){    PCON &= 0x7F;       //波特率不倍速    SCON = 0x50;        //8位数据,可变波特率    AUXR |= 0x40;       //定时器1时钟为Fosc,即1T    AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器    TMOD &= 0x0F;       //清除定时器1模式位    TMOD |= 0x20;       //设定定时器1为8位自动重装方式    TL1 = 0xDC;     //设定定时初值    TH1 = 0xDC;     //设定定时器重装值    ET1 = 0;        //禁止定时器1中断    TR1 = 1;        //启动定时器1}void Timer0Init()       //10微秒@11.0592MHz{    AUXR &= 0x7F;       //定时器时钟12T模式    TMOD &= 0xF0;       //设置定时器模式    TMOD |= 0x01;       //设置定时器模式    TL0 = 0x00;     //设置定时初值    TH0 = 0x00;     //设置定时初值//  TF0 = 0;        //清除TF0标志//  TR0 = 1;        //定时器0开始计时    ET0 = 1;        //开启定时器0中断}float Juli(){    TL0 = 0x00;     //设置定时初值    TH0 = 0x00;     //设置定时初值    Trig = 0;    delay1ms(1);    Trig = 1;    Delay15us();    Trig = 0;    while(!Echo);    TR0 = 1;    while(Echo);    TR0 = 0;//  delay1ms(80);    if(flag == 0)    {        time = TH0 * 256 + TL0;        jl = time*0.01845;        TI = 1;printf("%.4f\n", jl);while(!TI);TI = 0;    }    else    {        flag = 0;    }    return jl;}void Delay10ms(uchar n)     //@11.0592MHz{    unsigned char i, j, k;    for(k = 0;k < n;k++)    {        i = 108;        j = 145;        do        {            while (--j);        } while (--i);    }          }void XJ_init()          //初始化PWM{    ACC =   P_SW1;    ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0 = 0, CCP_S1 = 0    P_SW1 = ACC;            //(P12/ECI, P11/CCP0, P10/CCP1, P37/CCP2)    CCON  = 0;          //初始化PCA控制寄存器                    //PCA定时器停止                    //清除模块中断标志    CL    = 0;          //复位PCA寄存器    CH    = 0;    CMOD  = 0x00;       //设置PCA时钟源                    //禁止PCA定时器溢出中断    PCA_PWM0 = 0x00;        //PCA模块0工作于8位PWM    CCAPM0 = 0x42;      //PCA模块0为8位PWM模式    PCA_PWM1 = 0x00;        //PCA模块0工作于8位PWM    CCAPM1 = 0x42;      //PCA模块0为8位PWM模式    CR    = 1;          //PCA定时器开始工作}void Tz()               //停止前进{    CCAP0H = 0xff;    CCAP1H = 0xff;}void Qj()               //控制小车前进{    CCAP0H = CCAP0L = 0x80;    CCAP1H = CCAP1L = 0x82;}void Zz()               //控制小车左转{    CCAP0H = CCAP0L = 0xff;    CCAP1H = CCAP1L = 0x80;    Delay10ms(85);      Tz();       //转向完成后停止}void Yz()               //控制小车右转{    CCAP0H = CCAP0L = 0x80;     CCAP1H = CCAP1L = 0xff;     Delay10ms(85);    Tz();       //转向完成后停止}void Ht()               //后退{    float a;    a = Juli();    while(a < 15.0)    {        CCAP0H = 0x5f;        CCAP1H = 0x5f;//      P37 = P36 = 1;        P37 = 1;        P36 = 1;        a = Juli();        delay1ms(80);    }    P37 = P36 = 0;}void Delay100us(uchar n)        //@11.0592MHz{    unsigned char i, j, k;    for(k = 0;k < n;k++)    {        _nop_();        _nop_();        i = 2;        j = 15;        do        {            while (--j);        }         while (--i);    }}void Cx(uchar n)    //舵机朝向设置  15:前 24:左 6:右{    uchar i;    dj = 0;    for(i = 0;i < 50;i++)    {        dj = 1;        Delay100us(n);        dj = 0;        Delay100us(100 - n);    }    Delay10ms(2);}void main(){    Delay10ms(100);    P37 = P36 = 0;    P16 = P17 = 1;    init();         //初始化串口通信    Timer0Init();       //定时器0初始化,模拟PWM控制舵机    XJ_init();      //PCA初始化,产生PWM控制行进    EA = 1;    Qj();    Cx(15);    while(1)    {        float b, c, d, e, zcjl, ycjl;   //左侧距离 右侧距离         c = Juli();        if( c < 20.0)        {            Tz();            Delay10ms(50);            d = Juli();            if(d > 15)            {                Cx(24); //舵机朝向设置  15:前 24:左 6:右                zcjl = Juli();                Cx(6);  //舵机朝向设置  15:前 24:左 6:右                ycjl = Juli();                if((zcjl > ycjl) & (zcjl > 20))                {                    Zz();                    Cx(15);                    b = Juli();                    if(b > 20.0)                    {                        Qj();                    }                }                else if(ycjl > 20)                {                    Yz();                    Cx(15);                    b = Juli();                    if(b > 20.0)                    {                        Qj();                    }                }                delay1ms(80);            }            else            {                Ht();                Tz();                d = Juli();                if(d > 20)                {                    Cx(24); //舵机朝向设置  15:前 24:左 6:右                    zcjl = Juli();                    Cx(6);  //舵机朝向设置  15:前 24:左 6:右                    ycjl = Juli();                    if((zcjl > ycjl) & (zcjl > 20))                    {                        Zz();                        Cx(15);                        b = Juli();                        if(b > 20.0)                        {                            Qj();                        }                    }                    else if(ycjl > 20)                    {                        Yz();                        Cx(15);                        b = Juli();                        if(b > 20.0)                        {                            Qj();                        }                    }                }                delay1ms(80);            }        }        if(P16 == 0)        {            Tz();            Cx(10);            while(P16 == 0)            {//              Tz();                e = Juli();                         while (e < 15)                {                    CCAP0H = 0x5f;                    CCAP1H = 0x5f;                    P37 = 1;                    P36 = 1;                    e = Juli();                    delay1ms(80);                }                P37 = P36 = 0;                              Delay10ms(10);                CCAP1H = 0x80;                CCAP0H = 0xff;                if(P16 != 0)                {                    CCAP0H = 0x84;                    Cx(15);                }            }        }        if(P17 == 0)        {            Tz();            Cx(20);            while(P17 == 0)            {//              Tz();                e = Juli();                         while(e < 15)                {                    CCAP0H = 0x5f;                    CCAP1H = 0x5f;                    P37 = 1;                    P36 = 1;                    e = Juli();                    delay1ms(80);                }                P37 = P36 = 0;                Delay10ms(10);                CCAP0H = 0x80;                CCAP1H = 0xff;                if(P17 != 0)                {                    CCAP1H = 0x80;                    Cx(15);                }            }        }    }}void time0() interrupt 1{    flag = 1;}

以后要主攻STM32了,发现的确比STC要麻烦很多。

2 0