找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1737|回复: 7
收起左侧

单片机延时程序怎么写?

[复制链接]
ID:72649 发表于 2022-11-15 01:13 来自手机 | 显示全部楼层 |阅读模式
main()

while(1)

if(KEY=0)
P10=0;
延时两秒;
LED1=0;
延时一秒;
LED2=0;
if(KEY=0没有变化)
则延时15分钟;
LED3=!0;
LED1=1;LED2=1;

if(KEY=1)
LED1=1;
LED2=1;
LED4=0;


要求实现功能如下:1、如果开关没有接通,LED1灯亮,延时两秒后,LED2灯亮;如果15分钟后,开关还是没有接通,则LED3闪烁。LED1、LED2就熄灭。
2、只要开关接通,LED1、LED2就熄灭。LED4灯亮。
以上代码能不能实现这个功能。
回复

使用道具 举报

ID:123289 发表于 2022-11-15 09:04 | 显示全部楼层
闪:你做不到:
1、LED3=!0,即=1,仅关而矣!!
2、闪是亮一断时间,暗一段时间,如此不断交替。你亮了多久,又暗了多久,交替了吗?
教你定时的方法:
1、起动一个定时器,并使用之10ms中断一次。
2、设置一个标记B_1S,它=1就表示时间到了,=0就表示时间未到。不用时清0,表示时间未到。
3、设置一个计时变量R_1S,开始设置成100,准备计时1S。
4、每次中断,查看R_1S:
=0,表示:计时未开始,不需要计时。跳过。
<>0,表示计时进行中,就将R_1S-1。减到0时,就将B_1S置1,表示1S到了。未减到0时,1S未到,跳过。
5、主程序中:当需要计时时(开启计时),就让R_1S=100,1S计时就开始。
6、判断B_1S,就知道1S是不是到了,B_1S=1时,就做你要做的事,做完后记得将B_1S清0,防止重再复做。
如果还需要2S、15M,如法炮制:B_2S、R_2S、B_15M、R_15M。简单吧。
主程序中,延时一秒:IF 一秒,变成 IF B_1S=1,就成了。

闪动:就做一个0.5S的计时器,B_05S,R_05S。
同样:当B_05=1时,就让 LED3 = !LED3,再让B_05=0,R_05=50,0.5S就再次计时开始了。这样LED3 就闪动了。

写程序,要先构思如何达成目的,而后再开始写代码。
思路没有,不正确,自己都解释不通,程序如何写得呢?
回复

使用道具 举报

ID:161164 发表于 2022-11-15 10:51 | 显示全部楼层
2022-11-15_105012.png
回复

使用道具 举报

ID:72649 发表于 2022-11-15 17:29 来自手机 | 显示全部楼层
yzwzfyz 发表于 2022-11-15 09:04
闪:你做不到:
1、LED3=!0,即=1,仅关而矣!!
2、闪是亮一断时间,暗一段时间,如此不断交替。你亮了 ...

谢谢指点
回复

使用道具 举报

ID:72649 发表于 2022-11-15 17:31 来自手机 | 显示全部楼层
lkc8210 发表于 2022-11-15 10:51

谢谢指点,延时是否可以用定时器做
回复

使用道具 举报

ID:101869 发表于 2022-11-15 18:59 | 显示全部楼层
帮人帮到底 目前这个原因闲得蛋疼 给你写好了,我也是菜鸡,见笑了,我用STC给你写的  用的定时器实现你的功能


#include "STC15F104E.H"  //单片机头文件
#define u16 unsigned int //宏定义无符号整型数据
#define u8 unsigned char //宏定义无符号字符型数据

sbit key_sr = P3 ^ 4;
sbit LED_1 = P3 ^ 5;
sbit LED_2 = P3 ^ 0;
sbit LED_3 = P3 ^ 1;
sbit LED_4 = P3 ^ 2;
u8 key_flag = 0;
void SYSTEM_INIT()
{
    P3M1 = 0x00;
    P3M0 = 0x27; // P3(双双推双双推推推)
    LED_1 = 1;
    LED_2 = 1;
    LED_3 = 1;
    LED_4 = 1;
}
void key_scan()
{
    static u8 cnt = 0;
    if (key_sr)
    {
        cnt = 0;
        key_flag = 0;
    }
    else if (!key_flag)
    {
        cnt++;
        if (cnt > 200)
        {
            key_flag = 1;
        }
    }
}
void LED_serve()
{
    static u8 ms50_cnt = 0;
    static u8 min_cnt = 0;  //分钟计数
    static u8 min2_cnt = 0; // 2分钟计时
    static u8 blink_flag = 0;
    static u8 blink_cnt = 0;
    if (!blink_flag)
    {
        if (!key_flag) //开关断开
        {
            LED_1 = 0;
            LED_4 = 1;
        }
        if (!LED_1 && LED_2) //两秒后点亮LED2
        {
            if (++min2_cnt >= 40) //两秒计时到
            {
                min2_cnt = 0;
                LED_2 = 0;
            }
        }
        if (!LED_2)
        {

            if (++ms50_cnt >= 200) // 10秒
            {
                ms50_cnt = 0;
                min_cnt++;
            }
            if (min_cnt >= 90) // 900秒=15分
            {

                blink_flag = 1; //闪灯标志
            }
        }
    }
    if (key_flag) //开关接通
    {
        ms50_cnt = 0;
        min_cnt = 0;
        blink_flag = 0;
        LED_1 = 1;
        LED_2 = 1;
        LED_4 = 0;
    }
    if (blink_flag) //闪灯500毫秒一次
    {
        LED_1 = 1;
        LED_2 = 1;
        blink_cnt++;
        if (blink_cnt <= 10)
        {
            LED_3 = 0;
        }
        else
            LED_3 = 1;
        if (blink_cnt >= 20)
        {
            blink_cnt = 0;
        }
    }
    else
    {
        blink_cnt = 0;
        LED_3 = 1;
    }
}
void Timer0Init(void) // 50毫秒@11.0592MHz
{
    AUXR &= 0x7F; //定时器时钟12T模式
    TMOD &= 0xF0; //设置定时器模式
    TL0 = 0x00;   //设置定时初始值
    TH0 = 0x4C;   //设置定时初始值
    TF0 = 0;      //清除TF0标志
    TR0 = 1;      //定时器0开始计时
    EA = 1;
    ET0 = 1;
}

/***************主程序****************/
void main()
{
    SYSTEM_INIT();
    Timer0Init();

    while (1)
    {
        key_scan();
    }
}

void timer0() interrupt 1
{
    LED_serve();
}
回复

使用道具 举报

ID:72649 发表于 2022-11-16 07:52 | 显示全部楼层
非凡科技 发表于 2022-11-15 18:59
帮人帮到底 目前这个原因闲得蛋疼 给你写好了,我也是菜鸡,见笑了,我用STC给你写的  用的定时器实现你的功能 ...

先谢谢了,功能没有实现,接通电源,指示灯一个都不亮,开关动作不起作用。
回复

使用道具 举报

ID:101869 发表于 2022-11-16 08:33 来自手机 | 显示全部楼层
hjx5548 发表于 2022-11-16 07:52
先谢谢了,功能没有实现,接通电源,指示灯一个都不亮,开关动作不起作用。

检查硬件  这个我用开发板实验很正常
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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