大佬們,我兩個驅動分別驅動,電機都能正常轉動,加上按鍵卻沒響應
單片機源程序如下:
#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);
}
}
}
}
|