打印

关于按键延时的问题

[复制链接]
4643|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2011-9-9 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2011-9-9 10:36 | 只看该作者
通过多次调用扫键程序完成扫描功能

使用特权

评论回复
板凳
lixiaoxu2meng| | 2011-9-9 10:47 | 只看该作者
程序呢
发上来

使用特权

评论回复
地板
xyz549040622|  楼主 | 2011-9-9 11:56 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;

bit qiflag=0;//定义启动标志,转动标志
bit zhuanflag=1;

uint time=50;
uchar code zheng[]={0x01,0x03,0x02,0x06,0x04,0x05,0x08,0x09};//电动机正转
uchar code fan[]={0x09,0x08,0x05,0x04,0x06,0x02,0x03,0x01};//电动机反转
void delay(time)  //100us延时
{
    uchar a,b;
        uint d;
        for(d=0;d<time;d++)
            for(b=1;b>0;b--)
                for(a=47;a>0;a--);
}

void delay1ms(uchar t)   //1ms
{
    uchar a,b,c;
        uint d;
        for(d=0;d<t;d++)
            for(c=1;c>0;c--)
                for(b=142;b>0;b--)
                    for(a=2;a>0;a--);
}

void zhengzhuan()//正转函数
{
        uchar i;
        for(i=0;i<8;i++)
        {
        P2=zheng[i];
        delay(time);
        }
}

void fanzhuan()//反转函数
{
        uchar i;
        for(i=0;i<8;i++)
        {
        P2=fan[i];
        delay(time);
        }
}

void key1()//启动,停止按钮
{

        if(s1==0)
        {
                TR0=0;
                delay1ms(20);
                TR0=1;
                if(s1==0)
                {
                qiflag=!qiflag;
               
                }

        }
}

void key2()//正反转按钮
{

        if(s2==0)
        {
                TR0=0;
                delay1ms(20);
                TR0=1;
                if(s2==0)
                {
                zhuanflag=!zhuanflag;
               
                }

        }
}

void key3()//加速按钮
{

        if(s3==0)
        {
                TR0=0;
                delay1ms(50);
                TR0=1;
                if(s3==0)
                {
                if(time!=140)
                time++;

               
                }

        }
}

void key4()//加速按钮
{

        if(s4==0)
        {
                TR0=0;
                delay1ms(50);
                TR0=1;
                if(s4==0)
                {
                if(time!=30)
                time--;

               
                }

        }
}

void init_timer0()
{
        TMOD=0x01;//定时器0,工作方式1
        TH0=(65535-1000)/256;
        TL0=(65535-1000)%256;//1ms中断一次
        EA=1;
        ET0=1;
        TR0=1;//总中断,定时器1打开
}

void  timer0() interrupt 1
{
        TH0=(65535-1000)/256;
        TL0=(65535-1000)%256;//1ms中断一次
        key1();
        key2();
        key3();
        key4();
}

void flag()//标志位函数
{
if(qiflag==0)
  {P2=0x00;}//启动标志为0,停止转动
if(qiflag==1&&zhuanflag==1)
  {zhengzhuan();}//启动标志位为1,转动标志位为1,电机正转
if(qiflag==1&&zhuanflag==0)
  {fanzhuan();}//启动标志位为1,转动标志位为0,电机反转
}

void main()
{
        init_timer0();
        while(1)
        {
        flag();
        }
}

使用特权

评论回复
5
xyz549040622|  楼主 | 2011-9-9 11:58 | 只看该作者
按键有时正常,有时不正常,每次按键加减的时候,电机会有微小的停顿

使用特权

评论回复
6
beyond696| | 2011-9-9 12:07 | 只看该作者
减小中断扫描时间,通过多次中断扫描判断按键状态并最终得出结论

使用特权

评论回复
7
ayb_ice| | 2011-9-9 13:09 | 只看该作者
还没有真正的编程概念

使用特权

评论回复
8
xyz549040622|  楼主 | 2011-9-9 16:53 | 只看该作者
新手上路,嘿嘿,真正的编程概念是指?

使用特权

评论回复
9
ayb_ice| | 2011-9-9 17:04 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-9 17:06 编辑
新手上路,嘿嘿,真正的编程概念是指?
xyz549040622 发表于 2011-9-9 16:53

你的很多程序有大量的延时程序,当然影响实时性了
居然在中断中也延时(子程序中调用延时程序),只能说明你对中断的理解还没有入门
想办法除掉这些延时函数,还要功能正常,你就差不多入门了
你这样的程序,逻辑混乱,当然容易出错,项目大了,根本不可能维护的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xyz549040622 + 1
10
xyz549040622|  楼主 | 2011-9-9 17:22 | 只看该作者
:lol确实是个问题,我继续修改

