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

发布者:hxcp18最新更新时间:2015-11-16 来源: eefocus关键字:单片机  定时中断  软定时器 手机看文章 扫描二维码
随时随地手机看文章
以下是代码实现已经测试并用到项目上课放心使用   
 
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);
}
 
关键字:单片机  定时中断  软定时器 引用地址:利用单片机定时中断实现软定时器

上一篇:单片机实时操作系统中进程与乡程
下一篇:几个C语言的好函数

推荐阅读最新更新时间:2024-03-16 14:39

基于51单片机的各种花样的流水灯c51程序
/*----------------------------------------------- 功能:流水灯对称移动闪烁(双闪烁) ------------------------------------------------*/ #include REG52.H #define uint unsigned int void delay(uint); main() { uint comp1=0xfe; uint comp2=0x80; P1=0x7e; delay(30000); while(1) { P1=0xff; comp1 =1;
[单片机]
MODEM芯片与89C51单片机构成的自动报警装置
  由MODEM(调制解调器)芯片构成的单片机自动报警装置可以借助工厂、企业内部的电话交换机网络,甚至公用电话交换机网络,远距离地传送报警信息,不受地点和时间的限制,真正做到安全、迅速和正确。      SSI73K222AL是TDK公司推出的产品,是一种高集成度的单片MODEM芯片。该芯片的主要特点如下:      ●可以和8048或89C51单片机对接,接口电路简单;      ●串行口数据传输;      ●既可以同步方式工作,又可以异步方式工作,包括V.22扩充超速;      ●与CCITTV.22、V.21、BELL 212A、103标准兼容;      ●具有呼叫进程、载波、应答音、长回环检测的功能;      ●能
[单片机]
MODEM芯片与89C51<font color='red'>单片机</font>构成的自动报警装置
关于嵌入式U盘读写器接口技术和系统设计
引言 随着USB技术和闪存技术的飞速发展,移动存储设备的速度和容量日新月异,但在工业控制的上位机和下位机之间,数据传输依然采用传统的串并口技术,特别对一些前端的便携式采集系统,需要采集后临时存储,再拿回来传给作为上位机的PC机进行数据处理,给人们带来很多不变,为此,本文提出了一种方法--利用U盘的便捷特性开发一种基于嵌入式的USB读写器,方便地将采集数据以文件方式写入U盘,PC机不需要任何特殊驱动便可以完成对数据的处理回放。利用本方法可以彻底解决下位机与PC机之间的数据传输难的问题。 1 硬件设计 系统采用TI公司的MSP430F149作为MCU,Cypress公司的SL811HS作为USB设备控制器,充分发挥各自
[应用]
想要单片机顺手,搞懂这些三极管知识!
实际上,只要你了解了三极管的特性对你使用单片机就顺手很多了。大家其实也都知道三极管具有放大作用,但如何去真正理解它却是你以后会不会使用大部分电子电路和1C的关键。 我们一般所说的普通三极管是具有电流放大作用的器件。其它的三极管也都是在这个原理基础上功能延伸。三极管的符号如下图左边,我们就以NPN型三极管为例来说说它的工作原理。由于三极管是由二极管演化而来的,所以大家记住PN结永远都是P指向N的,这样PNP还是XPN—下就很清楚了. 它就是一个以b(基极)电流lb来驱动流过CE的电流Ic的器件,它的工作原理很像一个可控制的阀门。 左边细管子里藍色的小水流冲动杠杆使大水管的阀门开大,就可允许较大红色的水流通过这个阀门。当蓝色
[单片机]
学51单片机-按键的中断检测
接着昨天,继续说按键的事。昨天说的是扫描检测,今个说一下中断检测。先插播一个小故事~~ 当年我和凯凯学单片机的时候,我用扫描检测的方法做的项目,他用中断检测的方法做的项目。当我俩坐一起交流按键检测的方式时,他火了,直接跳起来跟我吼:你不用中断怎么检测? 当时我就意识到他可能陷入了只能用中断的误区,然后就乐呵呵的说:用扫描啊~ 他继续吼,我继续乐,我俩就这样陷入了死循环。终于都累了,然后把程序和原理给他看,了解~ 在STC89C52单片机上,具有外部中断功能的引脚有两个:P3.2 –INT0 和 P3.3-INT1。上电默认的情况下,他们是普通IO引脚;当配置好相关寄存器之后,他们就变成
[单片机]
学51<font color='red'>单片机</font>-按键的<font color='red'>中断</font>检测
PIC中档单片机汇编指令详解(2)
DECF 数据寄存器的内容递减1 语法形式:DECF f,d 操作数:f为数据寄存器的低7位地址(0x00~0x7F) d为目的寄存器的低7位地址(0x00~0x7F) 当d=f时,结果放在f数据寄存器,f数据寄存器自减1 当d=W时,结果放在W寄存器中,W寄存器内容自减1 执行时间:一个指令周期 执行过程:【f】-1 d 状态标志影响:Z 说明:该指令对数据寄存器的内容做减1运算。如果减1后的结果为0,则置位0标志寄存器Z 指令范例: CLRF Count ;Count=0x00 DECF Count,f ;Count=0x00,f=0xFF DECF f,W ;f=0xFF,W=0xFE INCF 数据
[单片机]
基于单片机DS1302电子时钟闹钟控制系统
一、系统方案 本设计采用STC89C52作为主控制器,DS1302计时,液晶1602显示,按键设置时分秒,闹钟,实际时间走时达到闹钟时间,蜂鸣器报警提醒。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化: /*************定时器0初始化程序***************/ void init_time0() { EA = 1; //开总中断 TMOD = 0X12; //定时器0、工作方式1 TH1= 0X3C; TL1 = 0XB0; //50ms ET1 = 1; //开定时器0中断 TR1 = 1; //允许定时器0定时 TH0=0x00; //重载值 TL0=0x00; //初始化
[单片机]
基于<font color='red'>单片机</font>DS1302电子时钟闹钟控制系统
基于AVR单片机和串口的SD卡读取平台的设计
O 引言 SD卡(secure digital memory card,安全数码卡)是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张邮票的SD记忆卡,重量只有2 g,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。 本文正是通过AVR单片机经过软硬结合的设计方案,来读取SD卡上FAT32文件系统中的数据,FAT32是微软公司开发的新一代的文件系统,支持更大的存储容量和长达255个字符的文件名,也可以通过串口转USB接口芯片通过计算机来访
[单片机]
基于AVR<font color='red'>单片机</font>和串口的SD卡读取平台的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved