循迹小车程序.docx

上传人:b****8 文档编号:23823402 上传时间:2023-05-21 格式:DOCX 页数:16 大小:17.21KB
下载 相关 举报
循迹小车程序.docx_第1页
第1页 / 共16页
循迹小车程序.docx_第2页
第2页 / 共16页
循迹小车程序.docx_第3页
第3页 / 共16页
循迹小车程序.docx_第4页
第4页 / 共16页
循迹小车程序.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

循迹小车程序.docx

《循迹小车程序.docx》由会员分享,可在线阅读,更多相关《循迹小车程序.docx(16页珍藏版)》请在冰豆网上搜索。

循迹小车程序.docx

循迹小车程序

/***********循迹小车程序****************************dragon******************/

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcount0=0;//低电平的占空比

ucharcount1=0;//高电平的占空比

ucharcount;//0.5ms次数标识

ucharjd;//角度标识

ucharjia;

ucharjian;

ucharjl;

bitFlag=1;//电机正反转标志位,1正转,0反转

sbitb=P0^4;//闪灯

sbitpwm=P1^1;//舵机控制信号

sbitKey_add=P3^5;//电机减速

sbitKey_dec=P3^6;//电机加速

sbitKey_turn=P3^4;//电机换向

sbitKey_stop=P3^7;//停车

sbitKey_been=P1^7;//喇叭按键

sbitbeen=P1^2;//蜂鸣器引脚

sbitrclf=P3^6;//循迹红外

sbitrcrt=P3^7;

sbitjz=P3^5;

sbitPWM1=P1^4;//PWM通道1,反转脉冲

sbitPWM2=P1^3;//PWM通道2,正转脉冲

sbitPWM3=P1^6;//PWM通道3,反转脉冲

sbitPWM4=P1^5;//PWM通道4,正转脉冲

/************函数声明**************/

voidDelay(ucharx);

voidMotor_speed_high(void);

voidMotor_speed_low(void);

voidMotor_turn(void);

/****************延时处理**********************/

voidDelay(ucharx)

{

uchary;

for(;x>0;x--)

for(y=110;y>0;y--);

}

/*******按键处理加pwm占空比,电机加速**********/

voidMotor_speed_high(void)//

{

if(Key_add==0)

{

Key_add=1;

count0+=5;

if(count0>=100)

{

count0=100;

}

}

}

/******按键处理减pwm占空比,电机减速*****/

voidMotor_speed_low(void)

{

if(Key_dec==0)

{

Key_dec=1;

count0-=5;

if(count0<=0)

{

count0=0;

}

}

}

 

/************电机正反向控制**************/

voidMotor_turn(void)

{

if(Key_turn==0)

{

Key_turn=1;

Flag=~Flag;

}

}

/************电机运行**************/

voidMotor_run(void)

