单片机程序求指点,要实现小车的循迹和壁障功能到底呢里出了问题。程序如下: 5
/**接线说明*电机部分:*P1.0--左A1前|P1.1--左A2后*P1.2--右B1后|P1.3--右B2前*红外循迹:*P2.0-左|P2.1-中|P2.2-右*...
/*
* 接线说明
* 电机部分:
* P1.0--左A1前 | P1.1--左A2后
* P1.2--右B1后 | P1.3--右B2前
* 红外循迹:
* P2.0-左 | P2.1-中 | P2.2-右
* 壁障部分:
* P1.4--左 | P1.5--中 | P1.6--右
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0; //左电机A1前进
sbit P11=P1^1; //左电机A2后退
sbit P12=P1^2; //右电机B1后退
sbit P13=P1^3; //右电机B2前进
sbit P14=P1^4; //避障左
sbit P15=P1^5; //避障中
sbit P16=P1^6; //避障右
sbit P20=P2^0; //寻迹左L1
sbit P21=P2^1; //寻迹中L2
sbit P22=P2^2; //寻迹中L3
/*全局变量*/
uint zz,num,yy=0;
/*
* 函数声明
*/
void fun1(); //循迹函数
void fun2(); //壁障函数
void delay1(uint z); //延时函数
uchar dr;
void main()
{
void fun2();
TMOD=0x01; // 打开定时器和计数器
TH1=(65536-45872)/256; //1ms fc18
TL1=(65536-45872)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
}
void T1_time() interrupt 3 //中断 服务程序 T1
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
if(yy==1)
fun1();
}
void delay1(uint z) //延时 z ms
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void fun2() //壁障子程序
{
P10=1;P11=0;P12=0;P13=1;
if(P14==0&&P15==0&&P16==1) // 左中测 右走
{
P10=1;P11=0;P12=1;P13=0;
delay1(100);
}
if(P14==1&&P15==0&&P16==0) //右中测 左走
{
P10=0;P11=1;P12=0;P13=1;
delay1(100);
}
if(P14==0&&P15==1&&P16==1) //左侧 右走
{
P10=1;P11=0;P12=1;P13=1;
}
if(P14==1&&P15==1&&P16==0) //右测 左走
{
P10=1;P11=1;P12=0;P13=1;
}
if(P20==0||P21==0||P22==0)
yy=1;
}
void fun1() //循迹子程序
{
if((P20==1&&P21==1&&P22==1)||(P20==1&&P21==0&&P22==1))//全灭或中间灯亮
dr=1; //全速前进
if(P20==0&&P21==1&&P22==1) //左边亮
dr=2; //减速右拐
if(P20==1&&P21==1&&P22==0) //右边亮
dr=3; //减速左拐
if(P20==0&&P21==0&&P22==0) //全亮
dr=4; //停止
switch(dr)
{case 1:P10=1;P11=0;P12=0;P13=1;break; //全速前进
case 2:P10=1;P11=0;P12=0;P13=0;break; //减速右拐
case 3: P10=0;P11=0;P12=0;P13=1;break; //减速左拐
case 4:P10=1;P11=1;P12=1;P13=1;break;
TR0 = 0;
}
} 展开
* 接线说明
* 电机部分:
* P1.0--左A1前 | P1.1--左A2后
* P1.2--右B1后 | P1.3--右B2前
* 红外循迹:
* P2.0-左 | P2.1-中 | P2.2-右
* 壁障部分:
* P1.4--左 | P1.5--中 | P1.6--右
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0; //左电机A1前进
sbit P11=P1^1; //左电机A2后退
sbit P12=P1^2; //右电机B1后退
sbit P13=P1^3; //右电机B2前进
sbit P14=P1^4; //避障左
sbit P15=P1^5; //避障中
sbit P16=P1^6; //避障右
sbit P20=P2^0; //寻迹左L1
sbit P21=P2^1; //寻迹中L2
sbit P22=P2^2; //寻迹中L3
/*全局变量*/
uint zz,num,yy=0;
/*
* 函数声明
*/
void fun1(); //循迹函数
void fun2(); //壁障函数
void delay1(uint z); //延时函数
uchar dr;
void main()
{
void fun2();
TMOD=0x01; // 打开定时器和计数器
TH1=(65536-45872)/256; //1ms fc18
TL1=(65536-45872)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
}
void T1_time() interrupt 3 //中断 服务程序 T1
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
if(yy==1)
fun1();
}
void delay1(uint z) //延时 z ms
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void fun2() //壁障子程序
{
P10=1;P11=0;P12=0;P13=1;
if(P14==0&&P15==0&&P16==1) // 左中测 右走
{
P10=1;P11=0;P12=1;P13=0;
delay1(100);
}
if(P14==1&&P15==0&&P16==0) //右中测 左走
{
P10=0;P11=1;P12=0;P13=1;
delay1(100);
}
if(P14==0&&P15==1&&P16==1) //左侧 右走
{
P10=1;P11=0;P12=1;P13=1;
}
if(P14==1&&P15==1&&P16==0) //右测 左走
{
P10=1;P11=1;P12=0;P13=1;
}
if(P20==0||P21==0||P22==0)
yy=1;
}
void fun1() //循迹子程序
{
if((P20==1&&P21==1&&P22==1)||(P20==1&&P21==0&&P22==1))//全灭或中间灯亮
dr=1; //全速前进
if(P20==0&&P21==1&&P22==1) //左边亮
dr=2; //减速右拐
if(P20==1&&P21==1&&P22==0) //右边亮
dr=3; //减速左拐
if(P20==0&&P21==0&&P22==0) //全亮
dr=4; //停止
switch(dr)
{case 1:P10=1;P11=0;P12=0;P13=1;break; //全速前进
case 2:P10=1;P11=0;P12=0;P13=0;break; //减速右拐
case 3: P10=0;P11=0;P12=0;P13=1;break; //减速左拐
case 4:P10=1;P11=1;P12=1;P13=1;break;
TR0 = 0;
}
} 展开
1个回答
展开全部
我觉得中断子程序肯定有问题。
有很多种情况都会触发中断,如:走到死路、碰到障碍、走到终点。
这些中断是不是都是interrupt 3 ?是不是还需要别的中断程序。
如果只有一个中断程序,至少要判断一下,不止yy==1一种。
main里面是不是应该先打开定时器,再调用fun2()
还有我觉得转弯的时候应该是:
转弯-延迟-直走 转好不直走,不就一直在原地打转吗
有很多种情况都会触发中断,如:走到死路、碰到障碍、走到终点。
这些中断是不是都是interrupt 3 ?是不是还需要别的中断程序。
如果只有一个中断程序,至少要判断一下,不止yy==1一种。
main里面是不是应该先打开定时器,再调用fun2()
还有我觉得转弯的时候应该是:
转弯-延迟-直走 转好不直走,不就一直在原地打转吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
leipole
2024-11-29 广告
2024-11-29 广告
作为上海雷普电气有限公司的一员,我们深知温度控制在工业领域的重要性。Arduino温度控制系统凭借其灵活性和易用性,成为我们温控方案中的重要组成部分。该系统通过Arduino控制器与温度传感器相连,实时监测并调整温度,实现精确的温度控制。无...
点击进入详情页
本回答由leipole提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询