智能小车速度控制程序.doc
《智能小车速度控制程序.doc》由会员分享,可在线阅读,更多相关《智能小车速度控制程序.doc(6页珍藏版)》请在冰豆网上搜索。
![智能小车速度控制程序.doc](https://file1.bdocx.com/fileroot1/2022-11/3/91cf7cf2-03be-40c7-b18f-0604270c4750/91cf7cf2-03be-40c7-b18f-0604270c47501.gif)
/****************************************************************************
简单寻迹程序:
接法
EN1EN2PWM输入端,本程序不输入PWM,直接使插上跳线帽,使能输出,这样就能全速运行
接上测速模块
测速模块电源+5VGND取自于单片机板靠近液晶调节对比度的电源输出接口
把测速模块输出OUT1OUT2接入单片机P3。
2P3。
3
P1_0P1_1接IN1IN2当P1_0=1,P1_1=0;时左上电机正转 左上电机接驱动板子输出端(蓝色端子OUT1OUT2)
P1_0P1_1接IN1IN2当P1_0=0,P1_1=1;时左上电机反转
P1_0P1_1接IN1IN2当P1_0=0,P1_1=0;时左上电机停转
P1_2P1_3接IN3IN4当P1_2=1,P1_3=0;时左下电机正转 左下电机接驱动板子输出端(蓝色端子OUT3OUT4)
P1_2P1_3接IN3IN4当P1_2=0,P1_3=1;时左下电机反转
P1_2P1_3接IN3IN4当P1_2=0,P1_3=0;时左下电机停转
P1_4P1_5接IN5IN6当P1_4=1,P1_5=0;时右上电机正转 右上电机接驱动板子输出端(蓝色端子OUT5OUT6)
P1_4P1_5接IN5IN6当P1_4=0,P1_5=1;时右上电机反转
P1_4P1_5接IN5IN6当P1_4=0,P1_5=0;时右上电机停转
P1_6P1_7接IN7IN8当P1_6=1,P1_7=0;时右下电机正转 右下电机接驱动板子输出端(蓝色端子OUT7OUT8)
P1_6P1_7接IN7IN8当P1_6=0,P1_7=1;时右下电机反转
P1_6P1_7接IN7IN8当P1_6=0,P1_7=0;时右下电机停转
P3_2接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
P3_3接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2
P3_4接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
P3_5接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
四路寻迹传感器有信号(白线)为0没有信号(黑线)为1
四路寻迹传感器电源+5VGND取自于单片机板靠近液晶调节对比度的电源输出接口
关于单片机电源:
本店驱动模块内带LDO稳压芯片,当电池输入6V时时候可以输出稳定的5V
分别在针脚标+5与GND。
这个输出电源可以作为单片机系统的供电电源。
****************************************************************************/
#include
#defineLeft_1_ledP3_4 //P3_2接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
#defineLeft_2_ledP3_5 //P3_3接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2
#defineRight_1_ledP3_6 //P3_4接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
#defineRight_2_ledP3_7 //P3_5接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}//左边两个电机向前走
#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左边两个电机向后转
#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左边两个电机停转
#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右边两个电机向前走
#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右边两个电机向前走
#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右边两个电机停转
sbitled1=P2^0;
sbitled2=P2^1;
sbitled3=P2^2;
sbitled4=P2^3;
unsignedcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管断码
unsignedcodedis[]={0xfe,0xfd,0xfb,0xf7}; //扫描数码管客值
unsignedchardisbuff[5]={0};
unsignedchartime=0; //显示缓存
unsignedchari=0; //定义扫描数码管字数
unsignedintcount1=0; //计左电机码盘脉冲值
unsignedintV=0; //定义其速度
/************************************************************************/
//延时函数
voiddelay(unsignedintk)
{
unsignedintx,y;
for(x=0;x for(y=0;y<2000;y++);
}
/************************************************************************/
//显示数码管字程序
voidDisplay_SMG(void)
{
if(++i>=4)i=0;
P0=table[disbuff[i]];
P2=dis[i];
}
/************************************************************************/
///*TIMER0中断服务子函数产生2MS定时扫描数码管与产生0。
5S*/
voidtimer0()interrupt1using2
{
TH0=(65536-2000)/256; //2MS定时
TL0=(65536-2000)%256;
time++;
Display_SMG();
if(time>=250) //250次即是,0。
5S
{
time=0;
V=count1*2; //计数公式:
轮子直径*3.14/20格码盘=6.5Cm*3.14/20约=1cm即一个脉冲走1CM距离 ((count1*1))/0.5S=(count1*2)CM/S
count1=0; //清计数
disbuff[0]=V/1000; //更新显示
disbuff[1]=V%1000/100;
disbuff[2]=V%1000%100/10;
disbuff[3]=V%1000%100%10;
}
}
/***************************************************/
//外部0中断用于计算左轮的脉冲
voidintersvr1(void)interrupt0using1
{
count1++;
}
/************************************************************************/
//前速前进
voidrun(void)
{
Left_moto_go;//左电机往前走
Right_moto_go;//右电机往前走
}
//前速后退
voidbackrun(void)
{
Left_moto_back;//左电机往前走
Right_moto_back;//右电机往前走
}
//左转
voidleftrun(void)
{
Left_moto_back;//左电机往前走
Right_moto_go;//右电机往前走
}
//右转
voidrightrun(void)
{
Left_moto_go;//左电机往前走
Right_moto_back;//右电机往前走
}
//停转
voidstoprun(void)
{
Left_moto_Stop;//左电机往前走
Right_moto_Stop;//右电机往前走
}
/*********************************************************************/
/*--主函数--*/
voidmain(void)
{
TMOD=0X01;
TH0=(65536-2000)/256; //2MS定时
TL0=(65536-2000)%256;
TR0=1;
ET0=1;
EX0=1; //开启外部中断0
IT0=1; //下降沿有效
IE0=0;
EA=1;
run();
while
(1)
{
//有信号为0没有信号为1
if(Left_2_led==0&&Right_1_led==0)
run();
else
{
if(Right_1_led==1&&Left_2_led==0) //右边检测到黑线
{
Left_moto_go; //左边