求51单片机通过L298N控制直流电机C源程序

如题所述

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uint t;
uint flag1,flag1s;/*当flag1=1时,底盘左转,当flag1&flag2=1时,底盘右转*/
uint flag2;/*停止标志位*/
uint flag3,flag3s;/*当flag3=1时,右臂抬起,当flag3&flag2=1时,右臂放下*/
uint flag4,flag4s;/*当flag4=1时,左臂抬起,当flag4&flag2=1时,左臂放下*/
uint flag5;/*当flag5=1时,自动演示*/

//红绿灯控制
sbit hong=P3^0;
sbit huang=P3^1;
sbit lv=P3^2;
//左臂控制 (zb1为0,zb2为1时抬起,反之放下)
sbit zb1=P2^0; //P2=0x02 左臂抬起
sbit zb2=P2^1; //P2=0x01 左臂放下
//右臂控制 (yb1为0,yb2为1时抬起,反之放下)
sbit yb1=P2^2; //P2=0x08 右臂抬起
sbit yb2=P2^3; //P2=0x04 右臂抬起
//机器人底盘控制 (dp1为0,dp2为1时左转,反之右转)
sbit dp1=P2^4; //P2=0x20 底盘左转
sbit dp2=P2^5; //P2=0x10 底盘右转
//太阳能底盘控制(tdp1为0,tdp2为1时左转,反之右转)
sbit tdp1=P2^6; //P2=0x80 太阳能底盘左转
sbit tdp2=P2^7; //P2=0x40 太阳能底盘右转
//遥控控制
sbit yk1=P1^0;//遥控 1
sbit yk2=P1^1;//遥控2
sbit yk3=P1^2;//遥控3
sbit yk4=P1^3;//遥控4
sbit yk5=P1^4;//遥控5

void init();
void delay(uint);
void zidong();
void keyscan();

/*************************** 主函数 *****************************/
void main()
{
init();
while(1)
{
zidong();
keyscan();
if(flag5==1)
zidong();

if(flag1==1)
P2=0x20;//底盘左转
else
P2=0x00;

if(flag1s==1)
P2=0x10;//底盘右转
else
P2=0x00;

if(flag3==1)
P2=0x08;//抬右臂
else
P2=0x00;

if(flag3s==1)
P2=0x04;//放右臂
else
P2=0x00;

if(flag4==1)
P2=0x02;//抬左臂
else
P2=0x00;
if(flag4s==1)
P2=0x01;//放左臂
else
P2=0x00;

}
}

/*************************** 初始化函数 *****************************/
void init()
{
flag1=0;
flag1s=0;
flag2=0;
flag3=0;
flag3s=0;
flag4=0;
flag4s=0;
flag5=0;

TMOD=0x11;//设置定时器0为工作方式
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
}

/*************************用定时器1,控制太阳能底盘转动**************************/
void time0() interrupt 1//给太阳能底座定时,5分钟转一次
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t++;
if(t==6000)
{ t=0;
P2=0x80;//太阳能底盘右转
delay(1);
P2=0x00;
}
}
/*************************** 键盘扫描函数 *****************************/
void keyscan()
{
if(yk1==1&yk2==0)
{
delay1(1);
if(yk1==1&yk2==0)
flag1=1;
}
else flag1=0;

if(yk2==1&yk1==0&yk3==0&yk4==0)
{
delay1(1);
if(yk2==1&yk1==0&yk3==0&yk4==0)
flag2=1;
flag1=0;
flag3=0;
flag4=0;
flag5=0; //全部清0
flag1s=0;
flag3s=0;
flag4s=0;

}
if(yk3==1&yk2==0)
{
delay1(1);
if(yk3==1&yk2==0)
{
flag3=1;
}
else flag3=0;
}

if(yk4==1&yk2==0)
{
delay1(1);
if(yk4==1&yk2==0)
{
flag4=1;
}
else flag4=0;
}

if(yk5==1)
{
delay1(1);
if(yk5==1)
{
flag5=1;
}
else flag5=0;
}

if(yk1==1&yk2==1)
{
delay1(1);
if(yk1==1&yk2==1)
{
flag1s=1;
}
else flag1s=0;
}

if(yk3==1&yk2==1)
{
delay1(1);
if(yk3==1&yk2==1)
{
flag3s=1;
}
else flag3s=0;
}

if(yk4==1&yk2==1)
{
delay1(1);
if(yk4==1&yk2==1)
{
flag4s=1;
}
else flag4s=0;
}

}

