STC89C52RC定时器的相关设置

本文介绍了一种利用单片机定时器进行精确时间控制的方法,并详细阐述了如何通过位移运算来实现波特率的精确配置。文中提供了具体的代码实现,包括定时器初始化、延时函数等关键部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在此次工程中,我们所有跟时间相关的操作都是接近精确,包括延时程序,我们没有使用大家给的除以256取余取整的方式,因为在单片机中没有这种操作,在十进制中,我们都知道一个数往左移动的一位就相当于该位乘以10,我们就使用这种方式来做的产生波特率。右移8位来实现我们所需要结果。

timer.h

#include "head.h"

#ifndef _TIMER_H_
#define _TIMER_H_

/*
* 有关定时器函数的声明
*/

//初始化
void Init_Timer(void);
//延时函数
void Delayms(uint16 ms);

sfr T2MOD = 0xC9;

extern uint16 timer_delay;
extern uint16 system_time;
#endif

timer.c

#include "timer.h"
#include "auart.h"


uint16 timer_delay;

//系统时间
uint16 system_time;


//定时器初始化
//1ms的延时
void Init_Timer(void)
{
    TMOD = 0X22;//定时器1为方式2,定时器0为方式2
    EA = 1;     //全部中断打开


    TR0 = 1;    //开启定时器0
    //产生模拟串口的波特率
    TH0 = 256-96;
    TL0 = TH0;
    ET0 = 1;    //定时器0允许
    TF0 = 0;

    //定时器1相关设置
    TH1 = TL1 = 0xFD;   //波特率9600
    TR1 = 1;    //开启定时器1

    //有关定时器2的设置
    T2CON = 0;
    T2MOD = 0;
    ET2 = 1;
    TR2 = 1;  //启动
    RCAP2H = (0xFFFF - 1000) >> 8;
    RCAP2L = (0xFFFF - 1000) & 0xFF;

    //定时器状态控制变量初始化
    system_time = 0; 
}

void Init0 (void) interrupt 1
{
    F_TM=1;
}


//定时器2的中断函数

void timer2(void) interrupt 5
{
  TF2 = 0;  //定时器2必须由软件对溢出标志位清零
  system_time++;
}



void Delayms(uint16 ms)
{
    uint16 tmp_delay;
    tmp_delay = system_time;
    for(;system_time-tmp_delay<ms;)
    {}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值