识别硬币车停2 s声响灯亮后继续行驶,bc段加速,d处进内道,转到点停车,显示硬币数和停车时间
制作出来的实物图如下:
单片机源程序如下:
- /***************定义头文件专属区域*******************/
- #include <REGX51.H>//右键添加51头文件
- #include "Trace.h"//循迹驱动头文件
- #include "motor.h"//控制轮子转向头文件
- #include "oled.h"//OELD驱动头文件
- #include "bmp.h"//OLED图片头文件,没用到
- #include "Beep_Led_Ctrl.h"//蜂鸣器和LED的头文件
- /***************定义引脚专属区域*******************/
- sbit ENA = P2^0;//L298n上的ENA、ENB,需要拔掉跳帽,然后和单片机上面的IO口相接
- sbit ENB = P2^1;
- sbit STBY = P2^6;
- /***************定义变量专属区域*******************/
- unsigned char PWM; //占空比
- extern unsigned char Speed_A; //全局变量,引用Trace.c当中的Speed_A和Speed_B
- extern unsigned char Speed_B; //在Trace.c中定义为电机A的速度和电机B的速度
- extern unsigned char Coin_Number; //硬币数量
- unsigned int i; //秒计时辅助变量
- unsigned char Second; //数秒(90秒停止)
- unsigned char Stop_Times; //停止时间显示
- /***************定时器0初始化函数*******************/
- void Timer0Init(void) //100微秒@12.000MHz
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x02; //设置定时器模式
- TL0 = 0x9C; //设置定时初值
- TH0 = 0x9C; //设置定时重载值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //定时器0中断开关
- EA = 1; //中断总开关
- }
- /***************定时器0中断服务函数*******************/
- void Timer0Server() interrupt 1
- {
- /* 占空比调速程序:*/
- PWM++;
- if(PWM>=200)PWM = 0;
- if(PWM <= Speed_A)
- {
- ENA = 1;
- }
- else
- {
- ENA = 0;
- }
- if(PWM <= Speed_B)
- {
- ENB = 1;
- }
- else
- {
- ENB = 0;
- }
- /*计时秒程序*/
- i++;
- if(i >= 10000) {i = 0; Second++;if(Second>=90) Second = 90;}
-
- }
- /***************主函数Main*******************/
- void main()
- {
- Timer0Init(); //定时器初始化
- STBY = 1; //tb6612的STBY端口拉高电平,才能工作
- BL_Ctrl_Init(); //蜂鸣器和Led的初始化
-
- /*OLED初始化程序*/
- OLED_Init(); //初始化OLED
- OLED_ColorTurn(0); //0正常显示,1 反色显示
- OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
- OLED_ShowString(0,0,"YANGYU COOL!",8);//开始显示内容
-
- while(1)
- {
- Trace_Car();//引用Trace.c中的函数(灰度循迹逻辑控制)
-
- if(Second >=34 && Second <35){Stop_Times = Second;}//使停止时间等于34s(正在数的时间),不能只写Stop_Times = Second;不然停止时间会随定时器数秒一起变化
-
- if(Second >=34&&Second <= 90)//34秒停止
- {
- Speed_A = 0;
- Speed_B = 0;
- Stop();
- OLED_ShowString(0,0,"Car_Drive_Times:",8);
- OLED_ShowNum(103,0,Second,3,8);
- OLED_ShowString(0,1,"Car_Stop_Times: ",8);
- OLED_ShowNum(103,1,Stop_Times,3,8);
- OLED_ShowString(0,2,"Coin_Number: ",8);
- OLED_ShowNum(103,2,Coin_Number,3,8);
- }
- else if(Second > 90)//九十秒停车,其实上面可以把&&Second <= 90删掉,我是怕师傅要看有90s停下的程序
- {
- Speed_A = 0;
- Speed_B = 0;
- Stop();
- OLED_ShowString(0,0,"Car_Drive_Times:",8);
- OLED_ShowNum(103,0,Second,3,8);
- OLED_ShowString(0,1,"Car_Stop_Times: ",8);
- OLED_ShowNum(103,1,Stop_Times,3,8);
- OLED_ShowString(0,2,"Coin_Number: ",8);
- OLED_ShowNum(103,2,Coin_Number,3,8);
- }
- }
-
- }
复制代码
Keil代码下载:
Keil代码.7z
(44.7 KB, 下载次数: 7)
|