首先推荐B站小蜜蜂老师的视频课程,讲的蛮好,看完定时器前两章再看555定时器模块瞬间就悟了。

以上大概花费一个来小时,时间不够或者是暂时比较急的话也可以将就看我下边简易版的内容.

原理简介

原理其实非常简单, 不过是把一个定时器配置成输入捕获模式, 这个模式每捕获一个方波(通俗的说就是555定时器生成的方波通过线连到定时器上,定时器每收到一个上升沿或者下降沿之一,这个是看具体怎么配置的了)就会触发一次中断, 我们用一个变量(这里暂且叫它count)记录中断进去的次数,在中断进入的时候计数值加1,即可知道收到了多少方波.

如果再使用一个定时器每一秒中断一次,那么在中断出来的时候看一下count的值,然后把它清零,下次再引入这里的时候,就知道1s内来了多少方波,进而知道了频率.

再把它显示在数码管上,即可以看的到频率了.

问题拆分

根据上述原理,问题大概分成下边这么几个.

1. 配置一个连接到NE555模块的定时器使其为输入捕获模式.

2. 配置另一个定时器,使其能稳定在一段时间内产生中断(如果是2毫秒中断一次, 500次中断的时间约为1秒).

3. 使用数码管将结果展示.(想必大家学到NE555这里了也会用数码管了,这里就不赘述数码管的内容了)

问题解决

问题1解决:在下边代码的Timer0Init注释中有简单的解释.

问题2解决: 在Timer0Init中有简单的解释

问题3解决: 在开始到set_tube函数前有简单的解释