/*************************** 自动演示函数*****************************/
void zidong()
{
while(1)
{
P3=0xfd;//黄灯亮
P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;

P3=0xfe;//红灯亮
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;

P2=0x20;//底盘左转
delay(260);
P2=0x00;

delay(800);

P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;
P3=0xfb;//绿灯亮
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;
delay(500);

P2=0x20;//底盘左转
delay(260);
P2=0x00;
delay(500);

P3=0xfb;//黄灯亮
P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;

P3=0xfe;//红灯亮
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;
delay(500);

P2=0x10;//底盘右转
delay(250);
P2=0x00;
delay(500);

P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;
P3=0xfb;//绿灯亮 //向西
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;
delay(500);

P2=0x10;//底盘右转
delay(250);
P2=0x00;
delay(500);

P3=0xfd;//黄灯亮
P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;

P3=0xfe;//红灯亮
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;
P2=0x00;

P2=0x10;//底盘右转
delay(250);
P2=0x00;

delay(800);

P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;
P3=0xfb;//绿灯亮
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;
delay(500);

P2=0x10;//底盘右转
delay(250);
P2=0x00;

P3=0xfb;//黄灯亮
P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;

P3=0xfe;//红灯亮
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;
delay(500);

P2=0x20;//底盘左转
delay(260);
P2=0x00;

P2=0x08;//抬右臂
delay(66);
P2=0x00; //向北
delay(200);
P2=0x04;//放右臂
delay(54);
P2=0x00;
P3=0xfb;//绿灯亮
P2=0x02;//抬左臂
delay(52);
P2=0x00;
delay(200);
P2=0x01;//放左臂
delay(50);
P2=0x00;
delay(500);

P2=0x20;//底盘左转
delay(260);
P2=0x00;
delay(5);
}
}
/*************************** 1s延时函数*****************************/

