前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >4.10 51单片机-使用计数器测量NE555脉冲频率

4.10 51单片机-使用计数器测量NE555脉冲频率

作者头像
DS小龙哥
发布于 2022-01-10 09:21:09
发布于 2022-01-10 09:21:09
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

4.10 使用计数器测量NE555脉冲频率

4.10.1 原理图介绍

图4-10-1

图4-10-2

4.10.2 单片机的计数器模式介绍

STC90C51RC/RD+系列单片机内部设置的两个16位定时器/计数器T0和T1都具有计数方式和定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TMOD中都有一控制-C/T来选择T0或者T1为定时器还是计数器。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每6个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(T0为P3.3,T1为P3.3),则为计数方式,每来一个脉冲加1。

图4-10-3

4.10.3 NE555定时器介绍

555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和振荡电路。555可被作为电路中的延时器件、触发器或起振元件。

555定时器可工作在三种工作模式下:

单稳态模式:在此模式下,555功能为单次触发。应用范围包括定时器,脉冲丢失检测,反弹跳开关,轻触开关,分频器,电容测量,脉冲宽度调制(PWM)等。

无稳态模式:在此模式下,555以振荡器的方式工作。这一工作模式下的555芯片常被用于频闪灯、脉冲发生器、逻辑电路时钟、音调发生器、脉冲位置调制(PPM)等电路中。如果使用热敏电阻作为定时电阻,555可构成温度传感器,其输出信号的频率由温度决定。

双稳态模式(或称施密特触发器模式):在DIS引脚空置且不外接电容的情况下,555的工作方式类似于一个RS触发器,可用于构成锁存开关。

4.10.4 示例代码

下面代码里,配置定时器1为16位计数器模式并开启计数中断;NE555脉冲发生器接在单片机的P3.3引脚输入脉冲,通过定时器1进行计数。再配置定时器0为16位定时器模式,50毫秒超时一次,在中断服务函数里记录超时的次数,当超时20次表示1秒钟时间到达。1秒钟时间到达之后,在定时器0的中断服务函数里关闭定时器0和计数器1。在主函数里判断计数器是否停止,如何计数器停止就表示1秒钟时间到达,之后就读取1秒钟之内计数器1记录的脉冲数量,通过数码管进行显示。

用总脉冲量/总时间,就可以得出脉冲的周期。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <reg51.h>
u32 time1_cnt=0; //记录计数器1收到的外部脉冲数量
u32 time0_cnt=0; //记录定时器0的超时时间次数
u32 Freq=0;
int main()
{
    Timer0_16bit_Init(50000); //初始化定时器0,定时50ms一次
    Timer1_16bit_CntMode_Init(); //初始化计数器1
    while(1)
    {
        if(TR0==0) //当定时器0停止时,表示1秒钟时间到达
        {
            Freq=time1_cnt+(TH1<<8|TL1); //得到1秒钟内计算的脉冲数
            time1_cnt=0;//清除脉冲计数
            TH1=0; //将计数器的值清零
            TL1=0;
            TR0=1; //开启定时器0
            TR1=1; //开启计数器1
        }
        LED_DisplayNumber(Freq); //显示脉冲个数
    }
}

//共阴极数码管编码(要显示的段就输出1)
//数字0~9
code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//定义38译码器的引脚
sbit HC138_A0=P2^2; //A
sbit HC138_A1=P2^3; //B
sbit HC138_A2=P2^4; //C
#define LED P0  //定义LED引脚

//设置数码管显示指定的数字
void LED_DisplayNumber(unsigned long number)
{
    u16 i,j;
    u8 display_data[8];//存放当前数码管显示的数据
    //以下代码将number按十进制位从低到高依次提取并转为数码管显示字符
    display_data[0] = LED2_Coding[number/10000000%10];     
    display_data[1] = LED2_Coding[number/1000000%10];
    display_data[2] = LED2_Coding[number/100000%10];
    display_data[3] = LED2_Coding[number/10000%10];
    display_data[4] = LED2_Coding[number/1000%10];
    display_data[5] = LED2_Coding[number/100%10];
    display_data[6] = LED2_Coding[number/10%10];
    display_data[7] = LED2_Coding[number/1%10];
    for(i=0;i<8;i++)
    {
        switch(i)    //位选,选择点亮的数码管,
        {
            case 0:
                HC138_A0=0;HC138_A1=0;HC138_A2=0; break;//显示第0位
            case 1:
                HC138_A0=1;HC138_A1=0;HC138_A2=0; break;//显示第1位
            case 2:
                HC138_A0=0;HC138_A1=1;HC138_A2=0; break;//显示第2位
            case 3:
                HC138_A0=1;HC138_A1=1;HC138_A2=0; break;//显示第3位
            case 4:
                HC138_A0=0;HC138_A1=0;HC138_A2=1; break;//显示第4位
            case 5:
                HC138_A0=1;HC138_A1=0;HC138_A2=1; break;//显示第5位
            case 6:
                HC138_A0=0;HC138_A1=1;HC138_A2=1; break;//显示第6位
            case 7:
                HC138_A0=1;HC138_A1=1;HC138_A2=1; break;//显示第7位 
        }
        LED=display_data[i];     //控制数码管的显示数据值
        j = 100;                 //扫描间隔时间设定
        while(j--){}    
        LED=0x00;             //消隐,所有数码管都不显示
    }
}

u16 T0_Update_data;//定时器0的初始值
void Timer0_16bit_Init(u16 us)
{   
    //当前实验板上的晶振实际频率为: 12MHZ
    u16 val=us/(12/12); //得到计数的时间,只要整数部分
    T0_Update_data=65535-val; //得到重装载值
    TMOD&=0xF0;     //清除配置
    TMOD|=0x01;     //配置定时器0工作在16位定时器模式
    TH0=T0_Update_data>>8; //定时器0高位重装值
    TL0=T0_Update_data;    //定时器0低位重装值
    EA=1;                  //开启总中断
    ET0=1;                 //开启定时器0溢出中断
    TR0=1;                 //开启定时器0
}
//定时器0的重装值更新函数
void Timer0_Update(void)
{
    TH0=T0_Update_data>>8; //定时器0高位重装值
    TL0=T0_Update_data;    //定时器0低位重装值
}
/*
配置定时器1初始化为16位计数器模式
*/
void Timer1_16bit_CntMode_Init(void)
{   
    //当前实验板上的晶振实际频率为: 12MHZ
    TMOD&=0x0F; //清除配置
    TMOD|=0x50; //配置定时器1工作在16位计数器模式
    EA=1;       //开启总中断
    ET1=1;      //开启定时器1溢出中断
    TR1=1;      //启动定时器1
}

/*定时器0的中断服务函数*/
void TIM0_IRQHandler(void) interrupt 1
{
    time0_cnt++;
    //定时器0配置50ms超时一次,超时次数到达20次表示1秒钟时间到达
    if(time0_cnt==20)
    {
        time0_cnt=0;
        TR0=0; //关闭定时器0
        TR1=0; //关闭计数器1
    }
    Timer0_Update(); //定时器0的重装载
}

