||
//单片机产生PWM波,LM198n控制两个直流电机
#include<reg52.h> //头文件
#define uint unsigned int //对int和char进行宏定义,方便使用
#define uchar unsigned char
sbit p32=P3^2; //控制加速共5档
sbit p33=P3^3; //控制减速共5档
sbit s1=P2^0;
sbit s2=P2^1; //控制电机1正反转
sbit s3=P2^2;
sbit s4=P2^3; //控制电机2正反转
sbit s5=P2^4;
sbit s6=P2^5; //电机1/2的使能端
sbit p26=P2^6; //按键控制电机反转
sbit p27=P2^7; //按键控制电机正转
sbit p17=P1^7; //按键控制电机停止工作
sbit d0=P1^0; //正转时,正转绿灯一直亮,否则灭
sbit d1=P1^1; //反转时,反转红灯一直亮,否则灭
sbit d2=P1^2; //加速时,黄灯亮0.5s,然后灭
sbit d3=P1^3; //减速时,蓝灯亮0.5s,然后灭
uchar constant=10,flag=0; //定义两个变量
/*函数声明*/
void delay(unsigned int z); //延时函数
void fan(); //反转函数
void zheng(); //正转函数
void xuan(); //选择正反转函数
void stop(); //停止函数
void init(); //程序初始化
void main()
{
init();
while(1)
{
xuan(); //选择正反转然后执行
stop(); //选择停止模式
}
}
/*初始化函数*/
void init()
{
s5=0;
s6=0; //开始时电机不工作
EA=1; //总中断开启
TMOD=0X02; //选取定时器方式2
EX0=1; //外部中断0开启
IT0=1; //中断0触发方式为下降沿
EX1=1; //外部中断1开启
IT1=1; //中断1触发方式为下降沿
ET0=1; //定时器0开启
TR0=1; //启动定时器0
TH0=256-156; //设置初值0.1ms
TL0=256-156;
}
/*选择电机正反转*/
void xuan()//首先通过p26和p27来选择正反转,然后p32用来加速,p33用来减速。
{
if(p26==0)
{
delay(10);
do
{
fan(); //如果p26选定了反转,那么一直反转
d0=0; //反转时,绿灯一直亮
}
while(p17==1); //如果p17=0,则停止
d0=1; //不反转时,绿灯熄灭
}
else if(p27==0)
{
delay(10);
do
{
zheng(); //如果p27选定了正转,那么一直正转
d1=0; //正转时,红灯一直亮
}
while(p17==1); //如果p17=0,则停止
d1=1; //不正转时,红灯熄灭
}
}
/*电机反转函数*/
void fan()
{
s5=1;
s6=1; //使能端开启
s1=0;
s3=0; //控制一边为0,根据另一边时间的不同改变占空比
if(flag==1)
{
flag=0;
s2=1; //执行反转运行
s4=1;
}
if(flag==2)
{
flag=0;
s2=0; //反转停止
s4=0;
}
//根据反转运行与停止的时间长短不同改变PWM信号
}
/*电机正转函数*/
void zheng() //原理与上面反转一样
{
s5=1;
s6=1;
s1=1;
s3=1;
if(flag==1)
{
flag=0;
s2=0;
s4=0;
}
if(flag==2)
{
flag=0;
s2=1;
s4=1;
}
}
/*停止函数*/
void stop()
{
if(p17==0) //当p17按下时,电机停止工作
{
delay(10);
if(p17==0)
{
s5=0;
s6=0; //使能端为0则停止
constant=10; //避免正转以后的速度影响反转启动的速度
}
}
}
void time0(void) interrupt 1
{
static uchar i;
TH0=256-156;
TL0=256-156;
i=i+10;
if(i<=constant)flag=1;
if(i>constant&&i<=100)flag=2;
if(i==100)i=0; //i=100时清零
//根据constant的大小不同来使flag处于不同时间段
//这样就可以使运行正反转的高低电平处于不同时间
}
void int1(void) interrupt 2 using 2 //减速
{
if(p33==0)
{
delay(10);
if(constant==0)constant=0;
/*constant为0时,则一直为0,如无,则cons会变成负数,
根据其补码变为比较大的正数,则又开始加速*/
else if(p33==0)
{
while(!p33);//如果减速按键一直按着,则执行空语句
constant=constant-10; //按键按下且cons不为0,则继续减10
d3=0;
delay(500);
d3=1; //减速灯亮0.5s后灭
}
}
}
void int0(void) interrupt 0 using 0 //加速,原理同减速
{
if(p32==0)
{
delay(10);
if(constant==100)constant=100;
else if(p32==0)
{
while(p32==0);
constant=constant+10;
d2=0;
delay(500);
d2=1;
}
}
}
//延时函数为Z*1ms
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}