51单片机控制4个电机,可以控制两个了。。用PWM调速,PWM调用T0控两个电机,T1生成的PWm控两个电机。
答案:2 悬赏:80 手机版
解决时间 2021-02-08 11:46
- 提问者网友:不爱我么
- 2021-02-07 17:18
但是,只能控两个,4个电机一起的时候,就不转了。下面是程序跟Proteus的仿真图,求大神告知为什么不行?错哪里了。注释部分程序,为加上就4个电机都不转了,此程序可控两台。T1部分的程序写的跟T0一样,key21-24也跟key11一样只是变量该一下,因为百度不给写这么长的问题所以删去了#include#define uchar unsigned char#define uint unsigned intsbit PWM11 = P1^0; //motor1 引脚sbit PWM12 = P1^1;sbit PWM13 = P1^2;sbit PWM14 = P1^3;sbit key11 = P1^4; sbit key12 = P1^5;sbit key13 = P1^6;sbit key14 = P1^7;sbit stop_key2 = P2^0;sbit stop_key1 = P2^1;sbit FMQ = P3^6; uchar ZKB1,ZKB2,ZKB3,ZKB4,ZKB21,ZKB22,ZKB23,ZKB24;void delaynms(uint z){ uint i,j; for(i = z;i > 0;i--) for(j = 110;j > 0;j--);}void beep(void){ uchar t; for(t=0;t<100;t++) { delaynms(1); FMQ=!FMQ; //产生脉冲 } FMQ=1; //关闭蜂鸣器 delaynms(300);}void main(void){ TR0=0; //关闭定时器0,1 TR1=0; TMOD=0x01; //定时器0,工作方式1 TH0=(65526-100)/256; TL0=(65526-100)%256; //100us即0.01ms中断一次 TH1=(65536-100)/256; TL1=(65536-100)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器T0 ZKB1=3; //占空比初值设定 ZKB2=3; //占空比初值设定 ZKB3=3; ZKB4=3; while(1) { if(!key11) //电机11正转 { delaynms(10); //消抖 if(!key11) //确定按键按下 { if(ZKB1 == 0) //停在最大转速 ZKB1 = 0; beep(); ZKB1--; //减少ZKB1 } } if(!key12) //电机11反转 { } if(!key13) //电机12正转 { } if(!key14) //motor12反转 { } if(stop_key1 == 0) //motor1停车 { ZKB1 = 3; ZKB2 = 3; ZKB3 = 3; ZKB4 = 3; } if(stop_key2 == 0) //motor2停车 { ZKB21 = 3; ZKB22 = 3; ZKB23 = 3; ZKB24 = 3; } }}void time0(void) interrupt 1{ static uchar N=0; TH0=(65526-100)/256; TL0=(65526-100)%256; N++; if(N>3) N = 0; if(N<=ZKB1) //电机11 PWM PWM11 = 0; if(N > ZKB1) PWM11 = 1; if(N<=ZKB2) PWM12 = 0; if(N > ZKB2) PWM12 = 1; if(N<=ZKB3) //电机12 PWM PWM13 = 0; if(N > ZKB3) PWM13 = 1; if(N<=ZKB4) PWM14 = 0; if(N > ZKB4) PWM14 = 1;}
最佳答案
- 五星知识达人网友:迷人又混蛋
- 2021-02-07 17:44
需要调试才能找到问题,可以将仿真图和源代码发到我的邮箱,帮你看看,163邮箱,名字是我的ID。
全部回答
- 1楼网友:西岸风
- 2021-02-07 17:52
调其中的speed,即时调整占空比,调t即是调周期的长短 #include<reg51.h> #include<math.h> #define uchar unsigned char #define uint unsigned int sbit en1=p1^0; sbit s1=p1^2; sbit s2=p1^3; uchar t=0; uchar m1=0; uchar tmp1,tmp2; void motor(uchar index, char speed) { if(speed>=-100 && speed<=100) { if(index==1) { m1=abs(speed); if(speed<0) { s1=0; s2=1; } else { s1=1; s2=0; } } } } void delay(uint j) { for(j;j>0;j--); } void main() { uchar i; tmod=0x02; th0=0x9b; 定时101us tl0=0x9b; ea=1; et0=1; tr0=1; while(1) { for(i=0;i<=100;i++) { motor(1,i); delay(5000); } for(i=100;i>0;i--) { motor(1,i); delay(5000); } for(i=0;i<=100;i++) { motor(1,-i); delay(5000); } for(i=100;i>0;i--) { motor(1,-i); delay(5000); } } } void timer0() interrupt 1 { if(t==0) { tmp1=m1; tmp2=m2; } if(t<tmp1) en1=1; else en1=0; t++; if(t>=100) t=0; }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