在此次工程中,我们所有跟时间相关的操作都是接近精确,包括延时程序,我们没有使用大家给的除以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;)
{}
}