L298控制直流电机加减速的89c51单片机C程序.doc_第1页
L298控制直流电机加减速的89c51单片机C程序.doc_第2页
L298控制直流电机加减速的89c51单片机C程序.doc_第3页
L298控制直流电机加减速的89c51单片机C程序.doc_第4页
L298控制直流电机加减速的89c51单片机C程序.doc_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

L298控制直流电机加减速的89c51单片机C程序#include #include #define uchar unsigned char #define uint unsigned int sbit en1=P30; /* L298的Enable A */ sbit s1=P32; /* L298的Input 1 */ sbit s2=P33; /* L298的Input 2 */ uchar t=0; /* 中断计数器 */ uchar m1=0; /* 电机1速度值 */ uchar tmp1; /* 电机当前速度值 */ /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100100) */ void motor(uchar index, char speed) if(speed=-100 & speed=100) if(index=1) /* 电机1的处理 */ m1=abs(speed); /* 取速度的绝对值 */ if(speed0;j-); void main() uchar i; TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值 */ TL0=0x9B; EA=1; /* 开中断 */ ET0=1; /* 定时器0允许中断 */ TR0=1; /* 启动定时器0 */ while(1) /* 电机实际控制演示 */ for(i=0;i0;i-) /* 正转减速 */ motor(1,i); delay(5000); for(i=0;i0;i-) /* 反转减速 */ motor(1,-i); delay(5000); void timer0() interrupt 1 /* T0中断服务程序 */ if(t=0) /* 1个PWM周期完成后才会接受新数值 */ tmp1=m1; if(t=100) t=0; /* 1个PWM信号由100次中断产生 */ 本程序实现串口对直流电机的控制*/#include #include #define uchar unsigned char#define uint unsigned int/*/define a status world which sended back to computer#define COMMAND_STATUS 0#define STATUS_LEFT 1#define STATUS_RIGHT 2#define STATUS_SAFETYL 4 #define STATUS_SAFETYR 8 #define COMMAND_LEFT 1/Turn left #define COMMAND_RIGHT 2/Turn right#define COMMAND_STOP 3#define COMMAND_SPEED 4#define STOP 0#define LEFT 1#define RIGHT 2#define A_OUTPUT_ENABLEP3_4/输出使能#define B_OUTPUT_ENABLE P3_5#define MotorA 1#define MotorB 2#define motorA_r P1_7#define motorA_l P1_6#define motorB_r P1_5#define motorB_l P1_4/* 全局变量定义*/uchar motor, command, cmddata; /* Used to receive commands with rs232 */uchar bytenr=0; /*Used to record how many byte we will receive*/uchar Cycle=100;uchar directionA=0; /* current rotating direction */uchar directionB=0;uchar PWidthA=50;uchar PWidthB=50;uint speedA=0; /* Default speed */uint speedB=0;uchar ticks=0; /* counter used for speed calculation */uchar serialtimeout=0; /* used when windows crashes ;-) */*/funtion name:void Timer0_Int (void)/*/void Timer0_Int (void) interrupt 1 using 1serialtimeout+; / Ignore all received bytes after about 2 secondsif (!serialtimeout)bytenr=0; P3_7= P3_7; / invert P3.7, nice for debugging ticks+; if(ticks=Cycle) ticks=0;if(ticks 2) bytenr=0; /reset byte counter / motor should always be zero */ if(motor=MotorA) switch (command) /* command handler */ case COMMAND_STOP: directionA=0; break; case COMMAND_LEFT: /turn left directionA=1; break; case COMMAND_RIGHT: /turn right directionA=2; break; case COMMAND_SPEED: /改变速度 speedA=cmddata; if(speedA1) /保证脉宽不会太窄 PWidthA=speedA; break; else if(motor=MotorB) switch (command) /* command handler */ case COMMAND_STOP: directionB=0; break; case COMMAND_LEFT: /turn left directionB=1; break; case COMMAND_RIGHT: /turn right directionB=2; break; case COMMAND_SPEED: /改变速度 speedB=cmddata; if(speedB1) /保证脉宽不会太窄 PWidthA=speedB; break; /* serial initil*/void Init_serialCOM(void) SCON = 0x50 ; /SCON: serail mode 1, 8-bit UART, enable REN TMOD |= 0x20 ; /TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80 ; /SMOD=1; Baud*2 TH1 = 0xF4 ; /Baud:4800 fosc=11.0592MHz TL1 =0xF4; EA=1 ; /Enable Serial Interrupt ES=1; TR1 = 1 ; / timer 1 run /* seting timer0*/void Set_Timer0(void) TMOD &= 0xf0;/* Set timer 0 */TMOD |= 0x01;/* set timer 0 as Gate=0 Timer, mode 1 */TH0 = 0xff; /* Timint 10ms */TL0 = 0x00;TR0 = 1; /* Enable timer 0 */ET0 = 1; /* Enable timer 0 interrupt */EA=1; /* Enable all enabled interrupts */* Main loop*/void main (void)Init_serialCOM();/serial initionSet_Timer0(); /int modeSendChar(PWidthA);SendChar(PWidthB);/A_OUTPUT_ENABLE=1;B_OUTPUT_ENABLE=1; /forbid output while (1) ; /here can add some user code 大家来讨论下L298是怎么驱动直流电机的为什么我用单片机的I/O控制L298的IN1,IN2 ,ENA 直流减速电机不转动呢? 而直接在上面加H/L电平却能控制呢 ?是不是L298又什么要求,我还不知道.,不过我用仿真软件跑的很好 请高手帮忙诊断下,谢谢程序如下:#includesbit P1_1=P11;/ENA 左使能 sbit P1_2=P12;/IN1sbit P1_3=P13;/IN2sbit P1_4=P14;/ENB 右使能sbit P1_5=P15; /IN3sbit P1_6=P16; /IN4sbit P2_0=P20;/前进sbit P2_1=P21;/后退sbit P2_2=P22; /左转sbit P2_3=P23; /右转#define ENA P1_1#define IN1 P1_2#define IN2 P1_3#define ENB P1_4#define IN3 P1_5#define IN4 P1_6unsigned int i,k=0;void int_tmer0 ();void forwoard();void backwoard();void left();void right();void stop();void init();void int_tmer0 () interrupt 1 i+;TH0=0x3C;TL0=0xB0;if(i=100)i=0; switch(k+) case 0: P2_0=1; forwoard(); break; case 1: P2_0=0; P2_1=1; backwoard(); break; case 2: P2_1=0; P2_2=1; left(); break; case 3: P2_2=0; P2_3=1; right(); break; case 4: P2_3=0; stop(); P2=0x00; break; default:k=0; void forwoard () init (); ENA=1;IN1=1;IN2=0;ENB=1;IN3=1;IN4=0;void backwoard()init(); ENA=1; IN1=0; IN2=1; ENB=1; IN3=0; IN4=1;void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论