×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-13 发布时间:
|
以下是代码实现已经测试并用到项目上课放心使用   
 
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);
}
 
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?