找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9306|回復(fù): 0
收起左側(cè)

單片機(jī)定時(shí)器毫秒級(jí)精確定時(shí)程序與分析

[復(fù)制鏈接]
ID:423556 發(fā)表于 2018-11-29 11:34 | 顯示全部樓層 |閱讀模式
一,T0使用8位自動(dòng)重裝模式(最大256us)
定時(shí)周期計(jì)算:
定時(shí)器計(jì)數(shù)器自加1時(shí)間:1us=機(jī)器周期(1/12M=1/12us) 乘 12(AUXR&=0x7f; //B7=0,T0設(shè)置為12倍速,其它設(shè)置不變)
當(dāng)計(jì)數(shù)器(設(shè)置為8位時(shí))計(jì)數(shù)到255再加1溢出(TMOD&=0xf0; //xxxx 0000,T0設(shè)置置零    TMOD|=0x02; //xxxx 0010,T0設(shè)置為8位自動(dòng)重裝)
溢出時(shí)間=256-初裝值(TH0=0x38; //自動(dòng)初裝值)(從初裝值開(kāi)始計(jì)數(shù),到256溢出完成一次。)


1.自動(dòng)重裝方式
程序如下:
/*


P1.3為PWM輸出端

5.SID 串行數(shù)據(jù)輸入端 接單片機(jī)P3.7
6.SCLK 串行時(shí)鐘輸入端 接單片機(jī)P3.6


*/


#include<stc12c5a60s2.h>//頭文件

//全局變量聲明
sbit lcd_sid=P3^7; //定義12864數(shù)據(jù)端口
sbit lcd_sclk=P3^6; //定義12864時(shí)鐘脈沖端口
sbit pwm=P1^3;//

unsigned char t0_1ms; //T0計(jì)數(shù)器

//子函數(shù)聲明
void init(); //初始化子函數(shù)
void lcd(); //lcd子函數(shù)

//主函數(shù)開(kāi)始/////////////////////////////////////////////////////////////////////
void main()
{
        init(); //初始化
        while(1) //循環(huán)下面的程序
        {
                if(t0_1ms==5) //如果計(jì)數(shù)5次,5*0.2ms=1ms,執(zhí)行下面的程序
                {
                        t0_1ms=0; //計(jì)數(shù)器復(fù)位
                        lcd(); //lcd顯示
                }
        }
}

//主函數(shù)結(jié)束/////////////////////////////////////////////////////////////////////

//子函數(shù)程序
void t0_200us()interrupt 1 //T0中斷函數(shù)
{
        t0_1ms++; //每0.2ms加一次
        pwm=~pwm; //
}

void init() //初始化子函數(shù)
{
        //T0初始化
        AUXR&=0x7f; //B7=0,T0設(shè)置為12倍速,其它設(shè)置不變
        TMOD&=0xf0; //xxxx 0000,T0設(shè)置置零
        TMOD|=0x02; //xxxx 0010,T0設(shè)置為8位自動(dòng)重裝
        TL0=0x38; //初裝值
        TH0=0x38; //自動(dòng)初裝值
        TR0=1; //T0運(yùn)行
        EA=1; //
        ET0=1; //
}

void lcd(); //lcd子函數(shù)

IMG_20181129_104323R.jpg IMG_20181129_101720R.jpg


從示波器可以看出時(shí)間的時(shí)間比計(jì)算的時(shí)間要多。

把與定時(shí)器不相關(guān)的程序全部刪除:

#include<stc12c5a60s2.h>//頭文件

//全局變量聲明
sbit lcd_sid=P3^7; //定義12864數(shù)據(jù)端口
sbit lcd_sclk=P3^6; //定義12864時(shí)鐘脈沖端口
sbit pwm=P1^3;//

unsigned char t0_1ms; //T0計(jì)數(shù)器

//子函數(shù)聲明
void init(); //初始化子函數(shù)

//主函數(shù)開(kāi)始/////////////////////////////////////////////////////////////////////
void main()
{
        init(); //初始化
        while(1) //循環(huán)下面的程序
        {
                if(t0_1ms==5) //如果計(jì)數(shù)5次,5*0.2ms=1ms,執(zhí)行下面的程序
                {
                        t0_1ms=0; //計(jì)數(shù)器復(fù)位
                }
        }
}

//主函數(shù)結(jié)束/////////////////////////////////////////////////////////////////////

//子函數(shù)程序
void t0_200us()interrupt 1 //T0中斷函數(shù)
{
        t0_1ms++; //每0.2ms加一次
        pwm=~pwm; //
}

void init() //初始化子函數(shù)
{
        //T0初始化
        AUXR&=0x7f; //B7=0,T0設(shè)置為12倍速,其它設(shè)置不變
        TMOD&=0xf0; //xxxx 0000,T0設(shè)置置零
        TMOD|=0x02; //xxxx 0010,T0設(shè)置為8位自動(dòng)重裝
        TL0=0x38; //初裝值
        TH0=0x38; //自動(dòng)初裝值
        TR0=1; //T0運(yùn)行
        EA=1; //
        ET0=1; //
}





IMG_20181129_103814R.jpg

200us輸出變換一次。符合計(jì)算。
由此可知,中斷發(fā)生是由于需要保護(hù)原來(lái)正在運(yùn)行的程序,處理中斷前需要先保護(hù)現(xiàn)場(chǎng),這樣就增加了運(yùn)行時(shí)間,每毫秒需要5次中斷,當(dāng)需要運(yùn)行的程序越多時(shí),中斷的時(shí)間越不穩(wěn)定。

下面嘗試增加中斷時(shí)間,減少中斷處理時(shí)間,看看程序?qū)χ袛鄷r(shí)間的影響。


IMG_20181129_103814R.jpg
IMG_20181129_104249R.jpg
IMG_20181129_105844R.jpg
IMG_20181129_105946R.jpg
IMG_20181129_105950R.jpg
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表