当前位置: 首页 > news >正文

定时器——时基

一、时基的介绍

如下图,每一个标志(Flag_1ms)就代表一个时基,在不同的时基下可以做不同的事情。


 以下是对不同时基的处理,通过1ms进而生成1s的时基。

        // 1ms处理
        if( Flag_1ms ){   // 1ms标志==1 1ms的时间到了
            Flag_1ms = 0; // 标志清零
            Cnt_1ms++;
            if( Cnt_1ms >= 10 ){ // 计数够10次
                Cnt_1ms = 0;     // 计数器清零
                Flag_10ms = 1;   // 置10ms的标志
            }
        }// 1ms处理结束
        
        // 10ms处理
        if( Flag_10ms ){   // 10ms标志==1 10ms的时间到了
            Flag_10ms = 0; // 标志清零
            Cnt_10ms++;
            if( Cnt_10ms >= 10 ){ // 计数够10次
                Cnt_10ms = 0;     // 计数器清零
                Flag_100ms = 1;   // 置100ms的标志
            }
        }// 10ms处理结束

        // 100ms处理
        if( Flag_100ms ){   // 100ms标志==1 100ms的时间到了
            Flag_100ms = 0; // 标志清零
            Cnt_100ms++;
            if( Cnt_100ms >= 10 ){ // 计数够10次
                Cnt_100ms = 0;     // 计数器清零
                Flag_1s = 1;       // 置1s的标志
            }
            // 指示灯的 左移 右移 输出函数
            // 每100ms调用一次
            funLED(); // 
            
        }// 100ms处理结束
        
        // 1s处理
        if( Flag_1s ){   // 1s标志==1 1s的时间到了
            Flag_1s = 0; // 标志清零
            Cnt_1s++;
            
            Cnt_mode++;
            if( Cnt_mode >= 10 ){
                Cnt_mode = 0;
                mode = ~mode;
            }
            
        }// 1s处理结束       

二、时基的应用

这种情况下的延时,CPU是不能做其他事情的。

 但是如果放到时基里面去,每100ms执行一次,然后可以继续进行不同的事情。因此,用时基也可以达到软件延时一样的效果。

三、应用实例

/*======================================================================
            功能需求
    1、P1.5-P1.0指示灯左移或右移控制
    2、模式可随时切换 或 外部可修改 工作模式
======================================================================*/
/*======================================================================
            时基
    1、时基的基本概念
    2、时基下实现时序控制的方法
    3、任务拆解或打散
    4、控制接口实现的方法    
======================================================================*/
                     
#include "STC12C5A60S2.H"
#include "c51_stdint.h"


// 输出表
uint8_t code LED_TAB[ ] = { // 右移表 索引号加  // 索引号减 左移
    (uint8_t)(1 << 5), // 0
    (uint8_t)(1 << 4), // 1
    (uint8_t)(1 << 3), // 2
    (uint8_t)(1 << 2), // 3
    (uint8_t)(1 << 1), // 4
    (uint8_t)(1 << 0)  // 5
};

// 索引号
uint8_t Index = 0;

// 模式  // 10秒切换一次
uint8_t mode = 0; // 0:右移
                  // 1:左移

uint8_t Cnt_mode = 0;

uint8_t Cnt_LED = 0;

// 指示灯的 左移 右移 输出函数
// 每100ms调用一次
void funLED( void ){
    
    P1 = ~LED_TAB[ Index ];
    
    Cnt_LED++;
    if( Cnt_LED >= 5 ){
        Cnt_LED = 0;
        if( mode ){  // 左移
            Index--; // 0-1 = 255 Index是无符号的数
            if( Index > 5 ){ // 越界处理
                Index = 5;   // 
            }
        }
        else{ // 右移
            Index++;  
            if( Index > 5 ){ // 越界处理
                Index = 0;  
            }        
        }
    }        
}

 延时
//void D100ms( void ){
//    uint16_t i = 0; 
//    for( i = 0; i < 60000; i++ ){
//        
//    }
//}

uint8_t Flag_1ms = 0;
uint8_t  Cnt_1ms = 0;

uint8_t Flag_10ms = 0;
uint8_t  Cnt_10ms = 0;

uint8_t Flag_100ms = 0;
uint8_t  Cnt_100ms = 0;

uint8_t Flag_1s = 0;
uint8_t  Cnt_1s = 0;