#include <stc15f2k60s2.h>
#define u8 unsigned char
#define u16 unsigned int
//作为一只菜鸟,显然我是记不住那么多值的,所以把如何开关写成了宏定义,这样一般就不会忘了
#define led_ P2=(P2&0x1f)|0x80         //100|0 0000
#define select_duan_ P2=(P2&0x1f)|0xe0 //1110
#define select_wei_  P2=(P2&0x1f)|0xc0 //1100
#define y5_          P2=(P2&0x1f)|0xa0
#define close_       P2=(P2&0x1f)
#define mie_ 10
//以下是共阳极数码管0-9,灭对应的值
u8 code list[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
/*0    1     2   3    4    5    6     7    8   9   (mie_)  */
//默认都是熄灭
u8 tube[]={mie_,mie_,mie_,mie_,mie_,mie_,mie_,mie_};u16 ne555,cnt,f=0;//这些是用得到的变量 f是频率,ne555后边会说到,cnt祖传的计数用的值
//跟着学长学的祖传的数码管动态刷新的代码,
void digital_tube_display(){static u8 i=0;select_duan_;P0=0xff;close_;//消影select_duan_;P0=list[tube[i]];close_;//段选select_wei_;P0=1<<i;close_;//位选if(++i==8) i=0;
}
//这个函数用来改变每一个的值,因为我是菜鸟,所以我不会太花里胡哨的,
//每次改哪个数值就set_tube(第几个数码管,要显示的值),set_tube(第几个数码管,要显示的值)...
//这样简单也不怎么出错,非常舒服
void set_tube(u8 idx,u8 num){tube[idx]=num;
}//4+8=12 a b c d
//这个定时器初始化是从软件里复制的,要改的地方就两个,空格空出来了
void Timer0Init(void)       //100微秒@12.000MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TMOD |=0x04;  //可以是0x04 ,0x06
/*这个是让他变成自动重装载的计数的模式,作为一名菜鸟,我肯定不知道自动重装载是啥,查了下
下边有个TL0,TH0,他俩意思是time low 定时器0 time high 定时器0 很朴实,
就是定时器0的低八位,高八位,计数器模式下,来一个脉冲,低八位就加1,低八位加满了高八位加,
都加满了就溢出,进入中断服务函数,
在很原始的时候,人类很难驯服野生的51单片机,这俩低八位高八位的加满了就不知道咋办了,
你看,这一次加满了,得让他回到初始值,才能一直只加这个数,不然就是乱加了,就不好用了
然后吧,原始的时候野生的单片机不会自己把那俩恢复到初始值,需要人类在他中断进入中断服务函数的时候
手动把那个恢复初始值,这个就是自动重装载,字面意思。
*/
//111111111 111111111
//000000000 000000000TL0 = 0xff;       //设置定时初始值  TH0 = 0xff;     //设置定时初始值  然后也可以这俩初值是0,直接算出高八位加第八位的值好像也许
/*设置成这样给他两个满的,来一次脉冲他就溢出了,只要在中断服务函数里边让他进一次就加1,等1秒钟就知道他加了多少了*/TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时
}void Timer1Init(void)      //1毫秒@12.000MHz
{AUXR |= 0x40;     //定时器时钟1T模式TMOD &= 0x0F;       //设置定时器模式TL1 = 0x20;       //设置定时初始值TH1 = 0xD1;       //设置定时初始值TF1 = 0;      //清除TF1标志TR1 = 1;      //定时器1开始计时
}
/*set_up和loop是之前arduino里边的老朋友了,作为一名菜鸟,我选择最简单的arduino入门,
这个还是对新手很友好的,推荐太极创客的教程,这个大家搜一下就搜得到了,
setup就是初始化,loop就是主函数里的大循环*/
void set_up(){Timer0Init();Timer1Init();EA=1;ET1=1;   ET0=1;//初始化定时器,打开各个中断开关
}
void loop(){if(cnt==1000){
//      f=(TH0<<8)|TL0;
//      TL0=0;TH0=0;f=ne555;ne555=0;cnt=0;set_tube(3,f/10000%10);set_tube(4,f/1000%10);set_tube(5,f/100%10);set_tube(6,f/10%10);set_tube(7,f%10);}
}
//因为定时器0会打断定时器1,为了尽力减少误差,定时器里东西越少越好,
//一般是放计数标志增加,还有就是一些很吃速度又跑得快的,比如说数码管刷新
void time0() interrupt 1
{
ne555++;
}
void time1() interrupt 3
{cnt++;digital_tube_display();}//错把main写成mian且没看到,白白耽误四小时,血亏,真的是血亏
//keil编辑器是不会提示主函数名字不对的,这对菜鸟就很不友好,像我就被这个折磨了四小时
void main(){set_up();while(1){loop();}
}

过去一年多自己回来留个言

这篇文章原本是基本上只有个代码块,啥都写到注释里去了.当时的我还是个欢乐的小菜鸟,这也是自己第一篇发出来的文章(虽然质量不怎么好).尤其记得当时发完博客高兴了好久. 也就是从那个时候开始, 开始慢慢习惯用typora,开始配picgo图床,开始积累自己的笔记. 这将近两年磕磕绊绊走了不少路,一看到两年前自己写的内容,不免感慨万千.感慨真要是写下来大概能写个半本书哈哈哈,这里就不啰嗦啦. 最后,祝各位前途似锦~

蓝桥杯单片机555定时器频率测量 非常简单的教程 能直接运行相关推荐

  1. 蓝桥杯单片机之NE555频率发生计的使用(IO模式)

    蓝桥杯单片机之NE555频率发生计的使用 NE555原理图及基本原理分析 基本控制 设计思路 代码 NE555原理图及基本原理分析 NE555时基芯片的频率输出引脚为NET_SIG,连接着外部排针J3 ...

  2. 蓝桥杯单片机-ADC-A/D转换-测量PCF8591中AIN3通道(滑动变阻器Rb2)的电压

    文章目录 前言 实例程序: 题目 main.c iic.c iic.h 前言 蓝桥杯单片机开发板CT107D中的板载A/D转换芯片PCF8591可进行ADC和DAC的转换,该芯片有4个输入通道; 在该 ...

  3. 【蓝桥杯单片机】定时器和中断

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 以下中断排列顺序为自然优先级排列顺序 : 外部中断0:INT0 定时/计数器0:TF0 外部中断1:INT1 定时/计数器1:TF1     串 ...

  4. 蓝桥杯单片机设计与开发⑬ ---NE555模块

    一.555定时器&频率测量 1. 电路原理 NE555是一种时钟芯片,输出一定频率的脉冲信号.就其模块特性,简单点来说,该模块会根据Rb3电位器的阻值,在SIG脚输出相应的频率的脉冲信号. 第 ...

  5. 蓝桥杯单片机学习13——NE555方波发生器频率测量

    NE555 简介 引脚图 原理图 真值表 工作原理 频率测量原理 定时器测量频率方法 代码实现 总结(一堆废话) 简介 NE555是一种高度稳定的控制器,内部用三个阻值为5KΩ的电阻分压,因此叫做55 ...

  6. 蓝桥杯单片机比赛学习:11、频率测量的基本原理

    在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能.频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现. 频率测量的基本原理 产生脉冲的主要元件是555定时器.555定 ...

  7. 蓝桥杯单片机----NE555频率测量

    NE555 (Timer IC)为8脚时基集成电路,NE555是属于555系列的计时IC的其中的一种型号,555系列IC的接脚功能及运用都是相容的,只是型号不同的因其价格不同其稳定度.省电.可产生的振 ...

  8. 蓝桥杯模板TemplatePart12:NE555定时器频率测量

    九层妖塔 起于垒土 蓝桥杯模板TemplatePart12:NE555定时器&频率测量 一.555定时器 1.内部框图: 2.基础知识: 二.Template: 1.定时器0初始化为计数器 2 ...

  9. 蓝桥杯单片机——用NE555定时器来测量频率

    蓝桥杯单片机比赛第十届以及十二届(第二场)中会用到NE555来测量频率以及频率周期,平时也会用到所以这个是必须要掌握的知识,简单来介绍一下芯片和编程用法. 芯片简介 NE555是属于555系列的计时I ...

最新文章

  1. BCH大涨带领币市小幅走高 个别币种走势逐步分化
  2. 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(一)
  3. 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型 1
  4. 易创课堂武汉站-NTES@百位创业者智慧众筹
  5. .NetCore中EFCore for MySql整理(二)
  6. 转 PHP函数---$_Get()和$_Post()的用法
  7. 最新版的Python写春联,支持行书隶书楷书,不再有缺失汉字
  8. 韩顺平 java 坦克大战_Tankgame 韩顺平版本的坦克大战,详细包括源代码,素材以及对应文件 Java Develop 263万源代码下载- www.pudn.com...
  9. 电信移动中兴B860AV2.1-1.1T-1.2系列晶晨S905L芯片-刷机固件包
  10. python lmdb使用
  11. su室外渲染参数设置_vray for sketchup渲染材质参数设置教程
  12. Python脚本提取氨基酸序列的 因子复杂度
  13. 基于Java的电子作业提交系统_基于jsp的网上作业提交系统-JavaEE实现网上作业提交系统 - java项目源码...
  14. windows连接蓝牙失败
  15. object-c中的对象的释放
  16. 关于密码学中不可区分性的一些问题
  17. 0004基于单片机智能垃圾桶控制系统设计
  18. LADY M过了自己的“赏味期限”?
  19. AT24C04【EEPROM】iic时序解读
  20. 此次519暴跌的几点感触 2021-05-21

热门文章

  1. 【Canvas】字体图标二、 Iconfont-阿里巴巴 、矢量图标库
  2. w5100网络扩展板故障排查记录
  3. position:fixed定位后下面紧接着div等元素的问题
  4. 蓝桥杯 ADV-343 着急的WYF(不同子串个数)
  5. android+metro风格,Metro、iOS、Android之三大UI风格对比
  6. 密码学—仿射密码实验报告
  7. 有哪些简单好用的电脑录音软件
  8. 世间没有一条绝对容易的捷径,切勿急功近利!
  9. 【观察】亚信科技:稳中求进开新局,继往开来创新篇
  10. windows如何进行完整备份、增量备份、差异备份