欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)定時器毫秒級精確定時程序與分析 [打印本頁]

作者: ok4005-max    時間: 2018-11-29 11:34
標(biāo)題: 單片機(jī)定時器毫秒級精確定時程序與分析
一,T0使用8位自動重裝模式(最大256us)
定時周期計算:
定時器計數(shù)器自加1時間:1us=機(jī)器周期(1/12M=1/12us) 乘 12(AUXR&=0x7f; //B7=0,T0設(shè)置為12倍速,其它設(shè)置不變)
當(dāng)計數(shù)器(設(shè)置為8位時)計數(shù)到255再加1溢出(TMOD&=0xf0; //xxxx 0000,T0設(shè)置置零    TMOD|=0x02; //xxxx 0010,T0設(shè)置為8位自動重裝)
溢出時間=256-初裝值(TH0=0x38; //自動初裝值)(從初裝值開始計數(shù),到256溢出完成一次。)


1.自動重裝方式
程序如下:
/*


P1.3為PWM輸出端

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


*/


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

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

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

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

//主函數(shù)開始/////////////////////////////////////////////////////////////////////
void main()
{
        init(); //初始化
        while(1) //循環(huán)下面的程序
        {
                if(t0_1ms==5) //如果計數(shù)5次,5*0.2ms=1ms,執(zhí)行下面的程序
                {
                        t0_1ms=0; //計數(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位自動重裝
        TL0=0x38; //初裝值
        TH0=0x38; //自動初裝值
        TR0=1; //T0運(yùn)行
        EA=1; //
        ET0=1; //
}

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




從示波器可以看出時間的時間比計算的時間要多。

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

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

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

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

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

//主函數(shù)開始/////////////////////////////////////////////////////////////////////
void main()
{
        init(); //初始化
        while(1) //循環(huán)下面的程序
        {
                if(t0_1ms==5) //如果計數(shù)5次,5*0.2ms=1ms,執(zhí)行下面的程序
                {
                        t0_1ms=0; //計數(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位自動重裝
        TL0=0x38; //初裝值
        TH0=0x38; //自動初裝值
        TR0=1; //T0運(yùn)行
        EA=1; //
        ET0=1; //
}







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

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


IMG_20181129_103814R.jpg (1.96 MB, 下載次數(shù): 35)

IMG_20181129_103814R.jpg

IMG_20181129_104249R.jpg (2.2 MB, 下載次數(shù): 40)

IMG_20181129_104249R.jpg

IMG_20181129_105844R.jpg (2.28 MB, 下載次數(shù): 40)

IMG_20181129_105844R.jpg

IMG_20181129_105946R.jpg (1.66 MB, 下載次數(shù): 44)

IMG_20181129_105946R.jpg

IMG_20181129_105950R.jpg (1.88 MB, 下載次數(shù): 39)

IMG_20181129_105950R.jpg





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1