定时器0为16位!它的最大计数范围为2的16次方,也就是65536,可以把定时器比作一个水桶,如果这个桶是空的,那么它装满水需要65536滴水!也就是说它最多能定时65.536毫秒 ,当然前提是在12Mhz晶振下!假如说你只要定时10ms,那么你的桶里面必须要先装(65536-10000)滴水,这就是所谓的赋初值!假设我们从水池上面接上水管!往你桶里滴水,水管上有三个水龙头,有个总龙头!所有水管要出水,这个总龙头必须要打开,就是EA=1;然后你只是想让定时器0这个方向的水管出水,那就要把这个龙头打开,也就是ET0=1;然而你总得要出水出来吧,并且要知道它还能装多少水吧!所以你还得把最后要出水的这个龙头打开,TR0=1;然后你的水就一滴一滴的往你桶里去,当滴了10000滴后,它是不是就满了,你再滴是不是溢出了,溢出是不是就引起中断了,然后你是不是要把滴进来的水又倒掉!好让下一次的再滴!这是不是就是定时器中断里面的重新赋初值啊!很好理解的
#include
#define uchar unsigned char
sbit P2_0=P2^0;
sbit key1=P3^4;
sbit key2=P3^5;
uchar abc,i;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD=0X01; ;定时器设置工作方式为1
TH0=(65536-10)/256; ;高八位设置初值
TL0=(65536-10)%256; ;低八位设置初值
EA=1; ;开总中断
ET0=1; ;开T0定时器
TR0=1; ;启动定时器
}
void keys01()
{
略
}
void main() //主函数
{
abc=2;
init();
while(1)
{
keys01();
}
}
void time0(void) interrupt 1 //中断程序
{
TH0=(65536-10)/256; //重装初值
TL0=(65536-10)%256; //重装初值
++i;
if(i>10)
{
i=0;
};
if(i<=zkb)
{
P2_0=1;
}
else P2_0=0;
}
我只能帮你回答这些了,有些我明白只是不知怎么表述!
多查查资料吧!祝你好运!
65536是定时器溢出值,用它减去10就是定时器装入的初值,即65526,也就是说定时器每计数10下就进入了定时中断,执行中断服务函数。若是12MHz晶振,那么进入定时中断周期为10us,即频率为100KHz。其输出波形频率和 i 有关,i 最大值为10,所以输出脉冲波频率为10KHz。
zkb显然是“占空比”的汉语拼音缩写,那么这个函数的功能是输出一个占空比为zkb/10*100%大小的脉冲波形,其频率为10KHz。占空比可通过按键进行调节。
范围是0-65535就是65536了,你说的是取整数给高位TH0,取余数给低字节TL0,
就是65536-10个计数,分别将高八位和低8位赋予THO TLO