void Timer0_Init(void)		//1000微秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x20;				//设置定时初始值
	TH0 = 0xD1;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
}

// 主程序
void main(void){       
    
    // 调用 定时器0 初始化
    Timer0_Init();
    
    // 开定时器T0 的中断
    ET0 = 1; 
    // 开总中断
    EA = 1; 
    
    while(1){        
        // 1ms处理
        if( Flag_1ms ){   // 1ms标志==1 1ms的时间到了
            Flag_1ms = 0; // 标志清零
            Cnt_1ms++;
            if( Cnt_1ms >= 10 ){ // 计数够10次
                Cnt_1ms = 0;     // 计数器清零
                Flag_10ms = 1;   // 置10ms的标志
            }
        }// 1ms处理结束
        
        // 10ms处理
        if( Flag_10ms ){   // 10ms标志==1 10ms的时间到了
            Flag_10ms = 0; // 标志清零
            Cnt_10ms++;
            if( Cnt_10ms >= 10 ){ // 计数够10次
                Cnt_10ms = 0;     // 计数器清零
                Flag_100ms = 1;   // 置100ms的标志
            }
        }// 10ms处理结束

        // 100ms处理
        if( Flag_100ms ){   // 100ms标志==1 100ms的时间到了
            Flag_100ms = 0; // 标志清零
            Cnt_100ms++;
            if( Cnt_100ms >= 10 ){ // 计数够10次
                Cnt_100ms = 0;     // 计数器清零
                Flag_1s = 1;       // 置1s的标志
            }
            // 指示灯的 左移 右移 输出函数
            // 每100ms调用一次
            funLED(); // 
            
        }// 100ms处理结束
        
        // 1s处理
        if( Flag_1s ){   // 1s标志==1 1s的时间到了
            Flag_1s = 0; // 标志清零
            Cnt_1s++;
            
            Cnt_mode++;
            if( Cnt_mode >= 10 ){
                Cnt_mode = 0;
                mode = ~mode;
            }
            
        }// 1s处理结束        
        
    }
    
}

// 中断服务程序 T0的
//                  关键字   中断号  关键字  工作寄存器组
void ISR_T0( void ) interrupt 1     using    0
{
    Flag_1ms = 1;  // 置1ms标志
}
    



提示:

!和~均表示取反,这两个的区别在于:
! :代表逻辑取反,即:把非0的数值变为0,0变为1;
~ :表示按位取反,即在数值的二进制表示方式上,将0变为1,将1变为0;

相关文章:

  • 谈谈 wait 和 notify
  • Web项目测试专题(七)安全性测试
  • AI前端开发赋能自主创业:ScriptEcho助你乘风破浪
  • 前端布局的方式有哪些
  • Qt 中使用 ffmpeg 获取采集卡数据录制视频
  • K8s 证书认知(K8s Certificate Awareness)
  • 洛谷P8707 [蓝桥杯 2020 省 AB1] 走方格
  • HBuilderX中uni-app打开页面时,如何用URL传递参数,Query参数传递
  • Java 与设计模式(15):模板方法模式
  • 前端如何实现一个五星评价,鼠标滑动,前边星星颜色的变黄,后边的不变;
  • java后端开发day16--字符串(二)
  • 25/2/17 <嵌入式笔记> 桌宠代码解析
  • VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
  • recent移除task时,结束其所有进程和service(全Android版本)
  • 日常开发中,使用JSON.stringify来实现深拷贝的坑
  • PHP支付宝--转账到支付宝账户
  • 计算机专业知识【探秘 C/S 工作模式:原理、应用与网络协议案例】
  • NBT群落物种级丰度鉴定新方法sylph
  • 【C语言】有序数组的平方
  • 《DeepSeek 一站式工作生活 AI 助手》
  • 腾讯布局智能体开发平台,吴运声:智能体行业增长很快,仍处于百花齐放阶段
  • 预算1600万寻装修供应商,济宁银行山东省内第八家分行将落户济南
  • 中铁城市发展投资集团原党委书记、董事长黄天德被查
  • 上影节开幕影片《酱园弄·悬案》,陈可辛执导,章子怡主演
  • 李根读《野兽之魂》|拨开高深的布幔,直窥历史的复杂
  • 大学2025丨北大教授陈平原:当卷不过AI时,何处是归途