找回密码
 立即注册

QQ登录

只需一步,快速开始

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

开关延时灯

[复制链接]
跳转到指定楼层
楼主
ID:60515 发表于 2015-3-28 21:32 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人爱好电子。想做一个,按1键LED1亮延时5分钟灭,按2键LED2亮延时10分钟灭。按3键停止延时。那位老师能帮忙写一下C程序。谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:75575 发表于 2015-3-28 23:37 | 只看该作者
你可以使用中断,挺好写的,思路就是,启动--5min---关闭(K1);其他同,后面如果还不好,我试试,也是新手,不过我的帖子应该可以给你灵感,http://www.51hei.com/bbs/dpj-32217-1.html

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

板凳
ID:58502 发表于 2015-3-29 13:01 | 只看该作者
这程序很简单,属于入门级的。你应该自己先写写,有问题拿出来问,这样对你学习才有帮助,假如都是拿别人的程序那么你永远学不会
回复

使用道具 举报

地板
ID:75575 发表于 2015-3-29 14:35 | 只看该作者
liaolinhui 发表于 2015-3-29 13:01
这程序很简单,属于入门级的。你应该自己先写写,有问题拿出来问,这样对你学习才有帮助,假如都是拿别人的 ...

赞同    !!!!
回复

使用道具 举报

5#
ID:60515 发表于 2015-3-29 20:53 来自手机 | 只看该作者
liaolinhui 发表于 2015-3-29 13:01
这程序很简单,属于入门级的。你应该自己先写写,有问题拿出来问,这样对你学习才有帮助,假如都是拿别人的 ...

#include <AT89X51.H>
#define uchar unsigned char
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;

void delay10ms(void)
{
  unsigned char i,j;
  for(i=20;i>0;i--)
  for(j=248;j>0;j--);
}
void main(void)
{
     EA=1;
     ET0=1;
     TMOD=0x01;
     TH0=(65536-500)/256;
     TL0=(65536-500)%256;
     TR0=1;
while(1)
    {
      if(K1==0)
        {
          delay10ms();
          if(K1==0)
            {
              if(num==200)
                {
                  num==0;
                  LED1=0;
                 }
             while(k3==0);
             }
        }  
  }
}

void time0() interrupt 1
{
     TH0=(65536-500)/256;
     TL0=(65536-500)%256;
     num++;

回复

使用道具 举报

6#
ID:60515 发表于 2015-3-29 21:09 来自手机 | 只看该作者
酸葡萄爱好者2 发表于 2015-3-28 23:37
你可以使用中断,挺好写的,思路就是,启动--5min---关闭(K1);其他同,后面如果还不好,我试试,也是新手 ...

还是不延时
回复

使用道具 举报

7#
ID:58502 发表于 2015-3-30 00:51 | 只看该作者
不是这样的,。你这样写就是按下按键判断是否num==200等于的话就灭,而你按下的时候不会那么巧刚好200的
#include <AT89X51.H>
#define uchar unsigned char
uchar a,b;//计时标志
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;

void delay10ms(void)
{
  unsigned char i,j;
  for(i=20;i>0;i--)
  for(j=248;j>0;j--);
}
void main(void)
{
     EA=1;
     ET0=1;
     TMOD=0x01;
     TH0=(65536-50000)/256;//定时50ms应该要50000
     TL0=(65536-50000)%256;
     TR0=1;
LED1=1;
LED0=1;//我假设的是LED阴极接单片机,阳极接VCC,所以输出1是熄灭
while(1)
    {
      if(K1==0)
        {
          delay10ms();
          if(K1==0)
            {
             a=1;//按下按键后计时标志为1
             LED0=0;//LED0亮
             }
        }
         if(K2==0)
        {
          delay10ms();
          if(K2==0)
            {
             b=1;//按下按键后计时标志为1
             LED1=0;//LED1亮
             }
        }  

        if(num==6000)//20*50毫秒等于1秒5分钟需要300个1秒,所以是300*20=6000
        {
        a=0;//清楚标志
        LED0=0;//灯熄灭       
        }
        if(num==12000)//20*50毫秒等于1秒5分钟需要300个1秒,所以是300*20=6000
        {
        b=0;//清楚标志
        LED1=0;//灯熄灭       
        }
  }



}

void time0() interrupt 1
{
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;
    if((a==1)|(b==1)) num++;//判断计时标志是否为1,为1就开始计时
回复

使用道具 举报

8#
ID:60515 发表于 2015-3-30 19:50 来自手机 | 只看该作者
liaolinhui 发表于 2015-3-30 00:51
不是这样的,。你这样写就是按下按键判断是否num==200等于的话就灭,而你按下的时候不会那么巧刚好200的
# ...

老师你好!还是实现不了?
回复

使用道具 举报

9#
ID:60515 发表于 2015-3-30 20:22 来自手机 | 只看该作者
liaolinhui 发表于 2015-3-30 00:51
不是这样的,。你这样写就是按下按键判断是否num==200等于的话就灭,而你按下的时候不会那么巧刚好200的
# ...

老师你好!还是实现不了?没延时,一按就亮。
回复

使用道具 举报

10#
ID:58502 发表于 2015-3-31 00:52 | 只看该作者
GUOPK 发表于 2015-3-30 20:22
老师你好!还是实现不了?没延时,一按就亮。

我写的是一按就亮,延时5分钟灭啊,难道你是要按下延时5分钟后才亮?
回复

使用道具 举报

11#
ID:60515 发表于 2015-3-31 12:13 来自手机 | 只看该作者
liaolinhui 发表于 2015-3-31 00:52
我写的是一按就亮,延时5分钟灭啊,难道你是要按下延时5分钟后才亮?

我是想要亮5分钟后灭
回复

使用道具 举报

12#
ID:60515 发表于 2015-3-31 19:29 来自手机 | 只看该作者
liaolinhui 发表于 2015-3-31 00:52
我写的是一按就亮,延时5分钟灭啊,难道你是要按下延时5分钟后才亮?

谢谢老师!我改成功了,是把a=0;LED1=1;灯才会灭。做了很久到现在才成功。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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