51 定时/计数器

这篇博客详细介绍了51单片机中定时器和计数器的使用方法,包括设置TMOD寄存器选择定时或计数功能,工作模式选择,设置初值,开启定时/计数器,以及中断设置。内容涵盖了查询方式控制LED闪烁、流水灯,中断方式实现LED闪烁、数码管显示,测频法和测周法,以及PWM控制LED亮度等应用实例。
摘要由CSDN通过智能技术生成

T0 T1

//1 设置TMODE 时使用定时功能 还是计数功能 C/T=0计数 C/T=1 计数

//2 工作方式选择 模式一为16为计数/定时器

//3设置THx TLx的初值(在终端中还需再次赋初始值)

//4打开定时/计数器TRx=1

//5打开中断否 ETx=1;

//6中断总阀门EA=1

5B.01定时器查询方式 闪烁LED

#include <REG51.H>
#include <INTRINS.H>

/*
定时器TMODE
  7   6   5   4 *   3    2   1   0 
GATE C/T M1  M0 *  GATE C/T M1  M0
      T1        *       T0

C/T 0 为计时 1为计数

*/

void T0TimerInit();
unsigned char i;
void main()
{
    T0TimerInit();
    while (1)
    {
        if(TF0==1)
        {
            TF0=0;//需要软件置0
            TH0=(65536-50000)/256%256;//定时器需要再次赋初值 否则TH0=0;TL0=0 定时时间为65.536ms
            TL0=(65536-50000)/1%256;

            i++;//一秒定时
            if(i>=20)
            {
                P1=~P1;
                i=0;
            }

        }

    }
    
}


void T0TimerInit()
{
    //1.确定定时器/计数器方式
    TMOD=0X01;//0000 0001 M0=1工作方式1 TH0 TL0 组成一个16位的定时器
    //2.设置初值 TH0 TL0 定时50ms 50/1us=50000us 一个机器周期是1/12MHz * 12 =1us
    TH0=(65536-50000)/256%256;//65536 2^16
    TL0=(65536-50000)/1%256;
    //3.打开定时器
    TR0=1;//启动定时器

}

5B.02定时器查询方式 LED流水灯

#include <REG51.H>
#include <INTRINS.H>

/*
定时器TMODE
  7   6   5   4 *   3    2   1   0 
GATE C/T M1  M0 *  GATE C/T M1  M0
      T1        *       T0

C/T 0 为计时 1为计数

*/
unsigned char i;
unsigned char temp=0XFE;
void T0TimerInit();

void main()
{
    T0TimerInit();
    while (1)
    {
        if(TF0==1)
        {
            TF0=0;//需要软件置0
            TH0=(65536-50000)/256%256;//定时器需要再次赋初值 否则TH0=0;TL0=0 定时时间为65.536ms
            TL0=(65536-50000)/1%256;

            i++;//一秒定时
            if(i>=20)
            {
                i=0;
                P1=temp;
                temp=_crol_(temp,1);
            }
        }
    }
}


void T0TimerInit()
{
    //1.确定定时器/计数器方式
    TMOD=0X01;//0000 0001 M0=1工作方式1 TH0 TL0 组成一个16位的定时器
    //2.设置初值 TH0 TL0 定时50ms 50/1us=50000us 一个机器周期是1/12MHz * 12 =1us
    TH0=(65536-50000)/256%256;//65536 2^16
    TL0=(65536-50000)/1%256;
    //3.打开定时器
    TR0=1;//启动定时器

}

5B.03定时 计数器 中断方式实现LED1s闪烁

#include <REG51.H>
#include <INTRINS.H>

unsigned char counter;
void Timer0Init();

void main()
{
    Timer0Init();
    while (1)
    {
        
    }
}
void Timer0Init()		//50毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0xB0;		//设置定时初始值
	TH0 = 0x3C;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
    //开起中断 CPU在每个机器周期都会去查询标志位
    ET0=1;
    EA=1;
}

void Timer0_ISR() interrupt 1
{
    counter++;
    if(counter>=20)
    {
        counter=0;
        P1=~P1;
    }
    
    TL0 = 0xB0;		//设置定时初始值
	TH0 = 0x3C;		//设置定时初始值
}

5B.04 中断方式实现数码管刷新显示

#include <REG51.H>
#include "segmentDisplay.h"
/*
定时器1ms刷新数码管
开机显示-------- 2S
然后显示12345678;

*/

unsigned int timeCnt=0;
unsigned char startFlag=1;
void Timer0Init();
void startDisplay();
void numDisplay(unsigned long num);

void main()
{
    Timer0Init();
    startDisplay();
    while(startFlag);
    while (1)
    {
       numDisplay(8991010); 
    }
}

void Timer0Init()		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
    ET0=1;
    EA=1;
}

void Timer0_ISR() interrupt 1
{
    segmentDisplay();

    timeCnt++;
    if(timeCnt>2000)
    {
        startFlag=0;
        timeCnt=0;
    }
        

    TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
    
}

void startDisplay()
{
    buf[0]=22;
    buf[1]=22;
    buf[2]=22;
    buf[3]=22;
    buf[4]=22;
    buf[5]=22;
    buf[6]=22;
    b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值