stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头
1、實驗?zāi)康?#xff1a;
利用stc8a8k的內(nèi)置硬件PWM,這里用到P20,P21產(chǎn)生PWM,調(diào)節(jié)占空比,調(diào)小車速度;
熟悉按鍵和IO口的讀取功能;
2、實現(xiàn)效果,
按下按鍵開始,兩秒后,小車啟動,然后循跡,到達2終點,達到以1為起點,2為終點,在2地方調(diào)頭,然后繼續(xù)循跡的功能。
3、接線:
(1)5個循跡模塊
循跡模塊不拘于其他型號,循跡就行。
從左邊都右邊,名字是L1S,意思是左邊第一個傳感器,left1sensor.
L1S–L0S–MS–R0S–R1S
分別接到
P10–P11–P12–P13–P14
(2)小車的電機接線
接驅(qū)動模塊的輸出端
1)左邊輪子的兩根線:接
AO2 AO1,
調(diào)速線用P20
P04----AIN2
P05----AIN1
,電路板原理圖,看原理圖,已連接;
2)右邊輪子的兩根線:接
BO2 BO1,調(diào)速用P21,
P06—BIN1
P07----BIN2
電路板原理圖已連接,看原理圖;
3)VM和VCC用跳線帽短接;給電機使用
(3)電源接線
外面電源大于5V。
電池正極----INPOWER
電池負(fù)極----GND
通過7805降壓模塊,降到5V,給單片機的電壓。
(4)屏幕,直插到對應(yīng)排母端口;
(5)下載器,插到對應(yīng)的下載端口。
(6)按鍵,根據(jù)自己喜歡進行接線,這里用的是連接到P34的那個按鍵。
4、編程思路:
(1)測試PWM是不是正常,可以調(diào)節(jié)占空比;
(2)調(diào)試的時候,如果電機的正轉(zhuǎn)、反轉(zhuǎn)和我們的程序設(shè)定的不一樣,那么可以對換兩根電機的線,比如電機線A接到AO2,電機線B接到AO1,那么就對換一下,A接到AO1,B接到AO2。
(3)流程圖:
(3)測試程序1
//*****************************************************************************************************下面是主函數(shù) //*******************************************主函數(shù) void main() {//每個外設(shè),比如按鍵,屏幕,PWM等內(nèi)部資源的初始化,配置一下環(huán)境OLED_Init();HPWM_Init();OLED_ShowString(0,0,"Press Start,Please..."); delay_tms(100);//*********************************************正式執(zhí)行程序while(1){ //*****************************//檢測按鍵是不是按下,開始啟動if(key==0){delay_tms(10);//延時去抖動if(key==0){ startflag=1;OLED_ShowString(0,0,"I am running,GO,GO..."); stop();delay_tms(2000);//延時,按下兩秒之后,小車開始啟動進行循跡} } //**********************如果開始標(biāo)記等于1,說明按下啟動鍵,這時候小車才開始跑if(startflag==1){//開始循跡,請看這部分代碼,太長了,單獨拉出來寫,方便看主程序邏輯 qianjin(vturnsmallM,vturnbigM);//左da轉(zhuǎn)彎,轉(zhuǎn)到碰到中線停止delay_tms(2000);stop();delay_tms(2000);//延時,按下兩秒之后,小車開始啟動進行循跡qianjin(vturnsmall,vturnbig);//左da轉(zhuǎn)彎,轉(zhuǎn)到碰到中線停止delay_tms(2000);stop();delay_tms(2000);//延時,按下兩秒之后,小車開始啟動進行循跡//開始循跡,請看這部分代碼,太長了,單獨拉出來寫,方便看主程序邏輯 qianjin(vturnbigM,vturnsmallM);//左da轉(zhuǎn)彎,轉(zhuǎn)到碰到中線停止delay_tms(2000);stop();delay_tms(2000);//延時,按下兩秒之后,小車開始啟動進行循跡qianjin(vturnbig,vturnsmall);//左da轉(zhuǎn)彎,轉(zhuǎn)到碰到中線停止delay_tms(2000);stop();delay_tms(2000);//延時,按下兩秒之后,小車開始啟動進行循跡// trackline0(); }} }測試是不是能夠正常大轉(zhuǎn)彎,小轉(zhuǎn)彎,直接行走
最后程序2
#include<stc8a8k.h> #include<oled.h> #include<delay.h> #include "hpwm.h" //***************************************************************************下面是接線定義 //左電機 sbit LPWM=P2^0;//電機調(diào)節(jié)速度的信號 sbit LA2=P0^4; sbit LA1=P0^5; //右電機 sbit RPWM=P2^1; sbit RA2=P0^6; sbit RA1=P0^7; //接傳感器 sbit L1S=P1^0; sbit L0S=P1^1; sbit MS=P1^2; sbit R0S=P1^3; sbit R1S=P1^4; //************************************* sbit key=P3^4;//接按鍵 sbit beep=P0^3;//接蜂鳴器 sbit led=P0^0;//接LED報警燈//****************************************************************************下面是全局變量的定義,每個函數(shù)都能使用 //定義黑白線的信號,根據(jù)實際模塊定義,1是高電平,0是低電平,后面如果換模塊, //不同模塊的情況不一樣,有些是碰到黑線是1,有些是0,就很容易修改 unsigned char blackline=1; unsigned char whiteline=0; unsigned char startflag=0; //這里定義變量,后面如果小車需要調(diào)節(jié)速度,比較方便修改,直接改這里就好了。 float vleftmove=0.4; float vrightmove=0.4;//直線行走的速度float vturnbig=0.55; float vturnsmall=0.25;//轉(zhuǎn)彎的速度差速度,一個是大,一個小,小轉(zhuǎn)彎差速度float vturnbigM=0.75; float vturnsmallM=0.1;//轉(zhuǎn)彎的速度差速度,大轉(zhuǎn)彎差速度 //**************************************************************************************************下面是子函數(shù)的定義、或者聲明 //循跡函數(shù)聲明,先聲明后定義,不然main都不知道有這個函數(shù),在main函數(shù)后面定義具體程序代碼 //****************************************************************子函數(shù)0:函數(shù)聲明;void trackline0(); void trackline0(); //****************************************************************子函數(shù)1:qianjin(float vleft,float vright) //這個是定義,不聲明,后面main函數(shù)可以直接用, //小車前進,根據(jù)速度兩個輪子速度差,進行前進,轉(zhuǎn)彎等 void qianjin(float vleft,float vright) {HPWM_Set(0,8000,vleft);LA2=1;LA1=0;HPWM_Set(1,8000,vright);RA2=1;RA1=0;} //****************************************************************子函數(shù)2:void back(float vleft,float vright) //小車后退程序,一個輪子正轉(zhuǎn),一個反轉(zhuǎn) void back(float vleft,float vright) {HPWM_Set(0,8000,vleft);LA2=0;LA1=1;HPWM_Set(1,8000,vright);RA2=1;RA1=0;} //****************************************************************子函數(shù)3:void stop() //小車停止 void stop() { LA2=0;LA1=0;RA2=0;RA1=0; } //*****************************************************************************************************下面是主函數(shù) //*******************************************主函數(shù) void main() {//每個外設(shè),比如按鍵,屏幕,PWM等內(nèi)部資源的初始化,配置一下環(huán)境OLED_Init();HPWM_Init();OLED_ShowString(0,0,"Press Start,Please..."); delay_tms(100);//*********************************************正式執(zhí)行程序while(1){ //*****************************//檢測按鍵是不是按下,開始啟動if(key==0){delay_tms(10);//延時去抖動if(key==0){ startflag=1;OLED_ShowString(0,0,"I am running,GO,GO..."); stop();delay_tms(2000);//延時,按下兩秒之后,小車開始啟動進行循跡} } //**********************如果開始標(biāo)記等于1,說明按下啟動鍵,這時候小車才開始跑if(startflag==1){//開始循跡,請看這部分代碼,太長了,單獨拉出來寫,方便看主程序邏輯 trackline0(); }} }//***********************************下面是前面聲明的函數(shù)的定義 //**************************************************************//函數(shù)定義trackline0(); //**************************************************************功能:按鍵循跡; void trackline0() { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第1種情況if(L1S==blackline &&L0S==whiteline && MS==whiteline && R0S==whiteline&& R1S==whiteline)//1 0 0 0 0 {qianjin(vturnsmallM,vturnbigM);//左da轉(zhuǎn)彎,轉(zhuǎn)到碰到中線停止while(1){if(MS==blackline)break;}} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第2種情況else if(L1S==whiteline &&L0S==blackline && MS==whiteline && R0S==whiteline&& R1S==whiteline)//0 1 0 0 0 {qianjin(vturnsmall,vturnbig);//左xiao轉(zhuǎn)彎} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第3種情況else if(L1S==whiteline &&L0S==whiteline && MS==blackline && R0S==whiteline&& R1S==whiteline)//00 1 0 0 {qianjin(vleftmove,vleftmove);//直走} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第4種情況 else if(L1S==whiteline &&L0S==whiteline && MS==whiteline && R0S==blackline&& R1S==whiteline)//0 0 0 1 0 {qianjin(vturnbig,vturnsmall);//左xiao轉(zhuǎn)彎vturnbig vturnsmall} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第5種情況else if(L1S==whiteline &&L0S==whiteline && MS==whiteline && R0S==whiteline&& R1S==blackline)//1 0 0 0 0 {qianjin(vturnbigM ,vturnsmallM);//左da轉(zhuǎn)彎vturnbigM vturnsmallM,碰到黑線,不然一直大轉(zhuǎn)彎while(1){if(MS==blackline)break;}} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第6種情況 else if(L1S==blackline && L0S==blackline && R0S==whiteline )//11x00 判斷是左轉(zhuǎn)90度{stop();delay_tms(500);qianjin(vturnsmall,vturnbig);//左轉(zhuǎn)彎delay_tms(100);while(1){ if(R0S==blackline)break;} } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第7種情況else if( L1S==whiteline &&L0S==whiteline &&R0S==blackline && R1S==blackline)//00x11 判斷是右轉(zhuǎn)90度{stop();delay_tms(1000);qianjin(vturnbig,vturnsmall);//delay_tms(10);while(1) { if(L0S==blackline)break;}} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第8種情況else if(L1S==blackline &&L0S==blackline&& MS==blackline && R0S==blackline)//1111x 判斷是終點,調(diào)頭{qianjin(vleftmove,vleftmove);delay_tms(500);stop();delay_tms(1000);back(vleftmove,vleftmove);delay_tms(500);while(1)//如果中間的傳感器碰到黑線,就跳出循環(huán){ if(MS==blackline)break; }} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++第9種情況 這是極端情況,放在最后面判斷else if(L1S==whiteline &&L0S==whiteline && MS==whiteline && R0S==whiteline && R1S==whiteline)//000找不到直線,如如果前面是直走,就轉(zhuǎn)360度,如果是之前右邊,就左轉(zhuǎn),之前左偏,就右轉(zhuǎn){qianjin(vturnbig,vturnsmall);//}}總結(jié)
以上是生活随笔為你收集整理的stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab小波分析时频谱图 声音时频信
- 下一篇: DWM1000 帧过滤代码实现