碰到需要長時(shí)間需要關(guān)閉所有中斷以保證通信協(xié)議不被打斷的項(xiàng)目,這么保證參考時(shí)間盡可能減少誤差呢?不要小看這一問題,您要是有更好的想法或思路記得在后臺(tái)給我留言哦
#include
uinsigned char time_num = 0; //時(shí)間緩存
uinsigned char time_100us = 0; //時(shí)間標(biāo)準(zhǔn)
void initT0()
{
TMOD |= 0x01; //使用方式1,16位定時(shí)器
TH0 = 0x0FF; //給TH1和TL1初初值
TL0 = 0xCE; //延時(shí)時(shí)間為50us
EA = 1; //總中斷打開
ET0 = 1; //定時(shí)器中斷打開
TR0 = 1; //定時(shí)器開關(guān)打開
}
void Do(void)
{
......
}
void Protocol(void)
{
static unsigned int ii;
for( ii = 0; ii < 1000; ii++) //約50MS
{
Do(); //假設(shè)執(zhí)行一次50us
time_num++;
if( time_num>= 2)
{
time_num = 0;
time_100us++;
}
if( time_100us )
{
time_100us = 0;
//==========參考時(shí)間任務(wù)========
......
//-----------------------------
}
}
}
void Delay_50us(void)
{
......
}
void main(void)
{
//初始化定時(shí)器
initT0();
initT1();
while(1)
{
EA = 0;
Protocol();
EA = 1;
Delay_50us(); //協(xié)議需要
//======任務(wù)==========
......
//--------------------
}
}
//===============================
//t0定時(shí)器中斷服務(wù)程序
//每隔50us進(jìn)入一次該程序
//===============================
void t0Intr() interrupt 1
{
TH0 = 0x0FF; //給TH1和TL1初初值
TL0 = 0xCE; //延時(shí)時(shí)間為50us
time_num++;
}
//--------------------------------
有同學(xué)就會(huì)問這么麻煩,誤差還挺大的,為啥不用DMA呢,而我想說這只是提供一種思路,畢竟不是什么單片機(jī)都有DMA可以使用,有時(shí)候做項(xiàng)目的時(shí)候都會(huì)受單片機(jī)硬件的限制(主要的目的就是把控成本),很多時(shí)候都會(huì)想辦法從軟件層面上提出解決方案(軟件改動(dòng)方便,付出的成本低)。
收錄于合集 **#**Frame
7個(gè)
上一篇單片機(jī)實(shí)用框架(一)下一篇框架|軟件定時(shí)時(shí)間片
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44989瀏覽量
650336 -
軟件
+關(guān)注
關(guān)注
69文章
5152瀏覽量
89209 -
dma
+關(guān)注
關(guān)注
3文章
576瀏覽量
103205
發(fā)布評(píng)論請(qǐng)先 登錄
AVR單片機(jī)C語言程序框架(單片機(jī)最簡操作系統(tǒng))及詳解
CAFrame單片機(jī)程序框架分享
PIC單片機(jī)程序結(jié)構(gòu)框架
原創(chuàng)分享:自制輕量級(jí)單片機(jī)UI框架

單片機(jī)裸機(jī)程序框架

單片機(jī)學(xué)習(xí)筆記————51單片機(jī)實(shí)現(xiàn)判斷數(shù)據(jù)尾來接收一串?dāng)?shù)據(jù)的串口通用程序框架

單片機(jī)學(xué)習(xí)筆記————51單片機(jī)實(shí)現(xiàn)在串口接收中斷里即時(shí)解析數(shù)據(jù)頭的特殊程序框架

單片機(jī)學(xué)習(xí)筆記————51單片機(jī)(利用return)實(shí)現(xiàn)判斷數(shù)據(jù)頭來接收一串?dāng)?shù)據(jù)的串口通用程序框架

評(píng)論