用定时器T0的模式1实现长时间定时
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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芯片中。再将烧录好的单片机插入实验板,通电运行即可看到和仿真类似的试验结果。