基于蓝桥杯的单片机模块练习——测量555定时器的频率

基于蓝桥杯的单片机模块练习——测量555定时器的频率

功能概述

测量555定时器的频率,通过数码管显示出来,只有用到的数码管点亮,未用到时,处于熄灭状态。

C代码

main.c

#include "SystemInit.h"
#include "timer.h"
#include "SEG.h"
void main()
{
	System_Init();
	Timer_Init();
	while(1)
	{
		Display_f();
	}
}

SystemInit.c

#include "SystemInit.h"

void SlectHC573(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;
	}
}

void System_Init()
{
	SlectHC573(5);
	P0 = 0X00;
	SlectHC573(0);
	P0 = 0XFF;
}


timer.c

#include "timer.h"

unsigned int count_f = 0;
unsigned char count_t = 0;
unsigned int data_f = 0;

void Timer_Init()
{
	TMOD = 0x06;//设置T0为计数模式,计数方式为8位自动重装
	             //设置T1为定时模式,计数方式为16位自动重装
	TH1 = (65536 - 46079) / 256;
	TL1 = (65536 - 46079) % 256;
	TH0 = 255;
	TL0 = 255;
	EA = 1;
	ET1 = 1;
	ET0 = 1;
	TR0 = 1;
	TR1 = 1;
}

void Service_T0() interrupt 1
{
	count_f++;//来一个555的脉冲就进入一次中断,使数据+1
}

void Service_T1() interrupt 3
{
	count_t++;
	if(count_t == 20)//每秒读取一次累加的count_f,作为555的频率
	{
		count_t = 0;
		data_f = count_f;
		count_f = 0;
	}
}
	

SEG.c

#include "SEG.h"


unsigned char code SMG_duanma[] = {0xc0,0xf9,0xa4,0xb0,
                                   0x99,0x92,0x82,0xf8,
                                   0x80,0x90,0x88,0x83,
                                   0xc6,0xa1,0x86,0x8e,
                                   0xbf,0x7f
                                  }; 


void DisplayBit(unsigned char pos, unsigned char dat)
{
	SlectHC573(7);
	P0 = 0XFF;
	
	SlectHC573(6);
	P0 = 0X01 << pos;
	
	SlectHC573(0);
	P0 = 0XFF;
	
	SlectHC573(7);
	P0 = dat;
}

void Delay_1ms(unsigned int t)
{
	unsigned int x,y;
	for(x = t; x > 0; x--)
		for(y = 900; y > 0; y--);
}
void Display_f()
{

	DisplayBit(0,SMG_duanma[15] );
	Delay_1ms(1);
	DisplayBit(1,0xff );
	Delay_1ms(1);
	DisplayBit(2,0xff );
	Delay_1ms(1);
	if(data_f > 9999)
	{
		DisplayBit(3,SMG_duanma[(data_f / 10000) % 10] );
	  Delay_1ms(1); 
	}
	if(data_f > 999)
	{
		DisplayBit(4,SMG_duanma[(data_f / 1000) % 10] );
	  Delay_1ms(1); 
	}
	if(data_f > 99)
	{
		DisplayBit(5,SMG_duanma[(data_f / 100) % 10] );
	  Delay_1ms(1); 
	}
	if(data_f > 9)
	{
		DisplayBit(6,SMG_duanma[(data_f / 10) % 10] );
	  Delay_1ms(1); 
	}
	
	
		DisplayBit(7,SMG_duanma[(data_f / 1) % 10] );
	  Delay_1ms(1); 
	
	
}

	

相关知识点

在这里插入图片描述
本实验需要将这两个引脚短接。
P34是T0引脚,所以测量频率的计数器必须得用T0。

问题:为什么在不同的程序里面读取到的555定时器的最大频率不一致啊???
有的程序里最大可以达到20000hz左右,有的程序里就只有17000hz左右。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值