找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1667|回复: 6
打印 上一主题 下一主题
收起左侧

这里大神多,请教个小小问题,按键控制失效了,帮忙看看

[复制链接]
跳转到指定楼层
楼主
ID:125710 发表于 2016-7-17 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
运行程序如下:开机2S后 电机开始运行  按下按键1 电机开始停止(松开按键1也是停止)  直到 其它按键按下时再运行  但是无论我怎么设置 (设置了变量++)永远是按下去的时候 电机停止了  松手后又开始运行了 。欲哭无泪。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code FFW[9]={  0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6,0x00};//28BYJ-48正时钟旋转相序表单双八拍工作方式:A-AB-B-BC-C-CD-D-DA 停止运行
char num,num1,num2,num3,num4,i,abb;
sbit out1=P3^4;
sbit out2=P3^5;
sbit out3=P3^6;
sbit LED=P3^7;

sbit LED1=P1^0;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit LED6=P1^5;
sbit beep=P2^3;
void init();

/*****************************************************************
                    延时函数
*****************************************************************/
void delay(uint z)            //ms延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}

/*****************************************************************
                    28BYJ-48步进电机加ULN2003驱动步进电机正转
*****************************************************************/
void  motor_ffw(unsigned int n)  //步进电机一周函数
{
  unsigned char tmp;  //定义2个临时变量
   unsigned int  j;
   for (j=0; j<8*64*n; j++)  //运行一周期
    {
     
        
     tmp=P0;         //用 tmp 把 P0 口当前值暂存
     tmp = tmp & 0xF0; //用&操作清零低 4 位 高四位不影响
     tmp = tmp | FFW[i];//用|操作把节拍代码写到低 4 位
          P0 =tmp;
       i++;
       i=i&0x07;              
       delay(2);
         beep=0;
    }
}
void moto_off()  //关步进电机函数
{
    unsigned char i,tmp;  //定义2个临时变量
     tmp=P0;         //用 tmp 把 P0 口当前值暂存
     tmp = tmp & 0xF0; //用&操作清零低 4 位 高四位不影响
     tmp = tmp | FFW[9];//用|操作把节拍代码写到低 4 位
          P0 =tmp;
      
     //  i=9;                     
         beep=1;
}



/*****************************************************************
                    按键函数
*****************************************************************/
void keyscan()        //按键函数
{
  motor_ffw(1);
if(K1==0)             //检测K1=P1.0按键是否被按下,确定按下后步进电机停止 延长2秒P0.4一直持续低电平
   {
   delay(10);
   
   if(K1==0)
     {
    LED6=1;
   
     //delay(2000);  //等待2秒
    out1=0;       //P0.4程序低电平      
     while(!K1);    //等待按键释放
   
   
     }  
    }
  
  
  if(K2==0)        //检测K2=P1.1按键是否被按下,确定按下P0.5保持0.5秒
   {
   delay(10);
   
   if(K2==0)
     {
         
   // LED6=0;      //P0.5变低电平
      // beep=0;   
  delay(500);     //保持0.5秒低电平
    //LED6=1;       // 然后变为高电平
       //beep=1;
        
     while(!K1);         //等待按键释放
     }  
    }
     
  if(K3==0)        //检测K3=P1.2按键是否被按下,确定按下P0.4变为高电平
   {
   delay(10);
   
   if(K3==0)
     {
         
//   LED2=1;
//    beep=1;
        
     while(!K3);         //等待按键释放
     }  
    }
  
  if(K4==0)        //检测K4=P1.3按键是否被按下,确定按下步进电机运行10周后停止。
   {
   delay(10);
   
   if(K4==0)
     {
         
//   LED6=0;         
     while(!K4);         //等待按键释放
     }  
    }
  
  if(K5==0)        //检测K5=P1.4按键是否被按下,如果按下P0.6=L 保持1秒  P0.7一直保持低电平
   {
   delay(10);
   
   if(K5==0)
     {
         
  // LED6=0;         //如果按下P0.6=L 保持1秒
     //LED7=0;         //如果按下 P0.7一直保持低电平
     delay(1000);
//     LED6=1;   
     while(!K5)         //等待按键释放
    {
     delay(2000);
      zihanshu();
       }
  
     }  
    }
  
}



/*****************************************************************
                    定时器
*****************************************************************/
void init()                  //定时器初始化
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void T0_time()interrupt 1   //中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)           //一秒时间到  
{
   num3++;
   num1++;
num=0;
   }
}
/*****************************************************************
                    延时2秒
*****************************************************************/
void delay2s()
{
  if(num1>2)
  num1=0;
}


/*****************************************************************
                  主函数
*****************************************************************/
void main()   
{
  init();
   moto_off();
  LED6=0;
  
  
while(1)
{
  
  if(num1>=2)    //开机后等待2秒 定时器不清0;
  {  
     
   motor_ffw(1);
   keyscan();
            
  }
   }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:105206 发表于 2016-7-17 21:10 | 只看该作者
你的目标是要达到什么要求?
回复

使用道具 举报

板凳
ID:105206 发表于 2016-7-17 21:19 | 只看该作者
如果开机机运行,可以开机就把定时器打开。在中断里处理运行.按下按钮,关闭定时器.
回复

使用道具 举报

地板
ID:130828 发表于 2016-7-17 21:21 | 只看该作者
中断服务函数写在主函数后面   你去试试看
回复

使用道具 举报

5#
ID:130050 发表于 2016-7-17 21:27 | 只看该作者
我也同意楼上观点  把开关放在定时器中断里  然后把定时器中断在按键里运行  然后在中断函数里TR0=0把定时器中断关上  (你的程序太多定义看晕了)
回复

使用道具 举报

6#
ID:125710 发表于 2016-7-17 21:42 | 只看该作者
jubaolun 发表于 2016-7-17 21:10
你的目标是要达到什么要求?

目标就是 开机后2秒开始 进如while(1)  然后步进电机不断运行  直到按键1按下后 不再运许 。按键5按下后运行10圈  但是我目前 按键1就出问题了
回复

使用道具 举报

7#
ID:125710 发表于 2016-7-17 21:45 | 只看该作者
超级小太阳 发表于 2016-7-17 21:27
我也同意楼上观点  把开关放在定时器中断里  然后把定时器中断在按键里运行  然后在中断函数里TR0=0把定时 ...

我定义是从以前程序拷贝过来  还没有进行修改的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表