51单片机中如何用c语言控制直流电机正反转

作者&投稿:尾风 (若有异议请与网页底部的电邮联系)
51单片机中如何用c语言控制直流电机正反转~

#include
#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();
}


}

一般而言,所有单片机的端口驱动能力都有限,还有电机的额定电压也许会比单片机的供电电压高,直接驱动电机有困难。这时候要想驱动电机,就必须根据电机的额定电压和额定功率采用合适的功率器件去驱动。

下边的电路图是我工程上实际使用的,可以正反转,脉宽调制的话还可以调速。


#include"reg52.h"
#include"intrins.h"
#define unint unsigned int
#define unchar unsigned char
#define PLAY_OUT P1
unchar sec=0;
unchar min=0;
unchar count=0;
bit gj=0; //光和遥控的切换
unchar r6,r7;
bit time0=1;
bit time1=1;
sbit PLAY_Q_Q=P3^0;
sbit PLAY_Z=P3^1;
sbit PLAY_Y=P3^4;
sbit PLAY_QH=P3^5;
sbit PLAY_Q_H=P3^6;
sbit PLAY_T=P3^7;
unchar r0,r1,r2=0x00,r3=0x00,r4=0x00,r5=0x00;
unchar code TAB_Q[4]={0xf9,0xf5,0xf6,0xfa};//前进
unchar code TAB_H[4]={0xfa,0xf6,0xf5,0xf9};//后退
unchar code TAB_Y[4]={0x9f,0x5f,0x6f,0xaf};//右转
unchar code TAB_Z[4]={0xaf,0x6f,0x5f,0x9f};//左转
/*************************/
void intiaton(void);
void int_time3(void);
void int_time0(void);
void fanzhuan_Y(void);
void fanzhuan_Z(void);
void zhenzhuan_Q(void);
void zhenzhuan_H(void);
void zhenzhuan_AQ(void);
void zhenzhuan_AH(void);
void cankey(void);
/*************************/
delay(unint t) //0.6ms
{unint i;
for(i=55;i>t;i--) ;

}
/**************************/
delayms(unint k) //k=1延迟0.884毫秒
{unint i;
for(i=80;i>k;i--)
;

}
/*************************/
void delay238(void) //2.38ms
{
unint i,j;
for(j=125;j>0;j--)
for(i=0;i<1;i++);
}
/************************/
void intiaton(void) //初始化
{
TMOD=0x11;
TH1=0XFA;
TL1=0X56;
ET1=1;
TR1=1;
EA=1;
}

/*********************/
void int_time3() interrupt 3 using 3
{
TH1=0XFA;
TL1=0X56;
sec++;
if(sec==2)
{
sec=0;
min++;
}
}
/*************************/ //光感与按键控制
void cankey()
{
if(gj)
{
if(!PLAY_Q_Q)
{
count=1;
}
if(!PLAY_T)
{
count=2;
}
if(!PLAY_Q_H)
{
count=3;
}
}
if((PLAY_Z==0)||(PLAY_Y==0))
{
delayms(1);
if(PLAY_Z==0)
{
fanzhuan_Z();count=1;
}
else
{
fanzhuan_Y();count=1;
}
}

if(PLAY_QH==0)
{
delayms(10);
if(PLAY_QH==0)
{
count++;
if(count==4)
{
count=0;
}
}
while(PLAY_QH==0);
}
switch(count)
{
case 0: PLAY_OUT=0xff;break;
case 1: zhenzhuan_AQ();break;
case 2: PLAY_OUT=0xff;break;
case 3: zhenzhuan_AH();break;
default :break;
}

}
/*******************************/ //按键前进
void zhenzhuan_AQ(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_Q[r6];
while(sec==0);
sec=0;

}

}
/*******************/ //按键后退
void zhenzhuan_AH(void)
{

for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_H[r6];
while(sec==0);
sec=0;
}

}
/**********************/ //左转
void fanzhuan_Z(void)
{
unchar i;

for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Z[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
/**********************/ //右转
void fanzhuan_Y(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Y[r7];
while(sec==0);
sec=0;
}
}

cankey();
}
/***************************/
void main()
{
intiaton();
while(1)
{
cankey();
}
这是加了感光跟按键控制的智能小车,是读大一时候写的,现在看起来呵呵。。。垃圾代码一大堆,不过好象还可以用。

交换单片机输出端的高低电平应该可以的吧

你要有硬件电路才能写代码。不然谁知道你要怎么控制?


求:如何将C语言程序弄进51单片机?
C语言是人能用的文字语言,单片机只能用由0和1组成的机器语言,要想单片机运行C语言,拢共要三步:1)写C语言程序。2)用编译软件编译C程序并生成hex代码。3)用下载线或烧录器将hex代码写入单片机。

