目录
一、原理部分
1、什么是555定时器
2、频率测量
3、频率测量相关配置
二、程序案例
一、原理部分
1、什么是555定时器
555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和振荡电路。555可被作为电路中的延时器件、触发器或起振元件。而在蓝桥杯的板子上,555定时器是一个信号发生电路,通过调节电位器Rb3可产生频率不同的方波。
2、频率测量
NET_SIG为方波信号输出引脚,通过接线帽可以将NET_SIG与P3.4(定时器0计数器输入引脚)相连。则可以使用定时器0进行计数,定时器1进行定时,当定时器1经过1秒后,定时器0的计数数值即为555定时器的信号频率。
3、频率测量相关配置
频率测量使用到两个定时器,这个可以查看前面写的的定时器原理及其应用。 频率测量需要编写三个函数,分别是两个定时器初始化的初始化函数,定时器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();//显示频率
}
}
蓝桥杯的学习笔记持续更新中~
要是文章有帮助的话,就点赞收藏关注一下啦!
感谢大家的观看文章来源:https://www.toymoban.com/news/detail-411635.html
欢迎大家提出问题并指正~文章来源地址https://www.toymoban.com/news/detail-411635.html
到了这里,关于[蓝桥杯单片机]学习笔记——555定时器与频率测量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!