/*定时器1的中断服务函数*/
void TIM1_IRQHandler(void) interrupt 3  //定时器1
{
    //当前计数器配置为16位模式,进入一次中断就表示计数了65536次
time1_cnt+=65536; 
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
记录一次面试被问到的MySQL三大日志之Undo Log、Redo Log与Bin Log
MySQL数据库作为目前最流行的关系型数据库管理系统之一,开发者在面试中经常会被问到这个问题。其中,Undo Log、Redo Log和Bin Log是MySQL中最重要的三种日志,它们各自承担着不同的职责(各司其职),共同保障数据库的数据一致性、持久性和可恢复性。
祁画
2024/07/26
1540
记录一次面试被问到的MySQL三大日志之Undo Log、Redo Log与Bin Log
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
开篇,先推荐一篇文章《Spring中Bean的作用域深入剖析与技术实践》,作者是【小马哥学JAVA】。
拉丁解牛说技术
2024/12/06
4040
【图文详解】MySQL系列之redo log、undo log和binlog详解
这篇文章主要介绍了MySQL系列之redo log、undo log和binlog详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。
一个会写诗的程序员
2021/03/15
17.9K1
Mysql日志redo log、undo log、bin log
Mysql中日志文件是非常重要的,也是面试的高频问题。Mysql中日志分为三种,分别是redo log、undo log和bin log,他们在事务回滚,崩溃恢复,主从复制等功能上都是极其重要的,可以说是后端程序员必须掌握的知识点,只是了解Mysql日志,才是真正了解Mysql,下面我们就来看下他们三种日志分别都有什么作用。
一杯茶Ja
2024/10/02
1860
MySQL 日志:undo log、redo log、binlog
今天来和大家分享MySQL的三个日志文件,可以说 MySQL 的多数特性都是围绕日志文件实现,而其中最重要的有以下三种:
田维常
2022/11/25
2.4K0
MySQL 日志:undo log、redo log、binlog
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL作为最流行的开源数据库,其重要性不言而喻。日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。常见的日志有以下几种:
寻求出路的程序媛
2025/02/06
9820
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL三大日志——binlog、redoLog、undoLog详解
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息,能帮助我们进行很多容错及分析工作,其中有三大日志与我们这些开发者息息相关,本文将介绍binlog、redoLog、undoLog三种日志:
向着百万年薪努力的小赵
2022/12/02
6K0
MySQL三大日志——binlog、redoLog、undoLog详解
Mysql各种日志binlog、redolog、undolog——Mysql系列(二)
https://segmentfault.com/a/1190000041758784
翰墨飘香
2023/06/11
4.6K0
MySQL的事务实现原理介绍:undo log、redo log、checkpoint和LSN
参考博客1(建议先通读该博客)介绍了MySQL通过Undo+Redo Log的机制实现了事务的原子性、一致性和持久性(关于事务的隔离性是通过锁机制来保障的,请参考我的另一篇博文MySQL常见的七种锁详细介绍)。文章中提到:
saintyyu
2021/11/22
1K0
必须了解的mysql三大日志-binlog、redo log和undo log
来自:https://juejin.im/post/6860252224930070536
用户6543014
2020/09/10
1.8K0
必须了解的mysql三大日志-binlog、redo log和undo log
谈谈Redo Log和Undo Log
在MYSQL中,日志是非常重要的,其中Redo log 和undo log都是引擎层(innodb)实现的日志,redo log 是重做日志,提供 前滚 操作,undo log 是回退日志,提供 回滚 操作。
一个风轻云淡
2023/12/11
6910
mysql日志:redo log、binlog、undo log 区别与作用
概念:重做日志用来实现事务持久性,主要有两部分文件组成,重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者是在磁盘中。
CodingCode
2021/10/13
10.4K1
mysql日志:redo log、binlog、undo log 区别与作用
MySQL中的Redo Log、Undo Log和Binlog:深入解析
在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
小马哥学JAVA
2024/10/27
1730
Mysql-4-redo、undo、binlog
Get
2024/03/10
1390
mysql之日志
一条数据在更新过程当中,如果中途 mysql crash 了,mysql 是如何保证数据的一致性和持久性的?在这个过程中 mysql 的日志系统起到了至关重要的作用。本文将会介绍 mysql 中的 undo log、redo log 和 bin log 在这其中的作用。
编程黑洞
2023/03/04
3620
mysql之日志
MySQL日志系统深入解析:Redo Log, Undo Log与Binlog
今天给大家分享MySQL中的三种核心日志——Redo Log、Undo Log和Binlog,涵盖它们的介绍、作用、存储位置、写入机制、记录格式、特点以及如何管理这些日志。
小明互联网技术分享社区
2024/06/21
1.6K0
MySQL日志系统深入解析:Redo Log, Undo Log与Binlog
MySQL七:一文详解六大日志
「mysql数据库中日志是重要组成部分,记录着数据库运行期间各种状态信息」。主要有6类:
云扬四海
2022/09/26
1.4K0
mysql三大日志-binlog、redo log和undo log
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和undo log),本文接下来会详细介绍这三种日志。
AlbertZhang
2020/08/14
2.5K0
Mysql底层原理超详细,一文速通
里面的三个核心组件, 解析器, 优化器, 执行器,负责完成服务层的核心功能, 其中三个核心组件的交互流程大致如下, 解析器将sql语句转换为解析树, 优化器选择最优的执行方案, 执行器根据计划调用存储引擎执行对应操作并返回结果, 有点类似于公司老总负责将公司战略拆分为一个个小目标分发给公司高管, 然后公司高管决策, 已最高效率达到目的,之后再将任务拆分,给我们打工人, 之后打工人来负责执行
天下之猴
2024/10/01
5741
Mysql底层原理超详细,一文速通
详细分析 MySQL 事务日志(redo log 和 undo log)
InnoDB 事务日志包括redo log和undo log,其中redo log是重做日志,提供前滚操作;undo log是回滚日志,提供回滚操作。undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:
CG国斌
2020/05/26
1.9K0
推荐阅读
相关推荐
记录一次面试被问到的MySQL三大日志之Undo Log、Redo Log与Bin Log
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档