当前位置:首页 > MCU > CT107D > 正文内容

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

chanra1n4年前 (2020-11-13)CT107D4170

基于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;
	}
}


扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://myfpga.cn/index.php/post/163.html

分享给朋友:
返回列表

上一篇:CT107D V10 V20 原理图

没有最新的文章了...

“CT107D 频率计 蓝桥杯频率测量 可以测量0-65khz方波” 的相关文章

CT107D-流水灯(跑马灯的简单实现)

CT107D-流水灯(跑马灯的简单实现)

#include <reg52.h> #include <intrins.h> sbit relay=P0^4;   //继电器 sbit buzzer=P0^6;  //蜂鸣器...

CT107D DS1302

CT107D DS1302

使用官方的ds1302.h和ds1302.c,下方有核心代码讲解main.c#include<reg52.h> #include<intrins.h> #include<ds1302.h> typedef unsigned char&nb...

CT107D DS18B20

CT107D DS18B20

先贴上核心代码unsigned char get_temp(void) { unsigned char TH,TL; init_ds18b20(); Write_DS18B20(0xCC); Write_DS18B20(0x44); De...

CT107D DAC 电压模拟输出

CT107D DAC 电压模拟输出

/*   程序说明: IIC总线驱动程序   软件环境: Keil uVision 4.10    硬件环境: CT107单片机综合实训平台 8051,12MHz...