目录
555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和振荡电路。555可被作为电路中的延时器件、触发器或起振元件。而在蓝桥杯的板子上,555定时器是一个信号发生电路,通过调节电位器Rb3可产生频率不同的方波。

NET_SIG为方波信号输出引脚,通过接线帽可以将NET_SIG与P3.4(定时器0计数器输入引脚)相连。则可以使用定时器0进行计数,定时器1进行定时,当定时器1经过1秒后,定时器0的计数数值即为555定时器的信号频率。

频率测量使用到两个定时器,这个可以查看前面写的的定时器原理及其应用。 频率测量需要编写三个函数,分别是两个定时器初始化的初始化函数,定时器0的中断服务函数,定时器1的中断服务函数:
(1)定时器初始化函数:
①配置工作模式,TMOD=0x16,高4位为0001,即定时器T1为定时模式,且为16位不可重装载模式,低4位为0110,即定时器T0为计数模式,且为8位自动装载模式
②设置定时器初始值
TH0=0xff;
TL0=0xff;
定时器0计数初始值为255,则每次有一个信号,就触发中断
TH1=(65535-50000+1)/256;
TL1=(65535-50000+1)%256;定时器1定时时长为50ms
③使能定时器中断,使能总中断
ET0=1;
ET1=1;
EA=1;
④使能定时器
TR0=1;
TR1=1;(2)定时器0中断服务函数(中断号为1):
①count_f++;(信号次数加1)
(3)定时器1中断服务函数(中断号为3):
①对THx和TLx重新赋值
TH1=(65535-50000+1)/256;
TL1=(65535-50000+1)%256;②定时逻辑处理
count_t++;
if(count_t==20)
{
dat_f=count_f;
count_f=0;
count_t=0;
}定时50ms*20即1秒后,将频率计数值赋给dat_f,记录下555定时器频率,再将频率计数值count_f以及定时计数值count_t清零,重新测量频率
此时获得的dat_f即为555定时器输出信号的频率
例子:测量555定时器,并将定时器频率显示在数码管上
#include "reg52.h"
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//定时器断码表
/*****************************************************************
*@Function: SelectHC573 //
*@Description: 锁存器选择 //
*@Input:channel:通道选择 //
*@Output:无 //
*@Return: 无 //
*@Others: 无 //
/*****************************************************************/
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=P2&0x1f|0x80;
break;
case 5:
P2=P2&0x1f|0xa0;
break;
case 6:
P2=P2&0x1f|0xc0;
break;
case 7:
P2=P2&0x1f|0xe0;
break;
case 0:
P2=P2&0x1f|0x00;
break;
}
}
/*****************************************************************
*@Function:DisplaySMG_Bit //
*@Description:单个数码管显示 //
*@Input:value:数码管显示的内容
* pos:数码管显示的位置 //
*@Output:无 //
*@Return:无 //
*@Others:无 //
/*****************************************************************/
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
SelectHC573(6);
P0=0x01<<pos;
SelectHC573(7);
P0=value;
}
/*****************************************************************
*@Function: Delay_SMG //
*@Description: 数码管延时函数 //
*@Input:t:延时长短 //
*@Output:无 //
*@Return:无 //
*@Others:无 //
/*****************************************************************/
void Delay_SMG(unsigned char t)
{
while(t--);
}
/*****************************************************************
*@Function:InitTimer //
*@Description: 定时器初始化函数 //
*@Input:无 //
*@Output:无 //
*@Return:无 //
*@Others: 无 //
/*****************************************************************/
void InitTimer()
{
TH0=0xff;
TL0=0xff;
//定时器1用作定时,时间为50ms
TH1=(65535-50000+1)/256;
TL1=(65535-50000+1)%256;
TMOD=0x16; //高四位0001,低四位0110,定时器1做定时,16位不自动重装载;定时器0作计数,8位重装
ET0=1;//使能定时器0中断
ET1=1;//使能定时器1中断
EA=1;//使能总中断
TR0=1;//开启定时器0
TR1=1;//开启定时器1
}
unsigned int count_f=0;//用于频率计数
unsigned int dat_f=0;//用于频率记录
unsigned char count_t=0;//用于定时器定时
/*****************************************************************
*@Function:ServiceT0 //
*@Description:定时器0中断服务函数 //
*@Input:无 //
*@Output:无 //
*@Return:无 //
*@Others:无 //
/*****************************************************************/
void ServiceT0() interrupt 1
{
count_f++;//每有一个信号,定时器0溢出进入中断,频率计数count_f加1
}
/*****************************************************************
*@Function:ServiceT1 //
*@Description:定时器1中断服务函数 //
*@Input:无 //
*@Output:无 //
*@Return:无 //
*@Others:无 //
/*****************************************************************/
void ServiceT1() interrupt 3
{
TH1=(65535-50000+1)/256;//重载定时器1计数初始值
TL1=(65535-50000+1)%256;
count_t++;//定时器定时加1
if(count_t==20)//如果定时器1溢出20次,即50ms*20=1秒后,将count_f赋给dat_f,再将count_f,count_t清零,重新计数
{
dat_f=count_f;
count_f=0;
count_t=0;
}
}
/*****************************************************************
*@Function:Display_ALL //
*@Description:全部数码管显示 //
*@Input:value:显示的内容 //
*@Output:无 //
*@Return: 无 //
*@Others:无 //
/*****************************************************************/
void Display_ALL(unsigned char value)
{
SelectHC573(6);
P0=0xff;
SelectHC573(7);
P0=value;
}
/*****************************************************************
*@Function: Dispaly_f //
*@Description: 将频率显示在数码管 //
*@Input:无 //
*@Output:无 //
*@Return:无 //
*@Others:无 //
/*****************************************************************/
void Dispaly_f()
{
DisplaySMG_Bit(0x8e,0);//1号数码管显示字符'F'
Delay_SMG(500);
DisplaySMG_Bit(0xff,1);//1、2号数码管不显示
Delay_SMG(500);
DisplaySMG_Bit(0xff,2);
Delay_SMG(500);
if(dat_f>9999)//如果频率大于9999
{
DisplaySMG_Bit(SMG_duanma[dat_f/10000],3);//3号数码管显示第五位
Delay_SMG(500);
}
if(dat_f>999)//如果频率大于999
{
DisplaySMG_Bit(SMG_duanma[(dat_f/1000)%10],4);//4号数码管显示第四位
Delay_SMG(500);
}
if(dat_f>99)//如果频率大于99
{
DisplaySMG_Bit(SMG_duanma[(dat_f/100)%10],5);//5号数码管显示第三位
Delay_SMG(500);
}
if(dat_f>9)//如果频率大于9
{
DisplaySMG_Bit(SMG_duanma[(dat_f/10)%10],6);//6号数码管显示第二位
Delay_SMG(500);
}
DisplaySMG_Bit(SMG_duanma[dat_f%10],7);//7号数码管显示最后一位
Delay_SMG(500);
Display_ALL(0xff);//将全部数码管清零
}
/*****************************************************************
*@Function:InitSystem //
*@Description:单片机初始化,关闭蜂鸣器,继电器以及LED灯 //
*@Input:无 //
*@Output:无 //
*@Return: 无 //
*@Others: 无 //
/*****************************************************************/
void InitSystem()
{
SelectHC573(5);
P0=0x00;
SelectHC573(4);
P0=0xff;
SelectHC573(0);
}
void main()
{
InitSystem();//单片机初始化
InitTimer();//定时器初始化
while(1)
{
Dispaly_f();//显示频率
}
}
蓝桥杯的学习笔记持续更新中~
要是文章有帮助的话,就点赞收藏关注一下啦!
感谢大家的观看
欢迎大家提出问题并指正~
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我正在寻找一个用ruby演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk=Var(yt)Cov(yt,yt−k)其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c