• 定时器中断


    stc89c52rc的单片机自带了三个定时器,T0,T1,T2。

    在sfr特殊功能寄存器中,给每个定时器都分配了两个8bit的空间用于计数。也就是最多计数2的10次方。

    当这两个八位的计数空间计数满(也就是变为11111111 11111111)后就会触发定时器中断,执行相应中断触发后设置执行的代码。

    在sfr中还有个TCON的区域,用来控制定时器中断。如定时器是否中断的标志位,启动定时器的标志位。

    sfr中还有一个TMOD区域,用来配置定时器的模式,比如两个8位都用来计数,计数完成后手动将其置为初始值。或者只用其中一个8位来计数,另一个8位用来记录初始值,在计数完成后自动置为初始值。还有其他模式一共有4中模式,这些模式的配置就在这块区域。还有配置用来计数还是定时:定时的时候输入的频率来源就是晶振,计数的话频率来源可以由外部输入信号或者自己设置。

    标准的51单片机是12T的,stc89c52就是12T的,也就是12个晶振的周期就是一个机器周期(即cpu进行一次最小操作所用的时间),这里的定时器如果用于定时的话就是一个机器周期进一位,如果我们使用的是12MHz的晶振,那么一个机器周期就刚好是1微秒,也就是定时器滴答一下就是1微秒,而最多两个8位用于计数,也就是最大定时65532微秒。如果围殴么需要的计数周期小于65532微秒就可以通过给两个8位计数器赋初始值的方式减少计数次数。如果大于65532微秒就需要采用其他的方式了。

    #include <reg52.h>
    #include <intrins.h>

    sbit Buzzer = P3^6;//定义蜂鸣器

    void timer0() interrupt 1//编号为1的中断器就是定时器0

    {

    TH0 = 255;//在中断触发的时候首先给定时器的低八位和高八位赋为初值

    TH0 = 206;

    Buzzer = ~Buzzer;

    }

    void main()

    {

    TMOD=0x01;//设置定时器的模式为16位

    TH0 = 255;//为定时器的低八位和高八位赋为初值

    TL0 = 206;

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

    EA=1;//允许中断器的触发

    TR0=1;//开始计数

    while(1);

    }

    注意:TH0和TL0的计算。这里我们希望定时器的触发时50微秒,也就是计数50次,就需要给低八位和高八位赋初始值。计算公式为:TH0 = (65536-50)/256=255   TL0=(65536-50)%256

  • 相关阅读:
    第二卷 Spring羊群理论
    logstash7.9.1-官方教程1-快速开始
    springboot-starter定制-Drools模块封装
    集群多节点动态刷新方案-Nacos配置修改监听
    Drools-决策表使用2-集成springboot
    Drools-决策表使用1-快速开始
    springboot-springmvc文件上传、下载、压缩打包
    Java8实用指北1-lambda表达式与函数式接口
    bug:IntrospectionException-Method not found异常与lombok
    res:bean属性复制避免null值覆盖版本
  • 原文地址:https://www.cnblogs.com/maycpou/p/13591851.html
Copyright © 2020-2023  润新知