打印

C51小车追光的程序,跟大家分享一下

[复制链接]
2101|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
996778831|  楼主 | 2011-8-17 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:

#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函数正确。

可当上电机后,小车一直直走,对强光置之不理!!!,调试了一天了,没有进展,当局者迷,求高手解决!!

相关帖子

沙发
996778831|  楼主 | 2011-8-17 19:21 | 只看该作者
显示部份的已注释,请大家注意

使用特权

评论回复
板凳
zwm2011| | 2011-9-30 14:01 | 只看该作者
找一个身边的人讨论会更好,别人看不到你的其它资料,很难说出问题症结所在

使用特权

评论回复
地板
linbei1988| | 2011-10-4 14:51 | 只看该作者
做到这种程度LZ应该有一定功底,自己多调试下应该没问题

使用特权

评论回复
5
WQWANGQIANG103| | 2013-5-19 17:00 | 只看该作者
检测一下宏定义中的初始值

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

32

帖子

1

粉丝