打印
[STC单片机]

绿色部分程序功能延时3秒后led灯亮,实现不了,求助

[复制链接]
4235|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 单片机学习123 于 2013-8-31 15:20 编辑

蓝色部分程序是先按K1,释放后再按k2,led灯亮
红色部分程序是按k2 ,释放后再按 K1 ,led灯灭
绿色部分程序是先按k2但不释放再按k1,这时等于说K2、k1都不释放(但必须是有顺序的,不能同时按下去)大约3秒后led亮(此功能无法实现,求助……)

#include<reg52.h>
bit a=0 ;
bit b=0 ;
sbit   k1=P3^0;
sbit   k2=P3^6;
sbit   led=P1^0;
sbit LED2=P1^1;
void DelayUs2x(unsigned int t);
void DelayMs(unsigned int t);
static unsigned char i;
void Init_Timer0(void)
{
TMOD|= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
TH0=(65536-50000)/256;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=(65536-50000)%256;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}

void main()
{  while(1)   
   {
    if(k1==0&&a==0)
       {DelayMs(10);
        if(k1==0&&a==0)
         {a=1;//a是判断第一次按下的标志
                 Init_Timer0();     
          while(a==1||k2==0)
            {
              if(k2==0)
              {
                DelayMs(10);
                if(k2==0)
                {
                 led=0;
                 a=0;
                }
              }
            }
         }   
     }

      if(k2==0&&a==0)
      {DelayMs(10);
      if(k2==0&&a==0)
         {a=1;
          Init_Timer0();
           while(a==1||k1==0)
               {if(k1==0)
                  {DelayMs(10);
                      if(k1==0)
                        {led=1;
                           a=0;                          
                        }
                  }
               }
         }   
     }

if(k2==0&&b==0)
    {DelayMs(10);
        if(k2==0&&b==0)
          {b=1;
           while(b==1||k1==0)
               {if(k1==0)
                DelayMs(10);
                if(k1==0)
                {
                DelayMs(3000);
                 led=0;
                  b=0;
                 }
               }
          }
      }  
  }
}
void DelayUs2x(unsigned int t)
{   
while(--t);
}

