標(biāo)題:
小車直線行駛單片機(jī)編程
[打印本頁(yè)]
作者:
heruojun760
時(shí)間:
2019-7-13 16:19
標(biāo)題:
小車直線行駛單片機(jī)編程
小車直線行駛編程部分
單片機(jī)源程序如下:
#include "REG52.H"
#include <intrins.h> //包含nop等系統(tǒng)函數(shù)
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
//按鍵引腳定義
sbit key = P2^0;
//定義電機(jī)引腳
sbit Left_motor_go=P2^4; //左電機(jī)前進(jìn)AIN2
sbit Left_motor_back=P2^3; //左電機(jī)后退AIN1
sbit Right_motor_go=P2^1; //右電機(jī)前進(jìn)BIN2
sbit Right_motor_back=P2^2; //右電機(jī)后退BIN1
sbit TrackSensorLeftPin2 = P1^1;
sbit TrackSensorLeftPin1 = P1^0;
sbit TrackSensorRightPin1 = P1^2;
sbit TrackSensorRightPin2 = P1^3;
//紅外傳感器采集的數(shù)據(jù)變量
uchar SensorValue1;
uchar SensorValue2;
uchar SensorValue3;
uchar SensorValue4;
//定義角度值
int myangle = 0;//舵機(jī)角度定義
int servo_p = 0;
//定義舵機(jī)引腳
sbit ServoPin=P0^6;
uchar pwm_val_left =0;//變量定義
uchar pwm_val_right =0;
uchar set_pwm_val_left = 0;
uchar set_pwm_val_right = 0;
sbit LED1 = P2^5;
sbit LED2 = P2^6;
/*
* 毫秒級(jí)延時(shí)
*/
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
/*
* 舵機(jī)函數(shù)
*/
void set_angle(int angle)
{
if(angle > 18)
angle = 18;
if(angle < 8)
angle = 8;
myangle = angle;
}
/*
* 電機(jī)運(yùn)行程序,僅支持電機(jī)正轉(zhuǎn)
*/
void run(uchar left_speed,uchar right_speed)
{
if(left_speed >100)
left_speed = 100;
if(right_speed >100)
right_speed = 100;
set_pwm_val_left = left_speed;
set_pwm_val_right = right_speed;
return;
}
/*
* 傳感器值獲取函數(shù),將引腳值賦值給變量以防止誤寫引腳狀態(tài)。
*/
void get_sensor(void)
{
SensorValue1 = TrackSensorLeftPin1;
SensorValue2 = TrackSensorLeftPin2;
SensorValue3 = TrackSensorRightPin1;
SensorValue4 = TrackSensorRightPin2;
}
/*
* 發(fā)車按鍵,調(diào)用此函數(shù),若按鍵未按下,則程序一直死在此函數(shù)
*/
void key_scan(void)
{
while (key!=0); //當(dāng)按鍵沒(méi)有被按下一直循環(huán)
while (key==0) //當(dāng)按鍵被按下時(shí)
{
delay(10); //延時(shí)10ms
if (key==0) //第二次判斷按鍵是否被按下
{
delay(100);
while (key==0); //判斷按鍵是否被松開(kāi)
}
}
}
/*
* 初始化函數(shù)
*/
void init(void)
{
//定時(shí)器0控制車速
TMOD|=0X01; //定時(shí)器0工作方式1
TH0=0XFF; //100us定時(shí),裝入初值
TL0=0XA3;
TR0=1; //啟動(dòng)T0工作
ET0=1; //允許T0中斷
EA =1; //開(kāi)總中斷
//舵機(jī)引腳初始化為高電平
Left_motor_back = 0; //關(guān)反向電橋
Right_motor_back = 0;
ServoPin=1; //舵機(jī)電平拉高
set_angle(13); //舵機(jī)初始狀態(tài)對(duì)正
}
/*
* 方波生成邏輯
*/
void timer0() interrupt 1
{
TH0=0XFF; //100Us定時(shí)
TL0=0XA3;
servo_p++;
//舵機(jī)處理部分
if(servo_p <= myangle)
{
ServoPin=1;
}
else if(servo_p < 200)
{
ServoPin=0;
}
else
{
servo_p = 0;
}
pwm_val_left++;
if(pwm_val_left<set_pwm_val_left)
{
Left_motor_go = 1;
}
else if(pwm_val_left<100)
{
Left_motor_go = 0;
}
else
{
pwm_val_left = 0;
}
pwm_val_right++;
if(pwm_val_right<set_pwm_val_right)
{
Right_motor_go = 1;
}
else if(pwm_val_right<100)
{
Right_motor_go = 0;
}
else
{
pwm_val_right = 0;
}
}
//簡(jiǎn)單實(shí)現(xiàn)循跡樣例
void sensor_adjust(void)
{
//更新傳感器狀態(tài),必須有
get_sensor();
if((SensorValue2 == 1)&&(SensorValue3 == 1))
{
set_angle(13);
}
if((SensorValue2 == 1)&&(SensorValue3 == 1)&&(SensorValue1 == 1)&&(SensorValue4 == 1))
{
set_angle(13);
run(0,0);
}
if(SensorValue1 == 1)
{
if(SensorValue2 == 1)
set_angle(12);
else
set_angle(11);
}
else if(SensorValue2 == 1)
{
set_angle(12);
}
else if(SensorValue3 == 1)
{
set_angle(14);
}
else if(SensorValue4 == 1)
{
if(SensorValue3 == 1)
set_angle(13);
else
set_angle(14);
}
}
void main()
{
init();
key_scan();
run(35,35);
//調(diào)用按鍵掃描函數(shù)
while(1)
{
sensor_adjust();
}
}
復(fù)制代碼
程序51hei提供下載:
第三.zip
(31.16 KB, 下載次數(shù): 6)
2019-7-13 16:18 上傳
點(diǎn)擊文件名下載附件
小車直線行駛
下載積分: 黑幣 -5
作者:
admin
時(shí)間:
2019-7-13 23:40
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者:
huihuisun
時(shí)間:
2019-10-9 09:34
學(xué)習(xí)參考一下
作者:
zjd5195
時(shí)間:
2019-10-11 20:52
學(xué)習(xí)了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1