欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2553|回復: 5
收起左側

仿照Arduino的millis構造非阻塞時間輪片的C51單片機程序

  [復制鏈接]
ID:137736 發表于 2022-10-31 16:17 | 顯示全部樓層 |閱讀模式
Arduino的millis函數使用起來很方便。用普中開發板寫的程序,仿照Arduino,實現非阻塞、時間輪片多任務。
/*模仿Arduino的millis構造非阻塞時間輪片程序*/
#include <STC90C5xAD.H>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
u32 millis = 0;                                 //ms定時計數,長57天
const u16 timeLong1 = 1000;
const u16 timeLong2 = 2000;
u32 previousMillis1 = 0;
u32 previousMillis2 = 0;
u32 previousMillis3 = 0;
void InitTimer0(void);
void main (void)
{
        InitTimer0();
        while(1)
        {
                if (millis - previousMillis1 >= timeLong1)         //現在時間-以前時間
                {
                        previousMillis1 = millis;                                  //現在時間賦值以前時間變量
                        LED1 =~LED1;
                }

                if (millis - previousMillis2 >= timeLong2)
                {
                        previousMillis2 = millis;
                        LED2 =~LED2;
                }
           if (millis - previousMillis3 >= timeLong1)
                {
                        previousMillis3 = millis;
                        LED3 =~LED3;
                }


        }


}

void InitTimer0(void)         //22.1M晶振定時器0的1ms初始化
{
        TMOD = 0x01;
    TH0 = 0x0F8;
    TL0 = 0x0CD;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}


void Timer0Int(void) interrupt 1         //定時器中斷,millis計數加1
{
        TH0 = 0x0F8;
    TL0 = 0x0CD;
        millis++;
        if(millis>0xfffffffa)
        {
         millis = 0;
         previousMillis1 = 0;
         previousMillis2 = 0;
        }

}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:857072 發表于 2022-10-31 21:10 來自觸屏版 | 顯示全部樓層
留個記號
回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:77589 發表于 2022-11-8 10:47 | 顯示全部樓層
思路,可以有
回復

使用道具 舉報

ID:454811 發表于 2022-11-12 14:01 | 顯示全部樓層
millis>0xfffffffa的時候是不是會有誤差,如果此時的差值不到timeLong1/timeLong2不就要重新計時了嗎
回復

使用道具 舉報

ID:137736 發表于 2022-11-30 10:16 | 顯示全部樓層
dongyt 發表于 2022-11-12 14:01
millis>0xfffffffa的時候是不是會有誤差,如果此時的差值不到timeLong1/timeLong2不就要重新計時了嗎

有誤差,這用于不要精確延時的地方,是用來調度函數運行的。
回復

使用道具 舉報

ID:161164 發表于 2022-11-30 11:25 | 顯示全部樓層
用在8位1T單片機時會有問題
因為8位單片機算Long/int時是分很多步來算
有機會算到一半時進中斷
引致計算錯誤
我的貼子有討論過這問題
http://www.raoushi.com/bbs/dpj-213547-1.html

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表