本文目录一览:
特地为你制作的一个按钮改变LED亮/灭(电机启/停)的原理图和程序。
汇编程序:
ORG0000H;复位后LED灭
MAIN: JB P3.2,MAIN;等待按钮动作
ACALL DELAY_50MS;按钮去抖动延时50毫秒
JB P3.2,MAIN;确认按钮动作
CPL P1.0;LED动作取反
JNB P3.2,$;等待按钮释放
SJMP MAIN
DELAY_50MS:MOV R2,#50;延时子程序
LOOP: MOV R3,#200
LOOP1: NOP
NOP
DJNZ R3,LOOP1
DJNZ R2,LOOP
END
C语言程序:
#include REG51.H
#include intrins.h
#define uchar unsigned char
#define LED P1^0//LED引脚定义
#define KEY P3^2//按钮引脚定义
void DELAY(uchar MS);//延时函数声明
void main()
{
while(1)
{
while(KEY);//等待按钮动作
DELAY_50MS(50);//按钮去抖动延时50毫秒
if(!KEY)LED = ~LED;//确认按钮动作,LED动作取反
while(!KEY);//等待按钮释放
}
}
void DELAY(uchar MS)
{
uchar i;
for(;MS0;MS--)
for(i = 200;i0;i--)
{
_nop_();
_nop_();
}
}
LN2003也是一个7路反向器电路,即当输入端为高电平时ULN2003输出端为低电平,当输入端为低电平时ULN2003输出端为高电平,继电器得电吸合。
#includestc.h
#define it unsigned int
sbit s0=P3^2;//两个按钮
sbit s1=P3^3;//两个按钮
sbit j0=P3^4;//继电器控制口,这3个IO口要和你实际电路去更改。
void ys(it); //声明延时函数
void main()
{
while(1)
{
if(s0==0) //判断S按键是否按下 {
ys(5000); //延时消抖
if(s0==0) //在次判断按键是否真的按下(在次判断很有必要)
{
j0=1; //让继电器关闭
while(s0==0); //判断S按键是否放开,如果没有放开继续等待。放开后执行下面的代码。
}
}
if(s1==0) //判断S按键是否按下 {
ys(5000);
if(s1==0)
{
j0=0; //让继电器打开
while(s1==0);
}
}
}
}
void ys(it a) //延时函数
{
it x;
for(x=0;x5000;x++)
for(x=0;xa;x++);
}
如果是直流微电机,典型的控制电路如图:
如果功率稍大的直流电机,晶体管换成继电器,两个继电器就可以,如果是大型动力用电机可以用可控硅等等但我没弄过。
正在做AT89S52的PWM调速,应该是一样的
#includereg52.h
#define uchar unsigned char
sbit zz=P1^0;
sbit fz=P1^1;
sbit K1=P3^2;
sbit K2=P3^3;
uchar PWM,a=0;
void main()
{
TMOD=0X01;
TH0=0XFF;
TL0=0XF6;
TR0=1;
ET0=1;
EA=1;
PWM=40;
zz=1;
fz=1;
while(1)
{
if(!K1)
{
PWM+=10;
}
if(!K2)
{
PWM-=10;
}
if(PWM=100)
PWM=1;
if(PWM=0)
PWM=99;
}
}
void timer0() interrupt 1
{
TH0=0XFF;
TL0=0XF6;
a++;
if(a=100)
a=0;
if(a=PWM)
{
zz=0;
}
else
{
zz=1;
}
}
看了这么多回答的,还是我给你一个答案吧!
答案见插图。解释如下:
1:你说的大功率直流电机,用三极管肯定驱动不了,必须要大功率的MOSFET或者IGBT去驱动,IGBT或者MOSFET可以买Infineon的。主电路结构最好采用H桥电路,可以双极性正反调速。
2:H桥的上管可以用IR2110来驱动,这个芯片自己提供了一个自举功能,上管MOSFET(或IGBT)的源极电压是浮动的,自举电路可以保证上管的栅源之间的电压在开启电压阈值之上。
3:你想要用51单片机实现调速,只需要用51单片机的P0~P3口产生两组互相反相的PWM波(注意两组之间要有死区),输出到IR2110的HIN和LIN。至于程序,就很简单了,不用我多说,你懂的。呵呵……