51循迹小车+蓝牙

举报
ReCclay 发表于 2022/02/21 23:45:29 2022/02/21
【摘要】 给女朋友调的循迹车。。。 /* ******************************************************************************* * 文...

给女朋友调的循迹车。。。


/*
*******************************************************************************
* 文件名:main.c
* 描  述:寻迹小车
* 作  者:刘悦
* 版本号:v1.2
* 日  期: 2018年5月11日
* 备  注:注意了,所有的左右都是传感器位于自己前方看的!
*******************************************************************************
*/
#include <stc12.h>

//关于寻迹、蓝牙,取消哪个宏定义表示选择哪项模式
#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<OutPWM_L)
    {   
        MotorLeft_Go();
    }
    else
    {
        MotorLeft_Stop();
    }
    if(Clck<OutPWM_R)
    {
        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<OutPWM_L)
    {   
        MotorLeft_Back();
    }
    else
    {
        MotorLeft_Stop();
    }
    if(Clck<OutPWM_R)
    {
        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<OutPWM_L)
    {   
        MotorLeft_Go();
    }
    else
    {
        MotorLeft_Stop();
    }
    if(Clck<OutPWM_R)
    {
        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<OutPWM_L)
    {   
        MotorLeft_Back();
    }
    else
    {
        MotorLeft_Stop();
    }
    if(Clck<OutPWM_R)
    {
        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<OutPWM_L)
    {   
        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<OutPWM_R)
    {
        MotorRight_Go();    
    }
    else 
    {
        MotorRight_Stop();  
    }
}

void Stop()
{
    MotorLeft_Stop();
    MotorRight_Stop();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/80290266

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。