• 51单片机计算定时器初值


    前言

    • 芯片使用AT89S51
    • 参考书目《单片机原理与应用设计 C51编程+Proteus仿真》(第二版) 张毅刚主编 电子工业出版社

    理论分析

    工作方式寄存器 TMOD

    TMOD的字节地址位89H, 不能位寻址, TMOD共八位, 高四位控制T1工作方式, 低四位控制T0工作方式

    D7D6D5D4D3D2D1D0
    GATEC/T’M1M0GATEC/T’M1M0
    GATE 门控位
    1. GATE = 0 : 定时器/计数器是否计数仅由控制位TRx(x = 0,1))来控制, TRx(x = 0,1)为高电平允许T1(T0)对脉冲计数
    2. GATE = 1 : 定时器/计数器是否计数由外中断引脚INT1’ or INT0’和TRx(x = 0,1)共同控制, 当二者全为1时允许T1(T0)对脉冲计数
    C/T’ 计数器模式和定时器模式选择位
    1. C/T’ = 0 : 定时器模式, 对系统时钟12分频后的内部脉冲进行计数
    2. C/T’ = 1 : 计数器模式, 对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)进行计数
    M1 M0 工作方式选择位
    M1 M0工作方式
    0 0方式0, 13位定时器/计数器
    0 1方式1, 16位定时器/计数器
    1 0方式2, 8位的常数自动重新装载的定时器/计数器
    1 1方式3, 仅适用于T0, 此时T0分为2个八位计数器, T1停止计数

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

    TCON的字节地址为88H, 可位寻址

    D7D6D5D4D3D2D1D0
    TF1TR1TF0TR0IE1IT1IE0IT0

    其低四位与外部中断有空

    1. TF1, TF0 计数溢出标志位: 当计数器计数溢出时, 该位置1. 使用查询方式时, 该位可供CPU查询, 但应注意查询后, 应使用软件计时将该位清0. 使用中断方式时, 该位作为中断请求标志位, 进入中断服务程序后由硬件自动清0.
    2. TR1 , TR0 计数运行控制位 : TRx = 1时, 启动定时器/计数器计数的必要条件(由于GATE位的不确定, 只知道TRx = 1不能确定定时器/计数器是否启动).TRx = 0时, 停止定时器/计数器计数该位可由软件置1或清0.

    TCON补充(中断相关)

    D7D6D5D4D3D2D1D0
    ICONTF1TR1TF0TR0IETIT1IE0IT0
    位地址8FH8DH8BH8AH89H88H
    1. IT0: 选择外部中断请求0, 1为下降沿触发方式, 0为低电平触发.
    2. IT1: 选择外部中断请求1, 触发方式选择与IT0类似.

    计算过程

    若使用定时器T0, 采用方式2定时, 输出周期为400us占空比位25%的矩形脉冲(晶振频率为12MHz)

    1. 使用定时器T0 -> 对TH0和TL0写入数据(TH0为T0的高八位, TL0为T0的第八位)
    2. 采用方式2定时 -> TMOD的M1 M0为10(方式2的运行原理在补充内容中)
    3. 输出周期为400us, 占空比为25% -> 高电平持续时间为400*25%us = 100us, 低电平持续时间为400us - 100us = 300us

    定时时间 = 计数值 * 机器周期

    • 定时时间 : 高电平持续时间和低电平持续时间的最大公约数, 此例中为100us
    • 计数值 : 记为n, 需计算求出
    • 机器周期 : 机器周期 = 1/晶振频率 = 1/12Mhz = 1us

    所以, 100us = n * 1us -> n = 100

    计数值 = 最大计数值 - 计算初值

    • 计数值 : 上式中的n, 解得为100
    • 最大计数值 : 方式2为8位计数器/定时器, 最大计数值为2^8 = 256
    • 计算初值: 记为x, 需计算解出

    所以, 100 = 256 - x, 解得x = 256 - 100

    综上, TH0 = TL0 = 256 - 100;

    补充: 方式2运行原理

    工作方式2为自动恢复初值(初值自动装入)的8为定时器/计数器, TLx(x = 0, 1)作为常数缓冲器, 当TLx计数溢出时, 在溢出标志位TFx置1的同时, 还自动将THx中的初值发送至TLx, 使TLx从初值开始重新计数.

    源码

    课后题7-5硬件仿真原理图
    课后题7-5波形图

    /* 
     * 功能实现:  使用T0, 采用方式2定时中断, 在P1.0引脚上输出周期为400us, 占空比为25%的矩形脉冲 
     * 编写环境: Neovim + Keil5
     * 硬件仿真: Proteus 8 Professional
     * 日期: 2022-11-15
     */
    
    #include 
    
    sbit Pluse = P1^0; // 定义P1.0口为Pulse
    
    unsigned char count = 0;
    
    int main(void)
    {
        TMOD = 0x01; // 定时器T0为方式1
    
        TH0 = 256 - 100; // 设置定时器初值
        TL0 = 256 - 100; 
    
        Pluse = 0; // P1.1输出低电平
        EA = 1; // 总中断开
        ET0 = 1; // T0中断开
        TR0 = 1; // 启动T0
    
        while(1) // 循环等待
        {
            ;
        }
    
        return 0;
    }
    
    void timer0() interrupt 1 // T0中断程序
    {
    
        TH0 = 256 - 100; // 重新赋值
        TL0 = 256 - 100; 
    
        count++;
    
        if (1 == count) // 100us过后, 高电平持续时间结束, 需将P1.1变为低电平
        {
            Pluse = 0;
        }
        else if (4 == count) // (4-1) * 100us过后, 低电平持续时间结束, 需将P1.1变为高电平
        {
            Pluse = 1;
    		count = 0; // 一个脉冲周期结束, 将count清零 
        }
    
        return;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
  • 相关阅读:
    【进阶C语言】数组笔试题解析
    什么是最小误差测量
    Layui之用户(CURD)
    HTTP 的三次握手
    Sentinel 微服务保护
    基于Python实现的遗传算法求TSP问题
    神经网络算法入门书籍,神经网络相关书籍
    多个div横向排列的几种方法
    雷电模拟器dnconsole命令汇总
    uniapp 连接夜神安卓模拟器真机调试
  • 原文地址:https://blog.csdn.net/JUSTfFUN/article/details/127947887