• 51单片机定时器基础知识


    定时器初值计算

    经验总结:定时器0工作方式1的溢出中断初始值计算

    1.晶振11.0592M
    11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。
    65536-46080=19456(4c00)
    TH0=0x4c,TL0=0x00

    2.晶振12M
    12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。
    65536-50000=15536(3cb0)
    TH0=0x3c,TL0=0xb0

    3.晶振22M
    22MHz除12为1,833,333Hz,也就是说一秒=1833 333次机器周期。50ms=91666次 机器周期(超出了65536,不可以定50ms)。取20ms=36666次机器周期
    65536-36 666 = 28870(70c6)

    定时器查询方式

    /*******************************************************************
    功能:使用定时器中断方式控制一个发光二极管亮1秒,再灭1秒,如此重复。
    晶振:11.0592M
    led灯接在单片机P1.0引脚
    ********************************************************************/
    #include //头文件,开头都这样写
    #define uchar unsigned char//宏定义 无符号字符型
    uchar num=0;
    sbit led=P1^0;
    void main() //主函数
    {
    TMOD=0x01; //设置TMOD为0000 0001,定时器0工作方式1
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256; //设定11.0592M晶振定时50ms的初值为45872
    TR0=1; //启动定时器0
    while(1) //假如12M晶振定时50ms的初值为50000
    {
    if(TF0) //定时满溢出时TF0=1
    {
    num++; //每隔50ms,num++等于num=num+1
    TF0=0; //清除溢出标志位
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256; //重新装初值
    if(num==20) //如果num=20,说明已定时1s
    {
    num=0; //令num清零重新计算20次
    led=~led; //令发光二极管状态取反,每隔1s亮一次
    }
    }
    }
    }

    /*******************************************************************
    功能:使用定时器中断方式控制一个发光二极管亮1秒,再灭1秒,如此重复。
    晶振:11.0592M
    led灯接在单片机P1.0引脚
    ********************************************************************/
    #include
    #define uchar unsigned char
    uchar num=0;
    sbit led=P1^0;
    void main()
    {
    TR0=1;
    TMOD=0x01;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    while(1)
    {
    if(TF0)
    {
    num++;
    TF0=0;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    if(num==20)
    {
    num=0;
    led=~led;
    }
    }
    }
    }

    定时器中断方式

    功能:使用定时器中断方式控制一个发光二极管亮1秒,再灭1秒,如此重复。
    晶振:11.0592M
    led灯接在单片机P1.0引脚
    ********************************************************************/
    #include //头文件,开头都这样写
    #define uchar unsigned char//宏定义 无符号字符型
    uchar num=0;
    void init(); //声明需要调用的子函数
    sbit led=P1^0;
    void main() //主函数
    {
    init();
    while(1) //程序在这里等待中断
    {
    if(num==20) //定时器完成20次50ms定时进入if语句
    {
    num=0; //清零
    led=~led; //led取反
    }
    }
    }
    void init()
    {
    TR0=1; //启动定时器0
    TMOD=0x01; //设置TMOD为0000 0001,定时器0工作方式1
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256; //设定11.0592M晶振定时50ms的初值为45872
    EA=1; //开总中断
    ET0=1; //开定时器0中断
    }
    void T0_time() interrupt 1 //中断定时函数格式:void 函数名()interrupt 中断号
    {
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256; //重新设定11.0592M晶振定时50ms的初值为45872
    num++;
    }

    /*******************************************************************
    功能:使用定时器中断方式控制一个发光二极管亮1秒,再灭1秒,如此重复。
    晶振:11.0592M
    led灯接在单片机P1.0引脚
    ********************************************************************/
    #include
    #define uchar unsigned char
    uchar num=0;
    void init();
    sbit led=P1^0;
    void main()
    {
    init();
    while(1)
    {
    if(num==20)
    {
    num=0;
    led=~led;
    }
    }
    }
    void init()
    {
    TR0=1;
    TMOD=0x01;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    EA=1;
    ET0=1;
    IT0=1;
    }
    void T0_time() interrupt 1
    {
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    num++;
    }

  • 相关阅读:
    【第五篇】- Git 创建仓库之Spring Cloud直播商城 b2b2c电子商务技术总结
    深入浅出详解Knative云函数框架!
    金仓数据库KingbaseES客户端应用参考手册--20. wrap
    Redis-哨兵模式(sentinel)
    牛客模拟面 面经1/2
    Java读取寄存器数据的方法
    vue2中组件间通讯
    Kubernetes---Kubernetes集群部署Mysql集群
    ESP8266 系统环境搭建
    ConvTranspose2d函数笔记
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/128072796