微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 利用单片机定时中断实现软定时器

利用单片机定时中断实现软定时器

时间:11-24 来源:互联网 点击:
以下是代码实现已经测试并用到项目上课放心使用

Author : 吾本杞人

#include "reg52.h"

#include "Intrins.h"

#include "TypeDef.h"

#include "CPUPin_Def.h"

#include "VarDef.h"

#define TIME_BASE_2MS 2

#define TIME_BASE_500MS 250

#define TIME_BASE_10MS 5

#define F_OSC 110592 //定义这个是默认按照11.0592MHZ的晶振算的TH0 TL0的值 方式1 16位定时器

//注意这种写法只能晶振翻倍的时候改这个宏才有用,

//因为51单片机硬件不支持浮点运算 12/11.0592 = 1 向下取整了 跟11.0592的晶振值是一样的

// 如果支持浮点运算会有芯片内部专门的的硬件浮点运算指令 这种写法也不行 必须强转类型

//如 ( double)12/(double)11.0592 要把类型强转成浮点数才行。

//目前有 硬件支持浮点 有软件浮点 就是说软件也可以实现浮点数运算。比如编译器看到特殊的代码会把转到

//一个特殊的函数去处理。 51 STM32 单片机目前好像都不支持硬件浮点数

void Timer0() interrupt 1 using 1

{

//采用静态变量这里只会执行一次,不管多少次中断因为是静态变量

//但不能写成

//如果实际换成了是12MHZ晶振 就改成 F_OSC / 120000 因为TH0 TL0 是按照11.0592算的值

static uchar TimeBase2ms = TIME_BASE_2MS * (F_OSC / 110592);

//如果11.0592的晶振 就1 如果是12.00MHZ 那这个值算出来说就是1.085xxxx 晶振跑的快了这个值要大点

//就是直接改F_OSC 这个宏就行了。不用改其他的

static uchar idata TimeBase500ms = TIME_BASE_500MS * (F_OSC / 110592);

static uchar TimeBase10ms = TIME_BASE_10MS *(F_OSC / 110592);

static unsigned char CountSignalDelay = 0;

//以上只会执行一次 static 定义声明初始化

uchar i;

TH0=0xfc ; // 总定时1000微秒, 进入中断需要12个周期, 所以实际定时1000 - 12 * 12 / F

TL0=0x72 ;

//这里 用工具算出来应该是FC 66 FC72-FC66 = 12

//让装载的数字少用12个周期 进入中断因为进入中断需要12周期加上去正好1ms

_push_( SCONF ) ;

if( --TimeBase2ms == 0 ){

TimeBase2ms = TIME_BASE_2MS * (F_OSC / 110592);

//0--3 是2毫秒为时基的定时器

for( i = 0; i < 4; i++ )

{

if( TimerNo[ i ] != 0 ){

if( --( TimerNo[ i ] ) == 0 ){//时间到

fTimer |= 0x01 < i; //置为时间到

}

}

}

if( --TimeBase10ms == 0 )

{

TimeBase10ms = TIME_BASE_10MS * ( F_OSC / 110592 );

ScanCopierSignal() ;//10毫秒掉一次函数

}

if( --TimeBase500ms == 0 )

{

TimeBase500ms = TIME_BASE_500MS * ( F_OSC / 110592 );

//处理以500ms为时基的定时器

for( i = 4; i < 8; i++ )

{

if( TimerNo[ i ] != 0 ){

if( -- ( TimerNo[ i ] ) == 0 ) {

fTimer |= 0x01 < i;

}

}

_pop_(SCONF);

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top