51单片机一个工程中包含多个C文件怎么使用
1. 不管有多少个函数,C总是从main()主函数开始执行。2. 至于你说的一个工程里面包括多个.c的文件,其实每个.c的文件里就是一系列函数而已。如果你要使用这些函数的话你要在头文件里加入#include。比如我要用“init.c”这个文件,则头文件中除了#include"reg51.h"你还要加#include"init.c"然后...

谁能说一下,在单片机里用C语言怎么存入数据,然后用I\/O口输出
void main(){ ...while(1){ for(i=0;i<8;i++) p1fg_buff = X_TAB[i];i=0;} } 参考上边例子。数据放X_TAB[]p1fg_buff 换成输出的io寄存器 const 的意思,类似汇编的db 把数据放程序存储器

如何同时在一个单片机C语言中同时使用外部中断0和1?
(51单片机)如果没有特别需要,可以不设置优先级,则按自然优先级执行,自然优先级顺序为:INT0 T0 INT1 T1 串口 。void init() \/\/中断初始化 { EA=1;EX0=1;EX1=1; \/\/开中断 IT0=1;IT1=1; \/\/设为下降沿触发 } void ex0() interrupt 0 {} void ex1 interrupt 2 {} ...

单片机怎么用c语言设置I\/O口输入或输出
例如:P3M0=0;P3M1=127;\/\/0-6推挽输出 P1M0=0;P1M1=255; \/\/all 推挽输出 而51单片机的所有IO引脚,在启动后默认都是1。因此,如之前没有对此引脚进行过置0操作的话,可以直接读该引脚。但为了保险起见,也为了使程序通用、可移植,最好在读取之前对此引脚置1。

如何用c语言实现单片机延时?
最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。500ms延时子程序程序:(晶振12MHz,一个机器周期1us。)void delay500ms(void){ unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);} ...

单片机中用C语言怎么设置TOMD,模式0,1,2,3,对应的定时器0,1,求大神...
那得看你用什么单片机,51单片机的话有两定时器T0和T1;TMOD是一个八位的寄存器,分别对应两个定时器的一些状态,如工作方式、启动方式的设置,设置TMOD时是字节寻址,就是直接写一个字节。如:如果我要使用T0定时器,让它工作在方式1、软件启动;TM0D=0x01;...

单片机c语言里的取反怎么用?
单片机C语言中的取反操作可以通过使用逻辑非运算符来实现。具体解释如下:一、答案明确 在单片机C语言中,取反操作通常使用逻辑非运算符“!”来实现。该运算符用于将一个逻辑值或二进制数值进行取反操作。二、详细解释 1. 逻辑非运算符:逻辑非运算符是一个一元运算符,用于将一个逻辑值或二进制数值...

在单片机汇编语言中c是什么意思
上面两种请况C的置1是系统自动的。另外还可以自己对C进行操作 指令如下:MOV C, bit 将bit位地址中的值送PSW中的进位标志位CY MOV bit, C 将PSW中的进位标志位CY的值送bit位地址中 CLR C 将进位标志位CY清0 SETB C 将进位标志位CY置1 ANL C, bit 将Cy和bit位地址中的值进行与操作后...

"如何使用PIC单片机C语言编译器进行程序开发与调试?"
开始学习PIC单片机C程序设计实践,首先了解一下基础:第1章:C语言简介 1.1 程序与计算机架构:计算机通过执行指令来完成任务,程序是指令的集合。1.2 数字系统:理解二进制和十六进制,为C语言操作提供基础。1.3 C语言介绍:C语言起源于汇编语言,具有高效、灵活等特点。第2章 PIC单片机基础:PIC概述 ...