使用特权

评论回复
11
wanghongxing| | 2011-9-9 18:46 | 只看该作者

使用特权

评论回复
12
夜阑冰凌| | 2011-9-10 16:22 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar cnt;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
bit qiflag=0;
bit zhuanflag=1;
uint time=50;
uchar code zheng[]={0x01,0x03,0x02,0x06,0x04,0x05,0x08,0x09};
uchar code fan[]={0x09,0x08,0x05,0x04,0x06,0x02,0x03,0x01};
void delay(time)  
{
    uchar a,b;
        uint d;
        for(d=0;d<time;d++)
            for(b=1;b>0;b--)
                for(a=47;a>0;a--);
}
void delay1ms(uchar t)
{
    uchar a,b,c;
        uint d;
        for(d=0;d<t;d++)
            for(c=1;c>0;c--)
                for(b=142;b>0;b--)
  for(a=2;a>0;a--);
}
void zhengzhuan()
{
        uchar i;
        for(i=0;i<8;i++)
        {
        P2=zheng;
        delay(time);
        }
}
void fanzhuan()
{
        uchar i;
        for(i=0;i<8;i++)
        {
        P2=fan;
        delay(time);
        }
}
void key1()
{
        if(s1==0)
        {
                TR0=0;
                delay1ms(20);
                TR0=1;
                if(s1==0)
                {
                qiflag=!qiflag;
               
                }
        }
}
void key2()
{
        if(s2==0)
        {
                TR0=0;
                delay1ms(20);
                TR0=1;
                if(s2==0)
                {
                zhuanflag=!zhuanflag;
               
                }
        }
}
void key3()
{
        if(s3==0)
        {
                TR0=0;
                delay1ms(50);
                TR0=1;
                if(s3==0)
                {
                if(time!=140)
                time++;
               
                }
        }
}
void key4()
{
        if(s4==0)
        {
                TR0=0;
                delay1ms(50);
                TR0=1;
                if(s4==0)
                {
                if(time!=30)
                time--;
               
                }
        }
}
void init_timer0()
{
        TMOD=0x01;
        TH0=0x94;
        TL0=0x00;
        EA=1;
        ET0=1;
        TR0=1;
}
void  timer0() interrupt 1
{       TH0=0x94;
        TL0=0x00;

  cnt++;
  if(cnt>3)cnt=0;
  switch(cnt)
  {
  case 0:key1();break;
        case 1:key2();break;
        case 2:key3();break;
  case 3:key4();break;
  default:break;
  }
}
void flag()
{
if(qiflag==0)
  {P2=0x00;}
if(qiflag==1&&zhuanflag==1)
  {zhengzhuan();}
if(qiflag==1&&zhuanflag==0)
  {fanzhuan();}
}
void main()
{
        init_timer0();
        while(1)
        {
        flag();
        }
}
请帮我看下我这样修改行不?主要改了中断时间和中断程序,我是新手,也无法调试,不知道效果 7# ayb_ice

使用特权

评论回复
13
夜阑冰凌| | 2011-9-10 16:24 | 只看该作者
为什么我回复时中文注释都是乱码? 程序字体还是斜的

使用特权

评论回复
14
xyz549040622|  楼主 | 2011-9-11 09:30 | 只看该作者
12# 夜阑冰凌 不行呢,没反应

使用特权

评论回复
15
liang7143| | 2011-9-11 11:26 | 只看该作者
定时扫描按键,就无需按键延时了

使用特权

评论回复
16
lixiaoxu2meng| | 2011-9-15 11:22 | 只看该作者
首先 中断改成10ms一次

其次 拿按键1 来举例 定义个变量 count
void key1()//启动,停止按钮
{

        if(s1==0)
        {
           count++;
           if(count>=2)
                {
                  count = 0;
                 qiflag=!qiflag;
                  }
        }
    else count = 0;
}
你试试看看行不

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xyz549040622 + 1
17
ayb_ice| | 2011-9-15 11:32 | 只看该作者
LZ还没有时间片的概念,没有多任务概念,还早

使用特权

评论回复
18
lp525110627| | 2011-9-15 16:58 | 只看该作者
用中断啊。。。

使用特权

评论回复
19
xyz549040622|  楼主 | 2011-9-15 19:57 | 只看该作者
受教了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2812

主题

19299

帖子

105

粉丝