void delay(uint z)
{
uint x,y;
for(x=z*62;x>0;x--) //z为100时,延时1秒
for(y=20;y>0;y--);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-08-08
#include<reg52.h>
#define uchar unsigned char

unsigned char N=0;
unsigned char X=20; //占空比初始值为50%

int a,b;

sbit PWM=P3^6; //PWM输出脚

sbit P2_0=P2^0;//M1启动
sbit P2_1=P2^1;//M1停止
sbit P2_2=P2^2;//M1加速
sbit P2_3=P2^3;//M2减速

sbit P1_0=P1^0;//M1
sbit P1_1=P1^1;//M1

void scjs(void)interrupt 3
{
TH1=0Xff;
TL1=0x17;
b++;
}

main()
{
TMOD=0x00;
IE=0X88;
TH1=0Xff;
TL1=0X17;
TR0=1;
TR1=1;
a=0;
b=0;

while(1)
{
PWM=1;
while(1)
{
b=0;
while(!b);
if (N==X)
PWM=0;
if (N==100)break;
N++;

if(P2_0==0)//M1启动
{
P1_0=1;
P1_1=0;
}
if(P2_1==0)//M1停止
{
P1_0=1;
P1_1=1;
}
if(P2_2==0)
{
X++;

}
if(P2_3==0)
{
X--;
}
}
N=0;
}

}
第2个回答  2009-08-01
你最好是去单片机论坛去下载个实例来看看,这方面的很多本回答被提问者采纳
第3个回答  2009-08-03
本人专业代理搜集各种芯片中文资料,芯片应用资料,以及毕业参考论文,价格每篇0.5元起价,有兴趣的可发邮件到zhxx51@163.com

51单片机用L298n控制一个电机转动程序对吗,怎样控制电机的正反转
如果你的两个信号一个是启停,一个是方向,那么程序可以这样写。include<reg51.h> sbit qt=P2^0;sbit fx=P2^1;sbit keyqt=P1^0;sbit keyfx=P1^1;void delay(unsigned int i){ while(i--);} main(){ while(1){ qt=1;if(key==0){ qt=0;fx=keyfx;delay(50000);} } } ...

L298芯片通过51单片机控制两个直流电机,要求两个电机都可以 独立(互不...
下面是定时器的程序:\/\/两个电机的速度用参数G_pwm_num0,G_pwm_num1来控制,out1~out4分别接两个电机(具体对应关系你看一下就明了)。include<reg51.h>#include<intrins.h> define uchar unsigned char define uint unsigned int sbit out1=P2^0;sbit out2=P2^1;sbit out3=P2^2;sbit ...

51单片机,L298N模块,按钮按一下电机快速转5秒然后再慢速转5秒最后停止...
include<reg51.h> define uchar unsigned char uchar stepd[]={0x01,0x03,0x02,0x06,0x04,0xc0,0x08,0x09};uchar num=0,fx=0;sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;unsigned int fcnt,scnt,ft,st;void t0isr() interrupt 1 { if(ft>0){ TH0=(65536-fcnt)\/256;T...

天祥学习板,51单片机和l298n驱动电机问题
L298 VSS是芯片的供电电压这里为DC5V。VS 是电机的供电电压,不知道你的直流电机几V能驱动,这里比如是DC5-12V。单片机如果是插件DIP40的供电为DC5V。1节5号电池电压为DC1.5V,4节串联起来为DC6V。LM7805为线性稳压IC,那么输入脚1的电压要大于DC7V左右,3脚才有DC5V输出。我们先看你第一种电机...

如何用51单片机控制4个直流电机电机
俩L298N,一共4个H桥,能控制4个直流电机正反转,且能调速 如果只需要正转或者反转,用uln2003一片即可 注意一点:用298N的时候需要加续流二极管保护芯片,uln2003自带续流二极管 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM...

单片机利用pwm控制电机,L298N有四个输入端,两个使能端,怎么产生两路pwm...
这是利用L298驱动两个直流电机的(来源于智能车循迹)程序,\/* ===直流电机的PWM速度控制程序=== *\/ \/* 晶振采用11.0592M,产生的PWM的频率约为91Hz *\/ include<reg51.h> include<math.h> define uchar unsigned char define uint unsigned int sbit en1=P1^0; \/* L298的Enable A *\/ ...

51单片机怎么控制大功率的直流电机,麻烦给下电路图,谢啦。主要是驱动...
1:你说的大功率直流电机,用三极管肯定驱动不了,必须要大功率的MOSFET或者IGBT去驱动,IGBT或者MOSFET可以买Infineon的。主电路结构最好采用H桥电路,可以双极性正反调速。2:H桥的上管可以用IR2110来驱动,这个芯片自己提供了一个自举功能,上管MOSFET(或IGBT)的源极电压是浮动的,自举电路可以保证上管...

L298N模块原理图及使用说明
2. PWMA和PWMB是L298N的使能端,通过调整高电平可以实现PWM调速。电机供电接口VIN需连接到电机电源(9V),而VCC则为L298N芯片提供5V电源,通常需要额外外接。二、硬件接线示例 以51单片机为例,直流电机M1和M2的接线为:VCC连接到VCC,GND连接到GND,具体电机接线则没有正负之分,如方向不对只需交换...

单片机控制电机正反转动的c语言程序
首先要看你的电机是直流电机还是步进电机。直流电机就简单了,只有两根线,电机两端电压正负极改变就可以实现正转反转。不过要加电机驱动芯片,或者H桥电路,电机驱动芯片可以选择L298N,加上适当的外围电路就可以直接用单片机控制电机了。比如让单片机P1.0 = 0,P1.1 = 1;(单片机I\/0口要与电机驱动...

51单片机控制L298N驱动两相步进电机
1、程序节拍不对,这个您既然已经排除了,就查另外其他问题 2、一个线圈没电。试试单独接一个线圈,找出没电的线圈,看是否电路问题,比如对应线圈的EN脚的电平是否正常,还是接触不良。还有一个极小的可能是电机烧了一个线圈,用万用表测一下两个线圈的电阻,如果悬殊太大就说明一个线圈烧了。3、...

相似回答