碰到需要长时间需要关闭所有中断以保证通信协议不被打断的项目,这么保证参考时间尽可能减少误差呢?不要小看这一问题,您要是有更好的想法或思路记得在后台给我留言哦
#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个
上一篇单片机实用框架(一)下一篇框架|软件定时时间片
全部0条评论
快来发表一下你的评论吧 !