大佬们,我两个驱动分别驱动,电机都能正常转动,加上按键却没响应
单片机源程序如下:
#include <reg51.h>
#include <intrins.h> //微秒(_nop_)头文件
#define uint unsigned int
#define uchar unsigned char
sbit dir=P1^0;
sbit pul=P1^1;
sbit ena=P1^5;
sbit dir1=P1^2;
sbit step1=P1^3;
sbit key1 = P0^0;
sbit key2 = P0^1;
sbit key3 = P0^2;
sbit key4 = P0^3;
uint x,y;
uchar flag = 0;
/*******************************************************************/
/*********** 延时函数 **************/
/*******************************************************************/
void Delay1000us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
/*******************************************************************/
/*********** 运动函数 *************/
/*******************************************************************/
void up_1()
{
ena = 1;
dir=1; //dir为1时正转,dir为0时反转
for( x = 0; x <=133; x++)
{ //一圈200个脉冲 两个pul为一个脉冲 16个脉冲就是28.8°距离30°是1.2°,如果改成17个脉冲就是30.6°
pul=1;
Delay1000us(); //修改微秒值可以调速
pul=0;
Delay1000us();
}
}
void do_1()
{
ena = 1;
dir=0; //dir为1时正转,dir为0时反转
for( x = 0; x <=133; x++)
{ //一圈200个脉冲 两个pul为一个脉冲 16个脉冲就是28.8°距离30°是1.2°,如果改成17个脉冲就是30.6°
pul=1;
Delay1000us(); //修改微秒值可以调速
pul=0;
Delay1000us();
}
}
void up_2()
{
dir1=1;//电机正转
for( x = 0; x <=100; x++) { //一个圈200个脉冲
step1=1;
Delay1000us();
step1=0;
Delay1000us();
}
}
void do_2()
{
dir1=0;//电机反转
for( x = 0; x <=100; x++) {
step1=1;
Delay1000us();//时间长短会影响电机运动
step1=0;
Delay1000us();
}
}
/*******************************************************************/
/*********** 中断函数 *************/
/*******************************************************************/
void keyscan()
{
//按键一
if(P0^0==0) //如果K1按键按下
{
delay(20); //延时消抖
while(P0^0==1); //松手检测
delay(20); //延时消抖
flag = 1;
}
//按键二
else if(P0^1==0) //如果K1按键按下
{
delay(20); //延时消抖
while(P0^1==1); //松手检测
delay(20); //延时消抖
flag = 2;
}
//按键三
else if(P0^2==0) //如果K1按键按下
{
delay(20); //延时消抖
while(P0^2==1); //松手检测
delay(20); //延时消抖
flag = 3;
}
else
flag =0;
}
void time0_init() //定时器T0初始化
{
TMOD=0x01; //设置定时器0工作方式1
TH0=(65536-50000)/256;//定时50ms取高八位
TL0=(65536-50000)%256; //取低八位
ET0=1; //开定时器0中断使能
EA=1; //开总中断使能
TR0=1; //开启中断
}
void time0() interrupt 1 //定时器T0入口函数
{
TH0=(65536-50000)/256; //定时50ms重新赋初值
TL0=(65536-50000)%256;
keyscan();
}
/*******************************************************************/
/*********** 主函数 *************/
/*******************************************************************/
void main()
{
time0_init();
while(1){
if(flag != 0)
{
if(flag == 1)
{
up_1();
delay(1000);
do_1();
delay(1000);
}
else if(flag == 2)
{
up_2();
delay(1000);
do_2();
delay(1000);
}
else if(flag == 3)
{do_2();
delay(1000);
up_2();
delay(1000);
}
}
}
}
|