識別硬幣車停2 s聲響燈亮后繼續行駛,bc段加速,d處進內道,轉到點停車,顯示硬幣數和停車時間
制作出來的實物圖如下:
-51d2fa5a62039f89.jpg (839.97 KB, 下載次數: 28)
下載附件
2023-5-24 12:38 上傳
51hei3.jpg (507.57 KB, 下載次數: 28)
下載附件
2023-5-27 16:04 上傳
51hei2.jpg (492.01 KB, 下載次數: 31)
下載附件
2023-5-27 16:04 上傳
51hei1.jpg (520.04 KB, 下載次數: 25)
下載附件
2023-5-27 16:04 上傳
單片機源程序如下:
- /***************定義頭文件專屬區域*******************/
- #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)
2023-5-27 16:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|