蓝桥杯单片机-555定时器与频率检测

 

使用时要短接

 

 但是以上的关闭蜂鸣器和数码管只能在mm模式,存储器地址模式,我们一般用的事io模式,所以并不适用,关闭蜂鸣器的话,可以在上电时打开register_r(5),然后把p0口赋值0x00.

这里的TMOD要设为0x16,具体为什么看上图

T0用做计数器,也就是频率计数,要设为8位自动重装模式,TH0和TL0要设为0xff,来一个频率就进入中断,实现频率计数

T1用作计时器,也就没有什么特别的

中断函数具体代码如下,要看

void Timer0_service() interrupt 1  //频率计数
{
	T0_frequency++;
}

void Timer1_service() interrupt 3  //计时
{
	TL1 = 0x66;	
	TH1 = 0xFC;
	T1_count++;
	if(T1_count>=1000)
	{
		T1_count=0;
		temp=T0_frequency;
		T0_frequency=0;
	}
}

        在处理555定时器的数码管部分时,使用延时消影时,把握不好时间,但是消影应该20ms就够了,

        下面为全部代码,

 

#include <REGX52.H>
#include "nixietube.h"
#include "absacc.h"
#include "delay.h"

unsigned long T0_frequency;
unsigned int T1_count;
unsigned long temp;

//首先要初始化两个定时器T0计数,T1计时
void timer_Init()
{
	//T0计数 八位自动重装
	TH0=0xff;
	TL0=0xff;
	
	//T1计时 
	TL1 = 0x66;
	TH1 = 0xFC;
	
	TMOD=0x16; 
	
	//SCON 中断有关寄存器
	ET0=1;
	ET1=1;
	EA=1;
	
	TR0=1;
	TR1=1;
}

void main()
{
	timer_Init();
	while(1)
	{
		if(temp>9999)
		{
			nixietube(4,temp/10000);
		}
		
		if(temp>999)
		{
			nixietube(5,(temp/1000)%10);
		}
	
		if(temp>99)
		{
			nixietube(6,(temp/100)%10);
		}
		
		if(temp>9)
		{
			nixietube(7,(temp/10)%10);
		}
	
			nixietube(8,temp%10);
	}

}

void Timer0_service() interrupt 1  //频率计数
{
	T0_frequency++;
}

void Timer1_service() interrupt 3  //计时
{
	TL1 = 0x66;
	TH1 = 0xFC;
	T1_count++;
	if(T1_count>=1000)
	{
		T1_count=0;
		temp=T0_frequency;
		T0_frequency=0;
	}
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值