|
一,T0使用8位自動重裝模式(最大256us)
定時周期計算:
定時器計數(shù)器自加1時間:1us=機器周期(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ù)輸入端 接單片機P3.7
6.SCLK 串行時鐘輸入端 接單片機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運行
EA=1; //
ET0=1; //
}
void lcd(); //lcd子函數(shù)
IMG_20181129_104323R.jpg (1.85 MB, 下載次數(shù): 38)
下載附件
2018-11-29 11:19 上傳
IMG_20181129_101720R.jpg (1.59 MB, 下載次數(shù): 44)
下載附件
2018-11-29 11:19 上傳
從示波器可以看出時間的時間比計算的時間要多。
把與定時器不相關(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運行
EA=1; //
ET0=1; //
}
IMG_20181129_103814R.jpg (1.98 MB, 下載次數(shù): 34)
下載附件
2018-11-29 11:24 上傳
200us輸出變換一次。符合計算。
由此可知,中斷發(fā)生是由于需要保護原來正在運行的程序,處理中斷前需要先保護現(xiàn)場,這樣就增加了運行時間,每毫秒需要5次中斷,當(dāng)需要運行的程序越多時,中斷的時間越不穩(wěn)定。
下面嘗試增加中斷時間,減少中斷處理時間,看看程序?qū)χ袛鄷r間的影響。
|
|