找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

为什么我的小车加了这里的PWM功能后无法正常工作了,求指教啊!

[复制链接]
lxy 发表于 2014-3-16 13:35:43 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
        #include<AT89x51.H>




    #define Left_1_led        P0_3         //P3_4接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
        #define Left_2_led        P0_2         //P3_5接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2       

    #define Right_1_led       P0_1         //P3_6接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
        #define Right_2_led       P0_0         //P3_7接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
                                                                                 


        #define Left_moto_go      {P2_6=1,P2_7=0,P2_4=1,P2_5=0;}    //左边两个电机向前走
        #define Left_moto_back    {P2_6=0,P2_7=1,P2_4=0,P2_5=1;}    //左边两个电机向后转
        #define Left_moto_Stop    {P2_6=0,P2_7=0,P2_4=0,P2_5=0;}    //左边两个电机停转                     
        #define Right_moto_go     {P2_2=1,P2_3=0,P2_0=1,P2_1=0;}    //右边两个电机向前走
        #define Right_moto_back   {P2_2=0,P2_3=1,P2_0=0,P2_1=1;}    //右边两个电机向前走
        #define Right_moto_Stop   {P2_2=0,P2_3=0,P2_0=0,P2_1=0;}    //右边两个电机停转   
        sbit H=P1^2;
        int pp=0;
        char num=3;

   
/************************************************************************/       
//延时函数       
   void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(void)
{
   
         Left_moto_go ;   //左电机往前走
         Right_moto_go ;  //右电机往前走
}
    void   stop()
{
     Left_moto_Stop ;  
         Right_moto_Stop ;  
}

//前速后退
     void  back(void)
{
   
         Left_moto_back ;   //左电机往前走
         Right_moto_back ;  //右电机往前走
}

//左转
     void  left(void)
{
   
         Left_moto_back ;   //左电机往后走
         Right_moto_go ;  //右电机往前走
}

//右转
     void  right(void)
{
   
         Left_moto_go ;   //左电机往前走
         Right_moto_back ;  //右电机往后走
}




/*********************************************************************/                 
/*--主函数--*/

        void main(void)
{

  

        TMOD=0x01;                 //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
        TR0=1;                         //打开定时器
        TH0=0Xff;                 //定时器设置,每隔100微秒发起一次中断。
        TL0=0Xa4;
        ET0=1;                         //开定时器0中断
        EA=1;                         //开总中断
           
          while(1)
           {
            //四路寻迹传感器有信号(白线)为0  没有信号(黑线)为1
           if((num!=0)&&(num!=10))        //对于占空比为0和100%这两种极端情况,最好分离出,单独考虑
                {
                        if(pp<=num)
                                run();
                        else
                                stop();
                }
                else if(num==0)        //当占空比为0
                        stop();
                else
                        run();
                if(pp==10)                //当占空比为100%
                        pp=0;
          
            switch(P0&0x0f)
        {
                case 0x00:                                                // 全部没有压线,直转
                        run();
                          delay(6);
                        break;
                case 0x03:                                                // 大右压线,左转
                        stop();
                        left();
                        while(P0=0X04)
                       
                        {break;}
                case 0x01:                                                // 中右压线,左转
                        stop();
                        left();
                        while(P0=0X04)
                        {break;}
                       
                case 0x02:                                                // 小右压线,左转
                            stop();
                                left();
                         while(P0=0X04)
                        {break;}
                case 0x04:                                                // 小左压线,右转
                        stop();
                        right();
                while(P0=0X02)                                        //转向延时
                   {        break;}
                case 0x08:                                                // 中左压线,右转
                        stop();
                        right();
                                while(P0=0X02)                                        //转向延时
                   {        break;}       
                case 0x0c:                                                // 大左压线,右转
                   stop();
                        right();                                       
                        while(P0=0X02)                                        //转向延时
                   {        break;}
                default :                  
                        stop();
                        break;}
                                          }  }
       





                           void time0() interrupt 1
{        TH0=0Xff;
        TL0=0Xa4;
                                                         /*无限循环*/
         pp++;
        }
                      
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:38 , Processed in 0.058258 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表