【51单片机STC89C52】定时器(中断)控制LED

发布者:bemaii最新更新时间:2022-10-25 来源: csdn关键字:51单片机  STC89C52  定时器  中断  控制LED 手机看文章 扫描二维码
随时随地手机看文章

一、定时器/计数器T0

1、定时器/计数器的相关寄存器

2、定时器/计数器控制寄存器TCON

TCON格式如下:

3、定时器/计数器工作模式寄存器TMOD

模式选择:


 

二、配置相关寄存器

1、使用STC-ISP工具

2、配置寄存器

设置定时器模式(16位定时器)

配寄存器推荐使用按位操作:


需要清零的位与等于0,不清零的位与等于1 


需要置1的位或等于1,不需要置一的位或等于0


TMOD &= 0xF0; //清零低四位、高四位不变

TMOD |= 0x01; //低四位的bit0置1

设置定时器初值

TL0=0x00;            //低八位、需要计算

TH0=0xDC;            //高八位、需要计算

89C52的晶振频率是 11.0592MHz

机器周期 = 12 x 时钟周期 =12 x ( 1 /  时钟频率  ) s   = 1.085us

在 TH0 和 TL0 寄存器中计数 , 最多能计数2^16= 65536 ,累计计时大约 71ms

如何算出 10ms 定时器的初值?

        10ms需要数 9216 下,就配置寄存器从 65536-9126=56320 ( 16 进制表示为 0xDC00)开始计数。这样TL0=0x00 ; TH0=0xDC

清除TF0标志

    TF0 = 0;

不使用中断时,必须软件清零


定时器0开始计时

    TRO = 1;

三、定时器控制LED

#include "reg52.h"

 

sbit led = P3^6;

 

void delay10ms()

{

//1. 配置定时器0工作模式为16位计数

TMOD = 0x01;

//2. 定10ms的初值

TL0=0x00;

TH0=0xDC;

//3. 开始计时

TR0 = 1;

TF0 = 0;

}

 

 

void main()

{

int cnt = 0;

led = 1;

delay10ms();

while(1){

if(TF0 == 1)//当最高位产生溢出时,由硬件置1 

{

TF0 = 0;//不使用中断时,必须软件清零

cnt++;  //统计溢出的次数

//重新给初值

TL0=0x00;

TH0=0xDC;

if(cnt == 100){//当溢出100次,经过了1s

cnt = 0;  //cnt重新计数

led = !led;//每经过1s,翻转led的状态

}

}

}

}


四、定时器中断方式控制

1、中断寄存器

EA  :总中断允许控制位。EA=1,CPU开放中断


ET0:T0的溢出中断允许位。ET0=1,允许T0中断


硬件内部设计逻辑如下图:

 

2、定时器中断控制LED

定时器中断控制LED1每秒亮灭一次,主函数里LED2每300ms亮灭一次


#include "reg52.h"

 

sbit led1 = P3^6;

sbit led2 = P3^7;

int cnt = 0;

 

void Time0Init()

{

//1. 配置定时器0工作模式为16位

TMOD = 0x01;

//2. 定10ms的初值

TL0 = 0x00;

TH0 = 0xDC;

//3. 开始计时

TR0 = 1;

TF0 = 0;

//4. 打开定时器0中断

ET0 = 1;

//5. 打开总中断EA

EA = 1;

}

 

void Delay300ms() //@11.0592MHz

{

unsigned char i, j, k;

 

i = 3;

j = 26;

k = 223;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

 

void main()

{

led1 = 1;

Time0Init();

while(1){

led2 = 0;

Delay300ms();

led2 = 1;

Delay300ms();

}

}

 

void Time0Handler() interrupt 1

{

cnt++;  //统计溢出的次数

//重新给初值

TL0=0x00;

TH0=0xDC;

if(cnt == 100){ //当溢出100次,经过了1s

cnt = 0; 

led1 = !led1; //每经过1s,翻转led的状态

}

}

关键字:51单片机  STC89C52  定时器  中断  控制LED 引用地址:【51单片机STC89C52】定时器(中断)控制LED

上一篇:【51单片机STC89C52】HC-SR04超声波模块测距
下一篇:【汇编】AT89C52点亮一盏LED灯(汇编语言)

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved