zoukankan      html  css  js  c++  java
  • 单片机基础(六):单片机定时/控制器的控制接口

    单片机定时/控制器的控制接口

    定时/计数器编程的 5 个步骤
    1.根据需求选择工作方式,确定方式控制字,写入TMOD寄存器
    2.计算定时/计数器的计数值,求计数初值,写入初值寄存器
    3.根据需要,开放定时/计数器的中断选项
    4.设置定时/计数器控制寄存器TCON,启动定时器
    5.等待定时时间到,用查询或中断方式作相应处理


    定时/计数器的应用举例
      利用定时器产生周期性动作的基本思想:

    • 产生周期性的定时
    • 定时时间到做相应处理

     如 设系统时钟频率为12MHz,要求用定时/计数器T0实现从P1.0输出周期为500μs的方形波(即周期性高低电平切换)

    分析:
      从P1.0输出周期为500μs的方波,只需P1.0每250μs取反一次即可
      当系统时钟为12MHz,振荡频率为(1/12M)s,即(1/12)μs,一个机器周期为12个振荡周期,所以一个机器周期为1μs,即计数一次为1μs,则计数值为250,选择计数方式2,计数初值为方式2的 256 - 250 = 6
      工作方式2,方式控制字0x02,计数初值6,TH0 = TL0 = 0x06


    代码实现
    查询法:时刻查询TF的状态并在溢出时做处理

    /*
    *12MHz的晶振  使P1.0端口输出周期为500μs的方波
    */
    #include<reg52.h>
    sbit P1_0 = P1^0;
    void main(){
    	TMOD = 0x02;
    	TH0 = TL0 = 0x06;
    	TR0 = 1;
    	for(;;){
    		if(TF0){//查询溢出状态
    			TF0 = 0;		//归位
    			P1_0 = ~P1_0;	//处理
    		}
    	}
    }
    

    中断法:溢出状态触发中断,并使用中断服务处理溢出

    #include<reg52.h>
    sbit P1_0 = P1^0;
    void main(){
    	TMOD = 0x02;
    	TH0 = TL0 = 0x06;
    	EA = 1;//
    	ET0 = 1;//中断控制,详见该系列博客中断篇
    	TR0 = 1;
    	while(1);//使程序一直执行
    }
    
    //中断服务程序
    void time0_int(void) interrupt 1 {
    	P1_0 = !P1_0;
    }
    

    长时间定时

      一般晶振频率都以MHz为单位,机器周期就以μs为单位,这样短的周期有时无法满足需求,但我们可以用编程手段实现更长时间的计时,比如设置计数变量,每计时100μs就让计数变量加一,计数变量达到10000时就实现了1s单位的计时,这样就可以灵活适应需要


    2019/3/3

  • 相关阅读:
    将Moba的输出导出为文件
    MyBatis入参为0时失效问题
    (笔记)交大电院MEM提前面试优秀经验分享【附面试流程及规则】
    (笔记)GPIO基本原理与寄存器配置(STM32篇)
    (笔记)高速电路板完美走线的诀窍
    使用 python 收集 kubernetes events 并写入 elasticsearch
    java使用io.kubernetes.client-java调用k8s api创建pod/service/ingress示例
    中英文逗号空格分隔符正则式
    SpringCloud学习一-搭建netflix-eureka微服务集群
    Spring 中经典的 9 种设计模式,打死也要记住啊!
  • 原文地址:https://www.cnblogs.com/kafm/p/12721823.html
Copyright © 2011-2022 走看看