• C51 定时器/计数器 个人笔记


    C51的周期

    结构图

    结构图

    两个功能寄存器

    51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
    工作方式寄存器

    工作方式寄存器TMOD


    其中方式一和方式二常用

    控制寄存器TCON

    第四位用于控制外部中断,详见C51中断个人笔记

    初始化函数中要完成的工作:

    1. 给TMOD赋值,确定工作方式
    2. 计算初值,写入TH0,TL0或TH1,TL1
    3. 中断允许控制,EA和ET0 或ET1的置位为1
    4. TR0或TR1置位,启动定时计数器

    计数初值的计算

    首先知道振荡周期是多少,从而机器周期是其12倍,即每计一个数,用时为机器周期
    若需求是计一个数就溢出,则初值应设为65535,即65536-1 (如果是16位计数器)
    若需求是计n个数就溢出,则初值应设为65536-n (如果是16位计数器)

    例如,定时一毫秒。一个机器周期是1微秒,故1000个机器周期是1ms。
    初值为 65536-1000 = 64536 ,十六进制为FC18
    所以

    TH0 = 0xFC;
    TL0 = 0x18;
    

    完整代码

    #include <reg51.h>
    typedef unsigned int u16;		 
    typedef unsigned char u8;
    #define delaytime 500000
    sbit led = P0^0;
    			  
    /*
    void delay(u16 i)
    {
        while(i--);
    }
    */
    void T0Init()
    {
    	//1.选择工作方式,给TMOD 赋值
    	//TMOD:	GATE	C~T	 M1	M0	 (低四位是T0)
    	//           0      0    0  1  (方式一)
    	// xxxx 0001
    	TMOD |= 0x01;
    	//2. 计算初值,写入计数器
    	TH0=0XFC;				//给定时器赋初值,定时1ms	  0xFC18 = 65536 - 1000  微秒
    	TL0=0X18;	
    	//3. 中断允许:总允许和T0允许
    	ET0 = 1 ;
    	EA = 1;
    	//4. 开始定时
    	TR0=1;
    }
    void main(void)
    {
        T0Init();
        while(1);
    }
    //外部中断0的调用程序
    void Timer0() interrupt 1			  //	T0溢出时引用
    {
    	static u16 i;
    	TH0=0XFC;				//给定时器赋初值,定时1ms	  0xFC18 = 65536 - 1000  微秒
    	TL0=0X18;
    	i++;
    	if(i==1000)			   //1s
    	{
    		i=0;
    		led = ~led;
    	}
    }
    
  • 相关阅读:
    炒炒饼分锅喂
    奥运会
    360和腾讯QQ共存
    Lenovo F41 使用WinXP不能全屏看Flash格式的电影的解决方法
    如何在Windows server 2003上安装和设置Citrix MetaFrame XP FR3
    “电脑人才”是怎么炼成的
    Lenovo F41 使用WinXP不能全屏看Flash格式的电影的解决方法
    学车
    终于有了自己的本本了
    学车
  • 原文地址:https://www.cnblogs.com/YuQiao0303/p/9909147.html
Copyright © 2020-2023  润新知