#include <reg52h>
#define uint unsigned int
#define uchar unsigned char
sbit IN1=P1^0;
sbit ENA=P1^1; //左轮 1
sbit IN2=P1^2;//左轮2
sbit IN3=P1^3;//右轮 1
sbit ENB=P1^4;
sbit IN4=P1^5;//右轮 2
sbit left=P0^0;
sbit right=P0^1;
//sbit middle=P0^2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
ENA=0; // 1
ENB=0; //
IN1=0; // 0
IN2=0; // 2
IN3=0;
IN4=0;
}
void pwm()
{
ENA=1;
ENB=1;
}
void dianji()
{
if(left==0&&right==0) //前进
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
pwm();
}
else if(left==0&&right==1) //右转
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
pwm();
} else if(left=1&&right==0)// 左转
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
pwm();
}
}
void main()
{
init();
while(1)
{
dianji();
}
}
1、先设计软件,马达控制用PWM脉冲驱动,程序中利用定时器中断对显示器进行刷新显示。
2、在主程序中利用键盘判断按键状态,分别设置加、减、速度、温度按键,并建立个功能子程序。
3、测速功能利用定时器设定单位时间内检测光电开关检测技术次数,然后换算成分转速,并存于内部寄存器备用,当判断按键程序为转速显示是调用即可,或在主程序中先设置显示为转速模式。
4、速度加、减也单独建立寄存器保存数据。
5、温度采用18B20数字温度芯片。
6、硬件设计需要注意强电和弱电的隔离,驱动信号直接用光耦隔离就OK ,驱动马达需注意脉冲干扰。
希望对你能有所帮助~!
LN2003也是一个7路反向器电路,即当输入端为高电平时ULN2003输出端为低电平,当输入端为低电平时ULN2003输出端为高电平,继电器得电吸合。
#include<stch>
#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;x<5000;x++)
for(x=0;x<a;x++);
}
#include <reg52h>
sbit KEY1 = P3^2;
sbit PWM = P1^0;
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 01ms
unsigned char PWM_ON ;//定义高电平时间
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
unsigned char PWM_Num;//定义档位
TMOD |=0x01;//定时器设置 1ms in 12M crystal
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
IE= 0x82; //打开中断
TR0=1;
CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步
while(1)
{
if(!KEY1)
{
delay(30000);
if(!KEY1)
{
PWM_Num++;
if(PWM_Num==4)PWM_Num=0;
switch(PWM_Num){
case 0:P0=0x06;PWM_ON=0;break;//高电平时长
case 1:P0=0x5B;PWM_ON=4;break;
case 2:P0=0x4F;PWM_ON=6;break;
case 3:P0=0x66;PWM_ON=8;break;
default:break;
}
}
}
}
}
//
/ 定时中断 /
//
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
if (count==PWM_ON)
{
PWM = 1; //高电平
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右时间是0 保持原来状态
PWM = 0;//低电平
}
}
以上就是关于51单片机中如何用c语言控制直流电机正反转全部的内容,包括:51单片机中如何用c语言控制直流电机正反转、关于MCS51直流电机转速控制、求助51单片机通过uln2003控制继电器驱动直流电机的C语言和电路图,谢谢了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)