找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1383|回复: 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.51hei.com/bbs/dpj-213547-1.html

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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