sy5.bak

来自「数字频率计 c8051f单片机 使用PCA比较捕捉模块」· BAK 代码 · 共 125 行

BAK
125
字号
#include <c8051f000.h>

#define uchar unsigned char
#define uint unsigned int

void sysclk_init();
void port_init();
void pca_init();
void bl_init();


uchar bzw;
uchar bzw2;
uint i;						//pca计数器溢出次数
uchar cfbzw;
uchar ccf0bzw;
uchar pca0l;
uchar pca0h;
uchar pca0newl;					//第二次捕获下降沿时计数值
uchar pca0newh;
uchar pca0oldl;					//第一次捕获下降沿时计数值
uchar pca0oldh;
uint pca0old;
uint pca0new;
uint k;
float t;
uint n;
uint bi;


void main()
{
	sysclk_init();
	port_init();
	pca_init();
	EA=1;						//开总中断
	i=0;
	bl_init();
	for(;;)
	{
		if(k==0)
		{
			
			{
				pca0new=(pca0newh<<8)+pca0newl;
				pca0old=(pca0oldh<<8)+pca0oldl;
				t=(pca0new+(i*65536.0)-pca0old)/(16000000.0/12.0)/n;
				bl_init();
				bi=i;
				EA=1;
			}
		}
	}
}


void bl_init()
{
//	bzw=0;
//	bzw2=0;
//	i=0;
//	ccf0bzw=0;
//	cfbzw=0;
	n=10000;				//计n个周期
	k=n+1;
}

void sysclk_init()
{
	WDTCN=0XDE;					//关看门狗
	WDTCN=0XAD;
	OSCICN=0x07;				//内部16M时钟
}

void port_init()
{
	XBR0=0X10;					//CEX0,CEX1连接到端口
	XBR1=0X00;
	XBR2=0X40;					//交叉开关允许
	PRT0CF=0X00;				//P0口输出方式漏开
}

void pca_init()
{
	PCA0MD=0X01;				//系统时钟12分频,允许CF中断
	PCA0CPM0=0x11;				//PCA模块0下降沿触发捕捉,允许CCF0中断
	EIE1|=0X08;					//允许PCA中断
	PCA0CN=0x40;				//允许PCA计数器
}

void cf_int() interrupt 9
{
	

	if(CF)
	{
		CF=0;					//PCA中断标志清零
//		CCF0=0;
		i++;
	}
	else
	{
		CCF0=0;
		CF=0;
		ccf0bzw++;
		if(k==1)
		{
			pca0newl=PCA0CPL0;	//记下n+1次下降沿来时的计数值
			pca0newh=PCA0CPH0;
			EA=0;				//禁止中断
//			k--;				//两次计数完毕
		}
		if(k==n+1)
		{
			pca0oldl=PCA0CPL0;	//记下第一次下降沿来时的计数值
			pca0oldh=PCA0CPH0;
			i=0;
//			k--;
		}
		k--;
	}

	bzw++;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?