定时器T0的模式1实现长时间定时使用定时器T0的中断来控制P2.0引脚LED的闪烁,要求闪烁周期2s,即亮1s,灭1s。本例采用的电路原理图如图6-2所示。1.实现方法定时器T0工作于方式1时,其最大可计脉冲数次数为65536,对于12MHz的时钟频率,一个脉冲的宽度为1.00μs,则最大计时长度只有1.00×65536=65536μs,即大约65ms。所以要计时1s或更长的时间,还需采用一种被称作“软件计数”的方法:设置一个变量Countor来储存定时器T0的中断次数,即每产生1次中断,使变量Countor自加1,如果T0每50ms中断1次,那么当Countor自加20次时,所计时间就是1s。2.程序设计先建立文件夹“CHANG”,然后建立“CHANG”工程项目,最后建立源程序文件“CHANG.c”。输入以下源程序://实例46:用定时器T0模式1的实现长时间定时#includereg51.h//包含51单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.0引脚unsignedcharCountor;//设置全局变量,储存定时器T0中断次数/**************************************************************函数功能:主函数**************************************************************/voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式1TH0=(65536-50000)/256;//定时器T0的高8位赋初值TL0=(65536-50000)%256;//定时器T0的低8位赋初值TR0=1;//启动定时器T0Countor=0;//从0开始累计中断次数while(1)//无限循环,等待中断;}/**************************************************************函数功能:定时器T0的中断服务程序**************************************************************/voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数{Countor++;//中断次数自加1if(Countor==20)//若累计满20次,即计时满1s{D1=~D1;//按位取反操作,将P2.0引脚输出电平取反Countor=0;//将Countor清0,重新从0开始计数}TH0=(65536-50000)/256;//定时器T0的低8位重新赋初值TL0=(65536-50000)%256;//定时器T0的低8位重新赋初值}3.用Proteus软件仿真经Keil软件编译通过后,可利用Proteus软件进行仿真。在ProteusISIS编辑环境中绘制好图6-2所示仿真电路图后,或打开配套光盘中的“仿真实例\第六章\CHANG”文件夹内的“ex46.DSN”仿真原理图文件,将编译好的“CHANG.hex”文件载入AT89C51。启动仿真,即可看到P2.0引脚LED的闪烁速度明显慢于实例45(仿真效果图略)。4.用实验板试验程序仿真无误后,将“CHANG”文件夹中的“CHANG.hex”文件烧录入AT89S51芯片中。再将烧录好的单片机插入实验板,通电运行即可看到和仿真类似的试验结果。