51单片机——启用定时及使用1.0

1、我的reg52.h里没有定义T2MOD,故我自行添加sfr T2MOD=0xc9;

2、在代码里我使用了led灯做调试。定时1s,16位定时器调试OK,8位的未调试,在以后在调试了。

3、我的CPU晶振11.0592MHZ

4、关于定时器初值计算公式里,毫秒最大只能输入71,微妙最大只能输入119,要不然计算公式会变成负值。

#ifndef __TIME_H__
#define __TIME_H__
//时间不能大于71ms,如需更大的定时,需要在定时中断函数里累加71ms
//定时时间是ms毫秒
//建议定时为5ms\10ms\15ms\20ms\25ms\30ms\35ms\40ms\...70ms
//对于us微妙
//建议定时10us\20us\30us\40us\50us\60us\75us\86us\97us\119us

#include"REG52.h"
sfr T2MOD = 0xC9;

//extern unsigned char H0, L0;//定时器0初值
//extern unsigned char H1, L1;//定时器1初值

//定时器0初始化,并设定ms毫秒且工作方式1,16位模式
void Timer0_16bit(unsigned char time0_16_ms);
//定时器1初始化,并设定ms毫秒且工作方式1,16位模式
void Timer1_16bit(unsigned char time1_16_ms);
//定时器2初始化,并设定ms毫秒且工作方式1,16位自动重装模式
void Timer2(unsigned char time2_16_ms);

//定时器0初始化,并设定us微妙且工作方式2,8位自动重装模式
void Time0_8bit(unsigned char time0_8_us);
//定时器1初始化,并设定us微妙且工作方式2,8位自动重装模式
void Time1_8bit(unsigned char time1_8_us);


#endif // !__TIME_H__
#include"time.h"

unsigned char H0 = 0, L0 = 0;
unsigned char i = 0;
unsigned char H1 = 0, L1 = 0;
unsigned char j = 0;
unsigned char k = 0;
unsigned char l = 0;
unsigned char m = 0;

//定时器0初始化,设定ms毫秒且工作方式1,16位模式
void Timer0_16bit(unsigned char time0_16_ms)
{
    TMOD |= 0x01;
    TH0 =(65536 - (unsigned int)(time0_16_ms * 921.6)) / 256;//需将计算的小数转换整形
    TL0 =(65536 - (unsigned int)(time0_16_ms * 921.6)) % 256;//需将计算的小数转换整形
    H0 = TH0;
    L0 = TL0;
    EA = 1;//开启总中断
    ET0 = 1;//允许定时器0溢出进入中断
    TR0 = 1;//启动定时器
}
void Timer0Interrupt(void) interrupt 1
{
    TH0 = H0;
    TL0 = L0;
    i++;
    if (i == 20)//如果time0_16_ms=50,则定时1000ms
    {
        i = 0;
        P1 = ~P1;//LED灯亮和灭
    }
}
//定时器1初始化,设定ms毫秒且工作方式1,16位模式
void Timer1_16bit(unsigned char time1_16_ms)
{
    TMOD |= 0x10;
    TH1 = (65536 - (unsigned int)(time1_16_ms * 921.6)) / 256;//需将计算的小数转换整形
    TL1 = (65536 - (unsigned int)(time1_16_ms * 921.6)) % 256;//需将计算的小数转换整形
    H1 = TH1;
    L1 = TL1;
    EA = 1;
    ET1 = 1;//允许定时器1溢出进入中断
    TR1 = 1;
}
void Timer1Interrupt(void) interrupt 3
{
    TH1 = H1;
    TL1 = L1;
    j++;
    if (j == 20)//如果time1_16_ms=50,则定时1000ms
    {
        j = 0;
        P1 = ~P1;//LED灯亮和灭
    }
}

//定时器2初始化,设定ms毫秒且工作方式1,16位自动重装模式
void Timer2(unsigned char time2_16_ms)
{
    T2CON = 0x00;//用于定时器16位自动重装
    T2MOD = 0x00;//T2输出允许位,当T2OE=1的时候,允许时钟输出到P1.0(仅对80C54/80C58有效)
    RCAP2H = (65536 - (unsigned int)(time2_16_ms * 921.6)) / 256;//需将计算的小数转换整形
    RCAP2L = (65536 - (unsigned int)(time2_16_ms * 921.6)) % 256;//需将计算的小数转换整形
    TH2 = RCAP2H;
    TL2 = RCAP2L;
    EA = 1;
	ET2 = 1;//允许定时器2溢出进入中断
    TR2 = 1;
}
void Timer2Interrupt(void) interrupt 5
{
    TF2 = 0;//定时器2溢出标志,需要软件清零
    k++;
    if (k == 20)//如果time2_16_ms=50,则定时1000ms
    {
        k = 0;
        P1 = ~P1;//LED灯亮和灭
    }
}

//定时器0初始化,设定us微妙且工作方式2,8位自动重装模式
void Time0_8bit(unsigned char time0_8_us)
{
    TMOD |= 0x02;
    TH0 = TL0 = 256 - time0_8_us * 9216 / 10000;
    EA = 1;
    ET0 = 1;//允许定时器0溢出进入中断
    TR0 = 1;//启动定时器
}
/*
void Timer0Interrupt(void) interrupt 1
{
   //待定,他和16位定时模式有冲突
}
*/

//定时器1初始化,设定us微妙且工作方式2,8位自动重装模式
void Time1_8bit(unsigned char time1_8_us)
{
    TMOD |= 0x20;
    TH1 = TL1 = 256 - time1_8_us * 9216 / 10000;
    EA = 1;
    ET1 = 1;//允许定时器1溢出进入中断
    TR1 = 1;//启动定时器
}
/*void Timer1Interrupt(void) interrupt 3
{
    //待定,他和16位定时模式有冲突
}
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金丝草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值