這次我做的一個智能小車項目,可以延著黑線循跡,小于50cm自動避障,計數等等功能。
小車的功能如下:
1)開關S1控制全功能按鈕。按一下開關S1開啟全功能模塊,長按S1, 2s及以上時間退出。全功能模塊主要包括循跡跟著黑色線循跡,小車根據紅外識別結果進行循跡;到達停止線之后結束循跡,執行繼續前行任務,然后路過黑色計數線,統計路過的黑線條數;接著繼續前行直到前方50cm遇到障礙物右轉;右轉之后遇到黑線停止;結束任務,結束之后4個LED 以二進制的形式顯示計數結果;
(2)開關 S2 為紅外控制按鈕。按一下開關S2開啟紅外測試模式,4個紅外對應4個燈,紅外檢測到黑線對應的燈亮;長按 S2,2s及以上時間退出;
(3)開關 S3 為電機控制按鈕。按一下開關 S3 電機正轉,車子全速往前走;連續按兩下開關S3電機反向,全速倒退;長按 S3,2s及以上時間退出;
(4)開關S4為電機控制按鈕。開啟S3的情況下。按一下 S4,車子轉速變為原來的一半,連續按兩下恢復原速。
在后面,我用了藍牙作為開關,實訓了用手機控制小車。
(5)這里用到3個定時器,寫的不好的地方,各位大佬多多指教.
代碼如下:
#include "wave.h"
#include "ray.h"
//定時器0用于pwm
void time0Init();//定時器0的初始化
void time0FW();
//定時器1用于藍牙模塊
void time1Init();//定時器1的初始化
void Bluetooth();//處理藍牙接收到的信息
uint pwm=60; //表示啟動的時間,60表示啟動60ms
uint toray=0;//是否開啟循跡功能
uint count=0; //用于計數
uchar bloothFlag;
void main(void)
{
EA=1;//打開總中斷
time0Init();//定時器0初始化
time2Init();//定時器2初始化
start();//使車的方向一開始向前
while(1)
{
time1Init();//定時器1初始化
if(toray)
ray();
if( bloothFlag%2)
{
wave();
}
if( bloothFlag%1)
{
time1Init();//定時器1初始化
}
if(count>=100) //100ms一個周期
count=0;
if(count<pwm) //pwm表示啟動的時間
//pwm越大 速度越快
forward();
else if(count>=pwm)
stop();
}
}
void time0Init()//定時器0的初始化.
//用于控制高低電平的時間
//定時器比較準確
{
TMOD|=0x01;//工作方式一
//用或運算是為了不改變
//定時器1對應位的值。
TH0=0xfc;
TL0=0x66; //定時1ms
ET0=1;//開啟定時器0的中斷
TR0=1;//啟動定時器0
}
void time0FW() interrupt 1 //定時器0的服務函數
{
TH0=0xfc;
TL0=0x66;
//1ms 中斷一次,count加一
count++;
}
void time1Init()//定時器1的初始化
{
TMOD=0x20;//定時器1,工作模式2,8位自動重裝模式
TH1=0xfd;//9600波特率,要與藍牙的一致
TL1=0xfd;
//串口通信方式1
SM0=0;
SM1=1;
PCON=0x00;//波特率不加倍
SCON=0x50;//工作方式一
REN=1;//允許接收
ES=1;//開啟串口中斷
TR1=1;//啟動定時1
}
void Bluetooth() interrupt 4 //中斷4
//處理藍牙接收到的信息
{
uchar shuju;
//等待接收完畢
while(!RI);//當RI為0時沒有接收完畢
//信息存存在sbuf中
shuju=SBUF;//獲取接收的信息
switch(shuju)
{
case 'f': //前進
forward();
break;
case 'b': //后退
back();
break;
case 'l': //左轉
turnLeft();
break;
case 'r': //右轉
turnRight();
break;
case 's': //停止
stop();
break;
case 'o':
start();
break;//啟動
case 't': //開啟循跡功能
toray=1;
break;
case 'z': //開啟避障功能
{
wave();
bloothFlag++;
}
break;
case '1': //一檔
pwm=20;
break;
case '2': //二檔
pwm=40;
break;
case '3': //三檔
pwm=60;
case '4': //四檔
pwm=80;
break;
case '5': //五檔
pwm=100;
break;
default:
break;
}
}
有寫的不好地方,請各位大佬多多指教
全部代碼51hei附件下載地址:
智能循跡避障小車.zip
(67.48 KB, 下載次數: 20)
2021-7-20 23:02 上傳
點擊文件名下載附件
智能循跡避障小車工程代碼 下載積分: 黑幣 -5
|