基于蓝桥杯的单片机模块练习——测量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左右。