1、L298控制直流电机加减速的89c51单片机C程序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; /* 电机当前速度值 */ /* 电机控
2、制函数 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允许中断 */ TR
3、0=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
4、#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 CO
5、MMAND_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; /* U
6、sed 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
7、 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 debug
8、ging 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 direction
9、A=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; bre
10、ak; 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
11、 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; /* Enabl
12、e 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是怎么驱动直流电机的为什么
13、我用单片机的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=P2
14、3; /右转#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;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1