用定时器T0的模式1实现长时间定时

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定时器T0的模式1实现长时间定时

使用定时器T0的中断来控制引脚LED的闪烁,要求闪烁周期2s,即亮1s,灭1s。本例采用的电路原理图如图6-2所示。

1.实现方法

定时器T0工作于方式1时,其最大可计脉冲数次数为65536,对于12MHz的时钟频率,一个脉冲的宽度为μs,则最大计时长度只有×65536=65536μs,即大约65ms。所以要计时1s或更长的时间,还需采用一种被称作“软件计数”的方法:设置一个变量Countor来储存定时器T0的中断次数,即每产生1次中断,使变量Countor自加1,如果T0每50ms中断1次,那么当Countor自加20次时,所计时间就是1s。

2.程序设计

先建立文件夹“CHANG”,然后建立“CHANG”工程项目,最后建立源程序文件“”。输入以下源程序:

//实例46:用定时器T0模式1的实现长时间定时

#include<> // 包含51单片机寄存器定义的头文件

sbit D1=P2^0; //将D1位定义为引脚

unsigned char Countor ; //设置全局变量,储存定时器T0中断次数

/**************************************************************

函数功能:主函数

**************************************************************/

void main(void)

{

EA=1; //开总中断

ET0=1; //定时器T0中断允许

TMOD=0x01; //使用定时器T0的模式1

TH0=(65536-50000)/256; //定时器T0的高8位赋初值

TL0=(65536-50000)%256; //定时器T0的低8位赋初值

TR0=1; //启动定时器T0

Countor=0; //从0开始累计中断次数

while(1) //无限循环,等待中断

;

}

/**************************************************************

函数功能:定时器T0的中断服务程序

**************************************************************/

void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数

{

Countor++; //中断次数自加1

if(Countor= =20) //若累计满20次,即计时满1s

{

D1=~D1; //按位取反操作,将引脚输出电平取反

Countor=0; //将Countor清0,重新从0开始计数

}

TH0=(65536-50000)/256; //定时器T0的低8位重新赋初值

TL0=(65536-50000)%256; //定时器T0的低8位重新赋初值

}

3.用Proteus软件仿真

经Keil软件编译通过后,可利用Proteus软件进行仿真。在Proteus ISIS 编辑环境中绘制好图6-2所示仿真电路图后,或打开配套光盘中的“仿真实例\第六章\ CHANG”文件夹内

的“”仿真原理图文件,将编译好的“”文件载入AT89C51。启动仿真,即可看到引脚LED 的闪烁速度明显慢于实例45(仿真效果图略)。

4.用实验板试验

程序仿真无误后,将“CHANG”文件夹中的“”文件烧录入AT89S51芯片中。再将烧录好的单片机插入实验板,通电运行即可看到和仿真类似的试验结果。

相关文档
最新文档