控制直流电机和舵机的电机驱动模块是L298N
程序一
#include <reg52.h>
sbit out = P1^0; //舵机信号线
sbit K1 = P1^4;
sbit K2 = P1^5;
sbit K3 = P1^6;
char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节
/**********************************************************
us延时子函数 (500us)
**********************************************************/
void delayus(unsigned char x)
{
unsigned char i;
while (x--)
{
for (i = 0; i < 58; i++)
;
}
}
/**********************************************************
归中子函数 (0度)
**********************************************************/
void Prog0(void)
{
unsigned char m;
for(m=0; m<30; m++)
{
out = 1;
delayus(3); //延时1.5ms
out = 0;
delayus(37); //延时18.5ms
}
}
/**********************************************************
逆时针转动子函数 1ms
**********************************************************/
void Prog1(void)
{
unsigned char m;
for(m=0; m<40; m++)
{
out = 1; //延时1ms
delayus(2);
out = 0;
delayus(38); //延时19ms
}
}
/**********************************************************
顺时针转动子函数 2ms
**********************************************************/
void Prog2(void)
{
unsigned char m;
for(m=0; m<40; m++)
{
out = 1;
delayus(4); //延时2ms
out = 0;
delayus(36); //延时18ms
}
}
/**********************************************************
主函数
**********************************************************/
void main(void)
{
P1 = 0xf0;
Prog0(); //0度位置
while(1)
{
if(K1 == 0)
{
delayus(40); //延时20ms
if(K1 == 0)
Prog0(); //返回0度位置
}
else
if(K2 == 0)
{
delayus(40); //延时20ms
if(K2 == 0)
Prog1(); //逆时针转动
}
else
if(K3 == 0)
{
delayus(40); //延时20ms
if(K3 == 0)
Prog2(); //顺时针转动
}
}
}
程序二
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit k5=P3^4;
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit EN=P2^2;
uchar num=0, show_num=1, gao_num=1, di_num=3, num1;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90
};
void delay(uint x) //延时函数
{ uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
if(k1==0) // 正转
{ delay(10);
if(k1==0)
{
IN1=0; IN2=1; num1=1;
while(!k1);
}
}
if(k2==0) // 反转
{ delay(10);
if(k2==0)
{
IN1=1; IN2=0; num1=0;
while(!k2);
}
}
if(k3==0) // 加速
{ delay(10);
if(k3==0)
{ num++;
if(num==4)
num=3;
while(!k3);
}
}
if(k4==0) //减速
{ delay(10);
if(k4==0)
{ if(num!=0)
num--;
else
num=0;
while(!k4);
}
}
if(k5==0) // 停止
{ delay(10);
if(k5==0)
{
IN1=1; IN2=1;
while(!k5);
}
}
}
void display()
{
P2=0xfe; //第一个数码管显示正转(1)还是反转(0)
P0=table[num] ;
delay(5);
P2=0xfd; //第二位数码管显示速度标志
P0=table[show_num];
delay(5);
P2=0xfb; // 显示0
P0=table[0];
delay(5);
P2=0xf7; // 显示0
P0=table[0];
delay(5);
}
void dispose() //根据速度标记进行数据处理
{
switch (num)
{
case 0:
show_num=1;
gao_num=1;
di_num=3;
break;
case 1:
show_num=2;
gao_num=2;
di_num=2;
break;
case 2:
show_num=3;
gao_num=3;
di_num=1;
break;
case 3:
show_num=4;
gao_num=4;
di_num=0;
break;
}
}
void qudong() //控制电机程序
{
uchar x;
if(num1==1) //正转占空比调节
{if(di_num!=0)
{
for(x=0;x<=di_num; x++)
{ IN1=0; //PWM低电平输出
display(); //显示函数延时
}
}
for(x=0;x<=gao_num;x++ )
{ IN1=1;
display(); //PWM高电平输出
}
}
if(num1==0) //反转占空比调节
{if(di_num!=0)
{
for(x=0;x<=di_num; x++)
{ IN2=0;
display();
}
}
for(x=0;x<=gao_num;x++ )
{ IN2=1;
display();
}
}
}
void main ()
{
while(1)
{ EN=1;
keyscan();
dispose();
qudong();
}
}
|