|
也可以停止定時(shí)器TR0 =0;
處理好數(shù)據(jù)之后,
才重新啟動(dòng)定時(shí)器, TR0 =1;
用定時(shí)初始值為0, TL0 =TH0 = 0;
加上16位中斷溢出(比如uchar型:sys65ms),
構(gòu)成18位二進(jìn)制定時(shí)器
這樣定時(shí)時(shí)間可以去到16秒(晶振12mhz)
#include<reg52.h>
#define uchar8 unsigned char //8
#define uint16 unsigned int //16
#define ulong32 unsigned long //32
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
ulong32 TEnd=0; //記錄時(shí)間
uchar8 sys65ms=0;//65ms累加,可以一直累加到16秒
void Timer0_Interrupt() interrupt 1//定時(shí)器0 1ms 中斷程序
{
sys65ms++; //1ms累加,可以一直累加到49.7天
}
void Comm_Interrupt() interrupt 4//串行中斷程序
{
if(TI)
{
TI = 0;
}
else if(RI)
{
unsigned char value;
value=SBUF;
RI=0;
}
}
void main()
{ //1ms@12.000MHz
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TMOD |= 0x01; //設(shè)置定時(shí)器模式
TL0 = 0; //從0開(kāi)始跑時(shí)
TH0 = 0; //從0開(kāi)始跑時(shí)
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
//4800bps@12.000MHz
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數(shù)據(jù),可變波特率
TMOD &= 0x0F; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0xF3; //設(shè)定定時(shí)初值
TH1 = 0xF3; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
EA=1;//開(kāi)啟總中斷
ES=1;//開(kāi)串口中斷
ET0=1;//開(kāi)定時(shí)器0中斷
while(1)
{ ulong32 temp;
TR0=0;
temp=sys65ms;//掃描周期記錄
temp<<=8; //掃描周期記錄
temp+=TH0; //掃描周期記錄
temp<<=8; //掃描周期記錄
temp+=TL0; //掃描周期記錄
sys65ms = 0; //重新計(jì)時(shí)
TL0 = 0; //重新計(jì)時(shí)
TH0 = 0; //重新計(jì)時(shí)
TR0=1;
if(TEnd<=temp)TEnd=temp;//掃描周期計(jì)時(shí)
if((TEnd!=256) && (TEnd!=-255))led0=0;
if(TEnd==256)led1=0;
if(TEnd==-255)led2=0;
}
}
|
|