標題: 單片機延時程序怎么寫? [打印本頁]

作者: hjx5548    時間: 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;


要求實現(xiàn)功能如下:1、如果開關沒有接通,LED1燈亮,延時兩秒后,LED2燈亮;如果15分鐘后,開關還是沒有接通,則LED3閃爍。LED1、LED2就熄滅。
2、只要開關接通,LED1、LED2就熄滅。LED4燈亮。
以上代碼能不能實現(xiàn)這個功能。
作者: yzwzfyz    時間: 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 就閃動了。

寫程序,要先構思如何達成目的,而后再開始寫代碼。
思路沒有,不正確,自己都解釋不通,程序如何寫得呢?
作者: lkc8210    時間: 2022-11-15 10:51


作者: hjx5548    時間: 2022-11-15 17:29
yzwzfyz 發(fā)表于 2022-11-15 09:04
閃:你做不到:
1、LED3=!0,即=1,僅關而矣!
2、閃是亮一斷時間,暗一段時間,如此不斷交替。你亮了 ...

謝謝指點
作者: hjx5548    時間: 2022-11-15 17:31
lkc8210 發(fā)表于 2022-11-15 10:51

謝謝指點,延時是否可以用定時器做
作者: 非凡科技    時間: 2022-11-15 18:59
幫人幫到底 目前這個原因閑得蛋疼 給你寫好了,我也是菜雞,見笑了,我用STC給你寫的  用的定時器實現(xiàn)你的功能


#include "STC15F104E.H"  //單片機頭文件
#define u16 unsigned int //宏定義無符號整型數(shù)據(jù)
#define u8 unsigned char //宏定義無符號字符型數(shù)據(jù)

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;  //分鐘計數(shù)
    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();
}

作者: hjx5548    時間: 2022-11-16 07:52
非凡科技 發(fā)表于 2022-11-15 18:59
幫人幫到底 目前這個原因閑得蛋疼 給你寫好了,我也是菜雞,見笑了,我用STC給你寫的  用的定時器實現(xiàn)你的功能 ...

先謝謝了,功能沒有實現(xiàn),接通電源,指示燈一個都不亮,開關動作不起作用。
作者: 非凡科技    時間: 2022-11-16 08:33
hjx5548 發(fā)表于 2022-11-16 07:52
先謝謝了,功能沒有實現(xiàn),接通電源,指示燈一個都不亮,開關動作不起作用。

檢查硬件  這個我用開發(fā)板實驗很正常




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1