找回密码
 立即注册

QQ登录

只需一步,快速开始

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

只要开关闭合,LED灯亮,开关断开,LED灯熄灭,程序怎样实现?

[复制链接]
跳转到指定楼层
楼主
ID:72649 发表于 2021-9-17 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
只要开关闭合,LED灯亮,开关断开,LED1灯熄灭,延时10秒,LED2灯点亮,程序怎样实现?要求延时用定时器写。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:831673 发表于 2021-9-22 22:48 | 只看该作者
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. uchar aa; sbit led1=P0^0; sbit led2=P0^1;
  4. sbit key=P0^2;
  5. void init();
  6. void display(); void main()//主程序
  7. {
  8. init();
  9. display();
  10. }
  11. void display()
  12. {
  13. if(key==0)
  14. {
  15. led1=1;//打开开关就点亮
  16. }
  17. else
  18. {
  19. led1=0;//关闭开关关灯
  20. while(aa==200)//每50ms aa+1,加200次就是10s
  21. {
  22. led2=1;//十秒后led2灯亮起
  23. }
  24. }
  25. }
  26. void init()//初始化函数
  27. {
  28. EA=1;
  29. TMOD=0X01;
  30. ET0=1;
  31. TR0=1;
  32. }
  33. void time0() interrupt 1//定时器0
  34. {
  35. TH0=(65596-50000)/256;
  36. TL0=(65596-50000)%256;
  37. aa++;
  38. }

复制代码
这是我根据你的要求,用定时器0写的,有注释可以参考,我也在学习单片机没多久,可能代码写的有些错误,可以参考一下。
其中key是开关,这里表示按钮,低电平有效,init是定时器的初始化函数。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:964308 发表于 2021-9-18 07:49 来自手机 | 只看该作者
#include "reg51.h"  sbit led1=P0^0; sbit led2=P0^1; sbit key=P0^2;  int delay( unsigned int x)    //ms级延时函数 {     unsigned int i,j;     for(i=0;i<x;i++)         for(j=0;j<110;j++); }  void main() { unsigned int a=0;     while(1)     {         if(key)         {             if(a)             {             led1=0;             delay(10000);             led2=1;             a=0;             }         }         else         {         led1=1;         a=1;         }     } }
回复

使用道具 举报

地板
ID:964308 发表于 2021-9-18 07:52 | 只看该作者
为什么需要定时器,都延时10s了还定时器
#include "reg51.h"

sbit led1=P0^0;
sbit led2=P0^1;
sbit key=P0^2;

int delay( unsigned int x)    //ms级延时函数
{
    unsigned int i,j;
    for(i=0;i<x;i++)
        for(j=0;j<110;j++);
}

void main()
{
unsigned int a=0;
    while(1)
    {
        if(key)
        {
        delay(50);
            if(a)
            {
            led1=0;
            delay(10000);
            led2=1;
            a=0;
            }
        }
        else
        {
        delay(50);
        led1=1;
        a=1;
        }
    }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:584195 发表于 2021-9-18 08:05 | 只看该作者
先去学定时器,再学中断!期待你的作品成功交!
回复

使用道具 举报

6#
ID:716656 发表于 2021-9-18 08:54 | 只看该作者
找一个led灯闪烁的程序,在基础上sbit增加一个灯,通过你的逻辑修改程序,延时时间不对的话可以在stc_isp上找
回复

使用道具 举报

7#
ID:72649 发表于 2021-9-18 09:10 | 只看该作者
dzc3458 发表于 2021-9-18 07:52
为什么需要定时器,都延时10s了还定时器
#include "reg51.h"

关键还有长时间延时需要调用
回复

使用道具 举报

8#
ID:72649 发表于 2021-9-18 09:21 | 只看该作者
dzc3458 发表于 2021-9-18 07:52
为什么需要定时器,都延时10s了还定时器
#include "reg51.h"
unsigned long SysTick;

void Timer0Init(void)                //1毫秒@18.432MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0xB8;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

timer0() interrupt 1
{
        SysTick++;      
}

void Delay(unsigned long var)
{
    unsigned long i;
      
        i = SysTick;

        while(SysTick-i < var)
        {
       ;
        }   
}
回复

使用道具 举报

9#
ID:161164 发表于 2021-9-18 10:44 | 只看该作者
hjx5548 发表于 2021-9-18 09:21
unsigned long SysTick;

void Timer0Init(void)                //1毫秒@18.432MHz

结合你的定时器就完成了

  1. void main()
  2. {
  3.     Timer1Init();//定时器初始化
  4.     key1_O = key1;
  5.     while (1)
  6.     {
  7.                                         if(!Delayms_XX)
  8.                                         {Delayms_XX=10;//在1ms定时中断中减1
  9.                                                 led1 = key1;
  10.                                                 if(!key1_O && key1)//上升沿触发
  11.                                                 {
  12.                                                         Delay_10s = 1;
  13.                                                         Count_10s = 0;
  14.                                                 }key1_O = key1;
  15.                                                 if(Delay_10s)
  16.                                                 {
  17.                                                         if(Count_10s++>1000)//10ms X 1000 = 10s
  18.                                                         {
  19.                                                                 Delay_10s = 0;
  20.                                                                 led2 = 0;
  21.                                                         }
  22.                                                 }
  23.                                         }                       
  24.     }
  25. }
复制代码

回复

使用道具 举报

10#
ID:72649 发表于 2021-9-19 21:50 | 只看该作者
lkc8210 发表于 2021-9-18 10:44
结合你的定时器就完成了

能不能完整写出了?
回复

使用道具 举报

11#
ID:161164 发表于 2021-9-19 22:06 | 只看该作者
hjx5548 发表于 2021-9-19 21:50
能不能完整写出了?

当然可以~
靠你了老弟~!
回复

使用道具 举报

12#
ID:967508 发表于 2021-9-22 15:27 | 只看该作者
这个程序其实很简单,实现的方法有很多,可以先定义io口加一个if语句就可以了
回复

使用道具 举报

13#
ID:824490 发表于 2021-9-22 21:15 | 只看该作者
没有时间延时的话就3行代码:

sbit SW  = P0^0;
sbit LED = P1^0;

LED = SW;
或者 LED=~SW;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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