void DelayMs(unsigned int t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
void Timer0_isr(void) interrupt 1 using 1
{
TH0=(65536-50000)/256;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=(65536-50000)%256;
i++;
       if(i>10)        //2s
        {i=0;
                a=0;
                LED2=!LED2;}
}

相关帖子

沙发
zhx0919| | 2013-8-30 10:08 | 只看该作者
把注释写上去,会得到更多的帮助。

使用特权

评论回复
板凳
lianyun121| | 2013-8-30 10:25 | 只看该作者
没有大循环。

使用特权

评论回复
地板
杨爱林林| | 2013-8-30 11:14 | 只看该作者
一定要记得 大循环

使用特权

评论回复
5
ningling_21| | 2013-8-30 12:58 | 只看该作者
你定时设定的10次中断是 2秒吗?

使用特权

评论回复
6
单片机学习123|  楼主 | 2013-8-30 14:46 | 只看该作者
杨爱林林 发表于 2013-8-30 11:14
一定要记得 大循环

因为是初学者,请教一下哪种样式才是所谓的大循环,我对这个概念很模糊,请简单介绍一下,谢谢了!

使用特权

评论回复
7
单片机学习123|  楼主 | 2013-8-30 14:52 | 只看该作者
lianyun121 发表于 2013-8-30 10:25
没有大循环。

如果没有大循环一般会出现什么状况?

使用特权

评论回复
8
杨爱林林| | 2013-8-30 15:00 | 只看该作者
单片机学习123 发表于 2013-8-30 14:46
因为是初学者,请教一下哪种样式才是所谓的大循环,我对这个概念很模糊,请简单介绍一下,谢谢了! ...

恩 是这样的
int main(void)
{
  相关变量的定义;
  init();//这里进行模块初始化,比如uart,tim等等
  while//这个while就是所谓的大循环了
{
   这里放置用户代码;
}
}
给你解释一下为什么要放大循环
如果你不放循环  当main顺序执行后到最后一条语句,程序就结束了   笼统说 就相当于死了吧
对于我们单片机嵌入式编程来说,其一直都是周而复始的过程,也就是一个或多个过程周而复始!举个例子,银行取款机,如果没有所谓的大循环,那你说 它会是什么一种情况

你是初学者,只要养好编程习惯就好了,裸机编程 ,无非就是状态机,各个状态间的切换
可以看看状态机

使用特权

评论回复
9
hzj515| | 2013-8-30 16:54 | 只看该作者
控制目的不明确,
是不是按一键LED亮,三秒之后熄灭,或是单片机上电3秒后亮.....
有明确的目标才能做成,

使用特权

评论回复
10
YDCMAN| | 2013-8-30 20:18 | 只看该作者
编程事先构思一下,最好别用这么多嵌套,自己看的也觉得很累

使用特权

评论回复
11
单片机学习123|  楼主 | 2013-8-31 07:53 | 只看该作者
杨爱林林 发表于 2013-8-30 15:00
恩 是这样的
int main(void)
{

非常感谢,我明白了!另外,能不能再看看程序,帮我解决一下问题,再次感谢了

使用特权

评论回复
12
杨爱林林| | 2013-8-31 12:15 | 只看该作者
单片机学习123 发表于 2013-8-31 07:53
非常感谢,我明白了!另外,能不能再看看程序,帮我解决一下问题,再次感谢了 ...

你的 k1按下 有没有释放啊
绿色的部分

使用特权

评论回复
13
单片机学习123|  楼主 | 2013-8-31 14:59 | 只看该作者
杨爱林林 发表于 2013-8-31 12:15
你的 k1按下 有没有释放啊
绿色的部分

也不释放,之后 大约3秒后灯亮,

使用特权

评论回复
14
单片机学习123|  楼主 | 2013-8-31 15:22 | 只看该作者
zhx0919 发表于 2013-8-30 10:08
把注释写上去,会得到更多的帮助。

恩,谢谢提醒,记住了!请再帮忙看看程序,再次感谢!

使用特权

评论回复
15
sedatefire| | 2013-8-31 17:49 | 只看该作者
看到一堆“硬延时”,我的心就很纠结。
系统程序一大,就要悲剧。

使用特权

评论回复
16
佳宁喜欢我| | 2013-9-1 22:44 | 只看该作者
哎呦,不错哦

使用特权

评论回复
17
samsunghellome| | 2013-9-3 07:05 | 只看该作者
sedatefire 发表于 2013-8-31 17:49  看到一堆“硬延时”,我的心就很纠结。  系统程序一大,就要悲剧。

硬延时?你指的是delay延时程序吗?调用定时器中断会好点吧!“系统程序”你指的是main函数中指令太多吗?能不能解释一下:写在main函数中与另写一个独立模块调用有什么本质区别?谢谢!

使用特权

评论回复
18
sedatefire| | 2013-9-3 23:26 | 只看该作者
samsunghellome 发表于 2013-9-3 07:05
硬延时?你指的是delay延时程序吗?调用定时器中断会好点吧!“系统程序”你指的是main函数中指令太多吗 ...

系统超过5000行代码,10个.c文件,你就知道什么叫悲剧了

使用特权

评论回复
19
outstanding| | 2013-9-4 00:42 | 只看该作者

使用特权

评论回复
20
电子点名| | 2013-10-5 16:15 | 只看该作者
我大概看了一下,知道你的思路,就是按下K1,加个标志位,然后再按K2,判断K2和标志位,这个还行,反正放国庆无聊,等下我写了程序,然后发你看看

使用特权

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

本版积分规则

17

主题

134

帖子

0

粉丝