单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:968|回复:0

51单片机寻迹小车程序(光靶小车无激光)顺滑

[复制链接]
ID:1029873发表于 2023-5-24 12:47|显示全部楼层
识别硬币车停2 s声响灯亮后继续行驶,bc段加速,d处进内道,转到点停车,显示硬币数和停车时间
制作出来的实物图如下:
-51d2fa5a62039f89.jpg
51hei3.jpg
51hei2.jpg
51hei1.jpg


单片机源程序如下:
  1. /***************定义头文件专属区域*******************/

  2. #include< REGX51.H>//右键添加51头文件
  3. #include "Trace.h"//循迹驱动头文件
  4. #include "motor.h"//控制轮子转向头文件
  5. #include "oled.h"//OELD驱动头文件
  6. #include "bmp.h"//OLED图片头文件,没用到
  7. #include "Beep_Led_Ctrl.h"//蜂鸣器和LED的头文件

  8. /***************定义引脚专属区域*******************/
  9. sbit ENA = P2^0;//L298n上的ENA、ENB,需要拔掉跳帽,然后和单片机上面的IO口相接
  10. sbit ENB = P2^1;
  11. sbit STBY = P2^6;
  12. /***************定义变量专属区域*******************/
  13. unsigned char PWM;                                 //占空比

  14. extern unsigned char Speed_A;                 //全局变量,引用Trace.c当中的Speed_A和Speed_B
  15. extern unsigned char Speed_B;                 //在Trace.c中定义为电机A的速度和电机B的速度

  16. extern unsigned char Coin_Number;           //硬币数量

  17. unsigned int i;                                       //秒计时辅助变量
  18. unsigned char Second;                           //数秒(90秒停止)
  19. unsigned char Stop_Times;                       //停止时间显示
  20. /***************定时器0初始化函数*******************/
  21. void Timer0Init(void) //100微秒@12.000MHz
  22. {
  23.        TMOD& = 0xF0; //设置定时器模式
  24.        TMOD |= 0x02; //设置定时器模式
  25.        TL0 = 0x9C;       //设置定时初值
  26.        TH0 = 0x9C;       //设置定时重载值
  27.        TF0 = 0;       //清除TF0标志
  28.        TR0 = 1;       //定时器0开始计时
  29.        ET0 = 1;       //定时器0中断开关
  30.        EA = 1;             //中断总开关
  31. }
  32. /***************定时器0中断服务函数*******************/
  33. void Timer0Server() interrupt 1
  34. {
  35. /*  占空比调速程序:*/
  36.        PWM++;
  37.        if(PWM>=200)PWM = 0;
  38.        if(PWM< = Speed_A)  
  39.        {
  40.            ENA = 1;
  41.        }
  42.        else                      
  43.        {
  44.            ENA = 0;
  45.        }
  46.        if(PWM< = Speed_B)      
  47.        {      
  48.            ENB = 1;
  49.        }
  50.        else
  51.        {
  52.            ENB = 0;
  53.        }
  54.        /*计时秒程序*/
  55.        i++;
  56.        if(i >= 10000) {i = 0; Second++;if(Second>=90) Second = 90;}
  57.       
  58. }
  59. /***************主函数Main*******************/
  60. void main()
  61. {
  62.        Timer0Init();                 //定时器初始化
  63.        STBY = 1;                       //tb6612的STBY端口拉高电平,才能工作
  64.        BL_Ctrl_Init();                 //蜂鸣器和Led的初始化
  65.       
  66.        /*OLED初始化程序*/
  67.        OLED_Init();                 //初始化OLED
  68.        OLED_ColorTurn(0);           //0正常显示,1 反色显示
  69.        OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
  70.        OLED_ShowString(0,0,"YANGYU COOL!",8);//开始显示内容
  71.       
  72.        while(1)
  73.        {
  74.            Trace_Car();//引用Trace.c中的函数(灰度循迹逻辑控制)
  75.           
  76.            if(Second >=34&& Second< 35){Stop_Times = Second;}//使停止时间等于34s(正在数的时间),不能只写Stop_Times = Second;不然停止时间会随定时器数秒一起变化
  77.           
  78.            if(Second >=34&&Second< = 90)//34秒停止
  79.            {
  80.                  Speed_A = 0;
  81.                  Speed_B = 0;
  82.                  Stop();
  83.                  OLED_ShowString(0,0,"Car_Drive_Times:",8);
  84.                  OLED_ShowNum(103,0,Second,3,8);
  85.                  OLED_ShowString(0,1,"Car_Stop_Times: ",8);
  86.                  OLED_ShowNum(103,1,Stop_Times,3,8);
  87.                  OLED_ShowString(0,2,"Coin_Number: ",8);
  88.                  OLED_ShowNum(103,2,Coin_Number,3,8);
  89.            }
  90.            else if(Second > 90)//九十秒停车,其实上面可以把&&Second< = 90删掉,我是怕师傅要看有90s停下的程序
  91.            {
  92.                  Speed_A = 0;
  93.                  Speed_B = 0;
  94.                  Stop();
  95.                  OLED_ShowString(0,0,"Car_Drive_Times:",8);
  96.                  OLED_ShowNum(103,0,Second,3,8);
  97.                  OLED_ShowString(0,1,"Car_Stop_Times: ",8);
  98.                  OLED_ShowNum(103,1,Stop_Times,3,8);
  99.                  OLED_ShowString(0,2,"Coin_Number: ",8);
  100.                  OLED_ShowNum(103,2,Coin_Number,3,8);
  101.            }

  102.        }
  103.           
  104. }

复制代码

Keil代码下载:
Keil代码.7z(44.7 KB, 下载次数: 7)

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网