参考链接: https://zhidao.baidu.com/question/434042328102999604.html
和 https://wenku.baidu.com/view/fe63fc0a6d175f0e7cd184254b35eefdc9d31558.html
1.使用定时器实现LED每隔一秒闪烁需要具备的知识
了解中断允许寄存器IE和定时器/计数器工作模式寄存器TMOD并且知道如何对定时器及中断寄存器做初始化设置,了解机器周期并知道如何计算定时器的初值。
1)中断允许寄存器IE
中断允许寄存器ie结构——
中断允许控制寄存器分为两层结构,第一级结构为中断允许总控制EA,只 有当EA处于中断允许状态,中断源中断请求才能够得到允许;当EA处于不允许状态时,无论IE寄存器中其他位处于什么状态,中断源中断请求都不会得到允许。
第二级结构为5个中断允许控制位,分别对应5个中断源的中断请求,当对应中断允许控制位为1时,中断源中断请求得到允许。
使用方法——
整体赋值:IE=0x81;(开启全局中断,打开外部中断0)。
单独赋值:EA=1;EX0=1;(开启全局中断,打开外部中断0)。
2)定时器/计数器工作模式寄存器TMOD
3)机器周期
单片机的机器周期=12秒/晶振频率,一个机器周期包含六个状态周期(用S表示)。一个状态周期有两个节拍(用P1、P2表示)。8051系列单片机的一个机器周期同6 个S周期(状态周期)组成。
也就是说一个机器周期=6个状态周期=12个振荡周期(即时钟周期(时钟周期=振荡周期,等于单片机晶振频率的倒数,如常见的外接12M晶振,那它的时钟周期=1/12M。))。
4)计算定时器的初值
(1)可以按定时时间的计算公式, 计算出定时器的时间常数X:
定时时间T=(2的N次方-X)12/单片机晶振频率
(2)N为定时器的工作方式:
方式0时,N=13
方式1时,N=16
方式2时,N=8
(3)根据定时时间和工作方式,计算出时间常数X
把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定时了。
例如: 工作在方式1,定时时间为1000微秒 晶振频率=12MHZ
则 定时时间T=(2的16次方-X)12/12MHZ=1000 解出 X=64536=FC18H
2.以下是使用定时器实现LED每隔一秒闪烁的代码
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
uchar num;
void main()
{
TMOD=0x01; //设置定时器0位工作模式1(M1, M0位0,1)
TH0=(65536-45872)/256; //初值高位,先计算初值,使用11.0592M晶振,定时50ms数为45872
TL0=(65536-45872)%256;//初值低位
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1)
{
if(num==20) //如果到了20次,说明到了1秒时间
{
LED1=~LED1; //让发光管状态取反,亮时转灭,灭时转亮
num=0;
}
}
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256; //中断之后重新装载初值
TL0=(65536-45872)%256;
num++;
}
proteus仿真如下:
实现视频观看
使用定时器实现LED每隔一秒闪烁
之前看到TH0=(65536-45872)/256; 和TL0=(65536-45872)%256;时也有点懵逼,在这里我就简单地提一下吧。
这里的“/”代表除法,运算结果是被除数除以除数得到的商的整数。
"%"表示“求于运算”,运算结果是被除数除以除数后的余数。
256刚好是2的八次方。
/256表示被除数除以256后取整,得到的是被除数写成16位二进制数的高八位。
%256表示被除数除以256后取余数,得到的是被除数写成16位二进制数的低八位。
TH0=(65536-45872)/256;将先求括号内的差,然后取这个差的高八位(通过除以2的八次方得到,除以一次2相当于右移一位)
TL0=(65536-45872)%256;将先求括号内的差,然后取这个差的低八位,即低字节放入TL0
以上就是使用定时器实现LED每隔一秒闪烁所涉及的知识要点和代码啦,希望你可以有所收获哦!