接上篇:http://www.zg4o1577.cn/bbs/dpj-143668-1.html
使用16位計數器,減少計數中斷的機率。
程序:
//全局變量聲明
sbit lcd_sid=P3^7; //定義12864數據端口
sbit lcd_sclk=P3^6; //定義12864時鐘脈沖端口
sbit pwm=P1^3;//
unsigned char t0_1ms; //T0計數器
//子函數聲明
void init(); //初始化子函數
void lcd(); //lcd子函數
//主函數開始/////////////////////////////////////////////////////////////////////
void main()
{
init(); //初始化
while(1) //循環下面的程序
{
if(t0_1ms==5) //如果計數5次,5*0.2ms=1ms,執行下面的程序
{
t0_1ms=0; //計數器復位
lcd(); //lcd顯示
}
}
}
//主函數結束/////////////////////////////////////////////////////////////////////
//子函數程序
void t0_ms()interrupt 1 //T0中斷函數,每次中斷都需要重裝初值,實際的中斷時間還需要加上中斷處理程序的時間。
{
t0_1ms++; //每xms加一次
TL0=0x18; //自動重裝
TH0=0xfc; //自動重裝值
pwm=~pwm; //
}
void init() //初始化子函數
{
//T0初始化
AUXR&=0x7f; //B7=0,T0設置為12倍速,其它設置不變
TMOD&=0xf0; //xxxx 0000,T0設置置零
TMOD|=0x01; //xxxx 0001,T0設置為16位手動重裝
TR0=1; //T0運行
EA=1; //
ET0=1; //
}
void lcd(); //lcd子函數
IMG_20181129_114123R.jpg (2.22 MB, 下載次數: 28)
下載附件
2018-11-29 11:56 上傳
可以看到時間比計算的要多,通過增加初裝值減少時間。
void t0_ms()interrupt 1 //T0中斷函數
{
t0_1ms++; //每xms加一次
TL0=0x19; //自動重裝值,比初值加1
TH0=0xfc; //自動重裝值
pwm=~pwm; //
}
IMG_20181129_104249R.jpg (2.2 MB, 下載次數: 32)
下載附件
2018-11-29 11:59 上傳
示波器已經測不出差別,在刪除不相關的程序后,沒有發現時間有變換。
基本達到要求。下面嘗試增加LCD的程序看看。
|