番禺区13558226794: 51单片机控制直流电机.(c语言控制)
望颜奇迪: 有3种方案: 第一种,通过PWM脉宽调制输出方法控制转速,控制占空比的大小可以实现调速! 第二种,通过AD转换的方法控制直流电机的电压 第三种,用xtr115程控电流源来控制直流电机(类似第二种方法) 如果以上的驱动能力不够的话再加上一个电压跟随器! 程序方面就是一个寄存器的配置问题了,你查一下单片机的技术手册上面都有介绍的,祝你成功

番禺区13558226794: 51单片机中如何用c语言控制直流电机正反转 -
望颜奇迪: #include <reg52.h>#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...

番禺区13558226794: 求问51单片机如何让直流电机按给定的程序数值启动和停止的,请求说明原理,最好是C程序加注释说明 -
望颜奇迪: 控制可分三种1. 简单启停:用一个端口的电位高低,控制ULN2008之类的,就可以了,在程序中可以控制启,停,延时.2. 调速运行:这要用PWM了,并且最好用mos管去控制电机3. 反馈运行:这要用到编码器之类的位置反馈元件,复杂,当然也是最好的,可以用PWM调整速度 ,也可以指定它转过一定圈数(也就是接收到一定数量的反馈脉冲)再停止.

番禺区13558226794: 急求!!!!! 利用51单片机实现对5v直流电源的电机的控制.包括电机的启动,加速,减速,停止等功能.
望颜奇迪: #include &lt;reg52.h&gt; sbit KEY1 = P3^2; sbit PWM = P1^0; unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms unsigned char PWM_ON ;//定义高电平时间 void delay(unsigned int cnt) { while(--cnt); } main()...

番禺区13558226794: 请教:C51单片机控制直流电机的运动的程序,直流电机由2个光电开关控制. -
望颜奇迪: 其实就是一个条件关系,你设一个端口,光电开关开的时侯为1,关的时侯为0,那么当端口为11的时侯,直流电机停,为01的时侯,直流电机正转,为10的时侯反转.自已画个流程图分析.自已写的才算自已的

番禺区13558226794: 如何使MCS - 51单片机产生PWM信号来控制直流电机的转速 -
望颜奇迪: 我试了几次都传不上图去,我把管脚定义说一下吧.P1.0—P1.4接5个对地键,分别作为:顺时针、逆时针、停止、加速和减速按键.P3.0接L294的IN1,P3.1接IN2.P3.7接ENA,也就是PWM输出口.另外你也可以用P0和P2口接LED或者LCD...

番禺区13558226794: STC89C52单片机控制直流电动机的c程序 -
望颜奇迪: #include<reg51.h> #define uchar unsigned char #define uint unsigned int uchar motor=P1^0; sbit keystart=P2^0; sbit keystop=P2^1; void delay(uint x) {uchar j;while(x--){for(j=0;j<125;j++){;}} } void main(void) {motor=0;while(1){if(keystart==...

番禺区13558226794: 急求!!!!! 利用51单片机实现对5v直流电源的电机的控制.包括电机的启动,加速,减速,停止等功能. -
望颜奇迪: #include <reg52.h> sbit KEY1 = P3^2; sbit PWM = P1^0; unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms unsigned char PWM_ON ;//定义高电平时间 void delay(unsigned int cnt) { while(--cnt); } main() { ...

番禺区13558226794: 求89C51单片机通过L298N控制两直流电机C语言程序 要求:通过3个光电传感器反馈信息控制电机转速实现转向 -
望颜奇迪: 转向要靠舵机输出pwm波形控制,最好是50hz 电机只是控制转速 控制占空比就可以了 void timer0() interrupt 1 { d_count++; if(d_count==d_num) duoji=0; if(d_count==480) { d_count=0; duoji=1; } TH0=(65536-10)/256; TL0=(65536-10)%256; }

番禺区13558226794: 求l298控制直流电机正反转和转速的c程序 用于51单片机的 -
望颜奇迪: 用L298控制直流电机很容易.用单片机端口高低就可以控制开始、停止、正反转,利用EN1,EN2控制使能就能控制转速.推荐一个直流电机控制的板子,配有USB下载器,修改程序很方便,功能很多.还可以做机器人小车:产品地址:http://item.taobao.com/auction/item_detail-0db1-b8e0bd1458f12ade12f5f695d8e746c0.htm 视频地址:http://www.tudou.com/programs/view/tyqjYSbMTaw/

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网