单片机实用框架-2

描述

碰到需要长时间需要关闭所有中断以保证通信协议不被打断的项目,这么保证参考时间尽可能减少误差呢?不要小看这一问题,您要是有更好的想法或思路记得在后台给我留言哦

#include 


uinsigned char time_num = 0;       //时间缓存
uinsigned char time_100us = 0;     //时间标准


void initT0()
{
    TMOD |= 0x01;   //使用方式1,16位定时器
    TH0 = 0x0FF;    //给TH1和TL1初初值
    TL0 = 0xCE;     //延时时间为50us
    EA = 1;         //总中断打开
    ET0 = 1;        //定时器中断打开
    TR0 = 1;        //定时器开关打开
}


void Do(void)
{
    ......
}


void Protocol(void)
{
    static unsigned int ii;
    for( ii = 0; ii < 1000; ii++)  //约50MS
    {
        Do();        //假设执行一次50us
        time_num++;
        if( time_num>= 2)
        {
            time_num = 0; 
            time_100us++;
        }
        if( time_100us )
        {
            time_100us = 0;
            //==========参考时间任务========
            ......
            //-----------------------------
        }
    }
}


void Delay_50us(void)
{
    ......
}


void main(void)
{
    //初始化定时器
    initT0();
    initT1();
    while(1)
    {
        EA = 0;
        Protocol();
        EA = 1;
        Delay_50us();  //协议需要
        //======任务==========
        ......
        //--------------------
    }
 }
//===============================
//t0定时器中断服务程序
//每隔50us进入一次该程序
//===============================
void t0Intr() interrupt 1
{
    TH0 = 0x0FF;    //给TH1和TL1初初值
    TL0 = 0xCE;     //延时时间为50us

     time_num++;
}
//--------------------------------

有同学就会问这么麻烦,误差还挺大的,为啥不用DMA呢,而我想说这只是提供一种思路,毕竟不是什么单片机都有DMA可以使用,有时候做项目的时候都会受单片机硬件的限制(主要的目的就是把控成本),很多时候都会想办法从软件层面上提出解决方案(软件改动方便,付出的成本低)。

收录于合集 **#**Frame

7

上一篇单片机实用框架(一)下一篇框架|软件定时时间片

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分