13
2020
11

CT107D 频率计 蓝桥杯频率测量 可以测量0-65khz方波

基于STC的官方示例文件完成编写,推荐STC单片机,性能稳定 

使用时请使用杜邦线连接P3_2引脚和555发生的SIGNAL引脚

#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
WORD count=0,ms=0,last=0;
//-----------------------------------------------

#define FOSC 11059200L

#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式

//-----------------------------------------------

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr AUXR = 0x8e;                    //Auxiliary register
sbit P10 = P1^0;

//-----------------------------------------
//中断服务程序
void exint0() interrupt 0       //INT0中断入口
{
    count++;
}

//-----------------------------------------------


//-----------------------------------------------

/* Timer1 interrupt routine */
void tm1_isr() interrupt 3
{
		if(ms++>=1000)
		{
			last=count;
			count=0;
			ms=0;
		}
}

//-----------------------------------------------
void hdw_init();
void smg_refresh();
void Delay1ms();
unsigned char num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//1 2 3 4 5 6 7 8 9 - 灭
//uchar code dottab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//带小数点的数字 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
unsigned char duan[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char smg[8]={1,2,3,4,5,6,7,8};
unsigned char x;
//-----------------------------------------------
void main()
{
		hdw_init();
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;
		AUXR |= 0x40;                   //定时器1为1T模式
	  TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL1 = T1MS;                     //初始化计时值
    TH1 = T1MS >> 8;
    TR1 = 1;                        //定时器1开始计时
    ET1 = 1;                        //使能定时器0中断
    INT0 = 1;
    IT0 = 1;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX0 = 1;                    //使能INT0中断
    EA = 1;

    while (1)smg_refresh();
}
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void hdw_init()
{
	P2=0xA0;
	P0=0x00;
	P2=0x00;
	
	P2=0x80;
	P0=0xFF;
	P2=0x00;
}
void smg_refresh()
{
	smg[0]=last/10000000%10;
	smg[1]=last/1000000%10;
	smg[2]=last/100000%10;
	smg[3]=last/10000%10;
	smg[4]=last/1000%10;
	smg[5]=last/100%10;
	smg[6]=last/10%10;
	smg[7]=last/1%10;
	for(x=0;x<8;x++)
	{
		P2=0xC0;
		P0=duan[x];
		P2=0x00;
		
		P2=0xE0;
		P0=num[smg[x]];
		Delay1ms();
		P0=0xFF;
		P2=0x00;
	}
}

稍作修改,防止count溢出,这里加个判断

#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
WORD count=0,ms=0,last=0;
//-----------------------------------------------

#define FOSC 11059200L

#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式

//-----------------------------------------------

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr AUXR = 0x8e;                    //Auxiliary register
sbit P10 = P1^0;

//-----------------------------------------
//中断服务程序
void exint0() interrupt 0       //INT0中断入口
{
		if(count<65530)count++;
}

//-----------------------------------------------


//-----------------------------------------------

/* Timer1 interrupt routine */
void tm1_isr() interrupt 3
{
		if(ms++>=1000)
		{
			last=count;
			count=0;
			ms=0;
		}
}

//-----------------------------------------------
void hdw_init();
void smg_refresh();
void Delay1ms();
unsigned char num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//1 2 3 4 5 6 7 8 9 - 灭
//uchar code dottab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//带小数点的数字 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
unsigned char duan[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char smg[8]={1,2,3,4,5,6,7,8};
unsigned char x;
//-----------------------------------------------
void main()
{
		hdw_init();
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;
		AUXR |= 0x40;                   //定时器1为1T模式
	  TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL1 = T1MS;                     //初始化计时值
    TH1 = T1MS >> 8;
    TR1 = 1;                        //定时器1开始计时
    ET1 = 1;                        //使能定时器0中断
    INT0 = 1;
    IT0 = 1;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX0 = 1;                    //使能INT0中断
    EA = 1;

    while (1)smg_refresh();
}
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void hdw_init()
{
	P2=0xA0;
	P0=0x00;
	P2=0x00;
	
	P2=0x80;
	P0=0xFF;
	P2=0x00;
}
void smg_refresh()
{
	smg[0]=last/10000000%10;
	smg[1]=last/1000000%10;
	smg[2]=last/100000%10;
	smg[3]=last/10000%10;
	smg[4]=last/1000%10;
	smg[5]=last/100%10;
	smg[6]=last/10%10;
	smg[7]=last/1%10;
	for(x=0;x<8;x++)
	{
		P2=0xC0;
		P0=duan[x];
		P2=0x00;
		
		P2=0xE0;
		P0=num[smg[x]];
		Delay1ms();
		P0=0xFF;
		P2=0x00;
	}
}


« 上一篇 下一篇 »

返回顶部
请先 登录 再评论,若不是会员请先 注册