{

if(Flag==1)//电机正转

{

PWM1=1;

PWM3=1;

if(++count1

{

PWM2=0;

PWM4=0;

}

else

{

PWM2=1;

PWM4=1;

}

if(count1>=100)

{

count1=0;

}

}

else//电机反转

{

PWM2=1;

PWM4=1;

if(++count1

{

PWM1=0;

PWM3=0;

}

else

{

PWM1=1;

PWM3=1;

}

if(count1>=100)

{

count1=0;

}

}

}

/************舵机控制**************/

voidMotor_duoji(void)

{

if(jia==1)

{

jia=0;

jd+=1;

count=0;//20秒周期从新开始

if(jd>=16)

jd=16;

}

if(jian==1)

{

jian=0;

jd-=1;

count=0;

if(jd<=12)

jd=12;

}

}

/************停车**************/

voidMotor_stop(void)

{

if(Key_stop==0)

{

Key_stop=1;

count0=0;

}

}

/************喇叭**************/

voidbeen_scan(void)

{

ucharm=500;

if(Key_been==0)

{

Key_been=1;

while(m--)

{

been=1;

Delay

(1);

been=0;

Delay

(1);

}

}

}

/**********************红外部分*************************************/

ucharirtime;//红外时间

ucharstartflag;//启动接收

ucharirdata[33];

ucharbitnum;

ucharirreceiveok;//红外接收完毕

ucharircode[4];

ucharirprosok;

 

voidirpros(void)//1.125ms/0.2777=4.39=4.05个irtime(数据零)

{

uchark,i,j;

ucharvalue;

k=1;//跳过引导码

for(j=0;j<4;j++)

{

for(i=0;i<8;i++)

{

value=value>>1;//7次

if(irdata[k]>6)//8次

{

value=value|0x80;

}

k++;

}

ircode[j]=value;

}

irprosok=1;

}

voidir_scan(void)

{

if(irreceiveok)

{

irpros();

irreceiveok=0;

}

if(irprosok)

{

irprosok=0;

}

if(ircode[3]==0xf7)

{

Key_turn=0;

ircode[3]=0;

}

if(ircode[3]==0xe6)

{

Key_dec=0;

ircode[3]=0;

}

if(ircode[3]==0xe5)

{

Key_add=0;

ircode[3]=0;

}

if(ircode[3]==0xff)

{

Key_stop=0;

ircode[3]=0;

}

if(ircode[3]==0xfb)

{

Key_been=0;

ircode[3]=0;

}

if(ircode[3]==0xf6)

{

jia=1;

ircode[3]=0;

}

if(ircode[3]==0xf5)

{

jian=1;

ircode[3]=0;

}

}

voidir_ch(void)

{

//if(rclf==1&&rcrt==0&&jd==13&&jl==0)

//{

//jl=1;

//count0=30;

//jia=1;

//}

//if(rcrt==1&&rclf==0&&jd==14&&jl==1)

//{

//count0=30;

//jian=1;

//}

//if(rcrt==1&&rclf==0&&jd==13&&jl==0)

//{

//jl=2;

//count0=30;

//jian=1;

//}

//if(rclf==1&&rcrt==0&&jd==12&&jl==2)

//{

//count0=30;

//jia=1;

//}

//

//if(rclf==0&&rcrt==0&&jd==13)

//

//{

//jl=0;

//jd=13;

//count0=100;

//}

//if(rclf==1&&rcrt==1&&jd==13)

//

//{

//jl=0;

//jd=13;

//count0=100;

//}

if(jz==1)

jd=14;

if(rclf==1&&rcrt==0&&jd==14)

{

count0=100;

jd=13;

}

if(rcrt==1&&rclf==0&&jd==13)

{

count0=100;

jd=15;

}

if(rcrt==1&&rclf==0&&jd==14)

{

count0=100;

jd=15;

}

if(rclf==1&&rcrt==0&&jd==15)

{

count0=100;

jd=13;

}

if(rclf==0&&rcrt==0&&jd==14)

{

count0=70;

}

//if(rclf==1&&rcrt==1&&jd==14)

//

//{

//

//count0=70;

//}

}

/***********定时器***********/

voidtimer0init(void)//定时器0初始化

{

TMOD=0X21;//定时器0工作1定时器1工作2

TH0=0Xff;//高第八位清零

TH1=0X00;//高第八位清零

TL0=0Xa4;

TL1=0X00;

EA=1;//打开全局中断允许位(中断允许寄存器IE)

TR0=1;//寄存器TCON,置一启动定时器0

TR1=1;//启动定时器1

ET0=1;//允许定时器0中断

ET1=1;//允许定时器1中断

}

voidint0init(void)//外部中断0初始化

{

IT0=1;//置一,跳变沿触犯方式,引脚INT0上,下降沿的负跳变有效

EX0=1;//外部中断0中断允许位

EA=1;//全局中断允许位

}

voidTime0_Int()interrupt1

{

TH0=0xff;

TL0=0xa4;

if(count

pwm=1;

else

pwm=0;

count+=1;

count=count%100;

}

voidtimer0()interrupt3//定时器0,初值自动重装的8位定时器

{//最大计数值256,2的8次方

irtime++;//256//每加一,计数256次,计数一次时间为0.001085069ms

}//每加一,计数256次,共需0.2777ms

voidint0()interrupt0//外部中断0(INT0)

{

if(startflag)

{

b=~b;

if(irtime>32)//说明收到的是引导码13.5ms(引导码)/0.2777=48.7个irtime

{

bitnum=0;

}

irdata[bitnum]=irtime;

irtime=0;

bitnum++;

if(bitnum==33)

{

bitnum=0;

irreceiveok=1;

}

}

else

{

startflag=1;

irtime=0;

}

}

/*********主函数********************/

voidmain(void)

{

timer0init();//定时器0初始化

int0init();//外部中断0初始化

jd=14;

count=0;

Delay(5);

while

(1)

{

ir_scan();

ir_ch();

Motor_duoji();

Motor_turn();

Motor_speed_high();

Motor_speed_low();

Motor_run();

Motor_stop();

been_scan();

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1