单片机源程序如下:
- #include<reg52.h>
- typedef unsigned int uint;
- typedef unsigned char uchar;
- int a=0;
- sbit IN1=P1^0; //定义电机驱动信号输出端
- sbit IN2=P1^1; //定义电机驱动信号输出端
- sbit IN3=P1^2; //定义电机驱动信号输出端
- sbit IN4=P1^3; //定义电机驱动信号输出端
- sbit IN5=P1^4; //定义电机驱动信号输出端
- sbit IN6=P1^5; //定义电机驱动信号输出端
- sbit IN7=P1^6; //定义电机驱动信号输出端
- sbit IN8=P1^7; //定义电机驱动信号输出端
- sbit out1=P3^2;//定义寻声模块信号左输入端 //可有可无中断自动触发
- sbit out2=P3^3;//定义寻声模块信号右输入端
- char L_pwm,R_pwm,t;
- void L_qian()
- {
- IN1=1;
- IN2=0;
- IN3=1;
- IN4=0;
- }
- void R_qian()
- {
- IN5=1;
- IN6=0;
- IN7=1;
- IN8=0;
- }
- void L_ting()
- {
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- }
- void R_ting()
- {
- IN5=0;
- IN6=0;
- IN7=0;
- IN8=0;
- }
- void L_hou()
- {
- IN1=0;
- IN2=1;
- IN3=0;
- IN4=1;
- }
- void R_hou()
- {
- IN5=0;
- IN6=1;
- IN7=0;
- IN8=1;
- }
- void zuozhuan()interrupt 0
- {
- if(a==0)
- { L_pwm=0;R_pwm=40;a=1;}
- else a=0;
- }
- void youzhuan()interrupt 2
- {
- if(a==0)
- { L_pwm=40;R_pwm=0;a=1;}
- else a=0;
- }
- void timer0() interrupt 1
- { TH1 = 0x0FE;
- TL1 = 0x33;
- if(L_pwm>=0)if(t<L_pwm) L_qian(); //当L_pwm为0时根据我们的思维:电机不应该转。将0代入左边
- else L_ting(); //L_pwm,发现不管t取0~39范围内何值时,都不会执行L_qian(),
- else if(t<~L_pwm) L_hou(); //当L_pwm为0时根据我们的思维:电机不应该转。将0代入左边
- else L_ting(); //L_pwm,发现不管t取0~39范围内何值时,都不会执行L_qian(),
- if(R_pwm>=0)if(t<R_pwm) R_qian(); //当L_pwm为0时根据我们的思维:电机不应该转。将0代入左边
- else R_ting(); //L_pwm,发现不管t取0~39范围内何值时,都不会执行L_qian(),
- else if(t<~R_pwm) R_hou(); //当L_pwm为0时根据我们的思维:电机不应该转。将0代入左边
- else R_ting(); //L_pwm,发现不管t取0~39范围内何值时,都不会执行L_qian(),
- t++;
- t%=40;//使每个pwm周期内t的取值都是0~39变化
- }
复制代码
|