程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*定义电机的接口*/
sbit rightmotor1=P0^0;
sbit rightmotor2=P0^1;
sbit leftmotor1=P0^2;
sbit leftmotor2=P0^3;
/*定义数模ADC0809转换的接口*/
sbit st=P3^2; //A/D转换启动信号
sbit ale=P2^5; //地址锁存
sbit oe=P2^6; //输出允许信号
sbit eoc=P2^7; //转换结束信号
sbit a=P3^3;
sbit b=P3^4;
sbit c=P3^5; //三个地址选择端
sbit clk=P3^6;//时钟脉冲
uchar flag; //电机转向
/*显示用的数码管的位选,38译码器*/
/*sbit ad=P2^0;
sbit bd=P2^1;
sbit cd=P2^2;
uchar digitalcode[]={ //共阴数码管的编码,并将数据定义在CODE区
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F,
};
void delay(uint i)
{
uint j;
while(i--)
{
for(j=100;j>0;j--);
}
}
void display(uint dat,uchar sign )
{
uchar i,datm[4];
uint j;
datm[0]=sign;
datm[1]=(dat%1000)/100;
datm[2]=(dat%100)/10;
datm[3]=dat%10;
for(j=600;j>0;j--)
{
for(i=0;i<4;i++)
{
P0=digitalcode[datm[i]];
ad=i%2;
bd=(i%4)/2;
cd=i/4;
delay(1);
}
}
}
void display2(uint dat )
{
uchar i,j,k,datm[4];
datm[0]=(dat%10000)/1000;
datm[1]=(dat%1000)/100;
datm[2]=(dat%100)/10;
datm[3]=dat%10;
// for(j=100;j>0;j--)
{
for(i=0;i<4;i++)
{
P0=digitalcode[datm[i]];
k=i+4;
ad=k%2;
bd=(k%4)/2;
cd=k/4;
delay(1);
}
}
} */
/*定时器初始化*/
void timer0init()
{
TMOD=0x02;
TH0=0x9B;
TL0=0x9B;
EA=1;
ET0=1;
TR0=1;
}
/*中断产生时钟信号*/
void pwm() interrupt 1
{
clk=~clk;
}
/*主函数*/
void main()
{
void find() ;
void run(); //函数声明
timer0init(); //定时器初始化
while(1)
{
find() ; //寻找光源,得到转向值flag
// flag=2;
run(); //电机转向
}
}
void find()
{
uchar i;
int light[3]; //数模转换用了三个通道,记住得到的数值
flag=0;
for(i=0;i<3;i++)
{
a=i%2;
b=i/2;
c=0; // 选通该转换的信号
ale=1;
oe=0;
st=0;
st=1;
_nop_();
st=0;
_nop_();
while(!eoc); //等待转换结束
oe=1;
ale=0;
light[i]=P1;
if(i>0&&(light[i-1]-light[i])>30)//得到数值最小的,也就是最亮的方向,转向亮处
flag=i;
// display(P1,i) ;
}
}
void run()
{
// display(flag,8) ;
switch (flag)
{
case 1: //左转
{
leftmotor1=0;
rightmotor1=0;
leftmotor2=1;
rightmotor2=0;
break ;
}
case 2: //右转
{
leftmotor1=0;
rightmotor1=0;
leftmotor2=0;
rightmotor2=1;
break ;
}
case 0: //前进
{
leftmotor1=0;
rightmotor1=0;
leftmotor2=1;
rightmotor2=1;
break ;
}
}
}
0 Error(s), 0 Warning(s).
但不论给多强光给两边的光敏电阻,小车都是直走
说明:
1.光敏电阻经AD转换后,实验室的光度为220(误差20以内),加强光150左右;
2.所有的用display显示出来的值都是正确的,包括在函数run内;
3.在主函数加flag=2;小车转向是正确的,说明转向没有问题;
4.在run函数加display(flag,8)(8是标识)显示是正确的,说明flag值正确,find函数正确。
可当上电机后,小车一直直走,对强光置之不理!!!,调试了一天了,没有进展,当局者迷,求高手解决!! |