循迹小车程序(三路循迹)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit p2_0 = P2^0; //开关
sbit p2_1 = P2^1; //红外检测
sbit p2_2 = P2^2;
sbit p2_3 = P2^3;
sbit p1_0 = P1^0; //电机驱动
sbit p1_1 = P1^1;
sbit p1_2 = P1^2;
sbit p1_3 = P1^3;
sbit pwm1 = P1^4; //pwm调速
sbit pwm2 = P1^5;
unsigned char timer1;
/******************************************************************** ***********
* 函数名 : Time1Config
* 函数功能 : 设置定时器
* 输入 : 无
* 输出 : 无
********************************************************************* **********/
void Time1Config()
{
TMOD|= 0x10; //设置定时计数器工作方式1为定时器
//--定时器赋初始值,12MHZ下定时0.5ms--//
TH1 = 0xFE;
TL1 = 0x0C;
ET1 = 1; //开启定时器1中断
EA = 1;
TR1 = 1; //开启定时器
}
/************************************************ 延时函数
总共延时
1ms
乘以
count
************************************************/ void DelayX1ms(uint count)
{
uint j;
while(count--!=0)
{
for(j=0;j<72;j++);
}
}
/************************************************ 电机转动函数定义
************************************************/ void ZhiXing( )
{
p1_0=0;
p1_1=0;
p1_2=0;
p1_3=0;
DelayX1ms(10);
p1_0=0;
p1_1=1;
p1_2=0;
p1_3=1;
DelayX1ms(15);
}
void ZuoZhuan( )
{
pwm1=0;
pwm2=0;
DelayX1ms(10); p1_0=0;
p1_1=1;
p1_2=1;
p1_3=0;
DelayX1ms(20); }
void YouZhuan( )
{
pwm1=0;
pwm2=0;
DelayX1ms(10);
p1_0=1;
p1_1=0;
p1_2=0;
p1_3=1;
DelayX1ms(20); }
void HouTui( )
{
p1_0=0;
p1_1=0;
p1_2=0;
p1_3=0;
DelayX1ms(6); p1_0=1;
p1_1=0;
p1_2=1;
p1_3=0;
DelayX1ms(20);
}
/************************************************ 主函数
************************************************/ void main( )
{
Time1Config();
while(1)
{
if( p2_1==0 && p2_2==0 && p2_3==1)
{
YouZhuan( );
}
else if(p2_1==1 && p2_2==0 && p2_3==0)
{
ZuoZhuan( );
}
else
{
ZhiXing( );
}
}
}
/******************************************************************** ***********
* 函数名 : Time1
* 函数功能 : 定时器1的中断函数
* 输入 : 无
* 输出 : 无
********************************************************************* **********/
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
timer1++;
if(timer1>100) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < 85) //改变30这个值可以改变直流电机的速度
{
pwm1=1;
pwm2=1;
}
else
{
pwm1=0;
pwm2=0;
}
TH1 = 0xFE; //重新赋初值
TL1 = 0x0C;
}