⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wave_generator_measure2.c

📁 自己的平时一些制作 现在整理一下 与大家一起分享
💻 C
字号:
/************测低频信号周期的一个程序***********/
//	 经过数学变换后就可以用来测频率
//	 思路:数一个周期中有多少个100us,用count放这个计数值
/**************************************/

#include <reg51.h>
/*****定义50ms方波的波形输出接口******/
sbit led=P1^0; 

sbit int0=P1^1;		//被测量信号,当然也可以接到其他的引脚

//下面两个变量就是用来 切换数码管的序号 和 存放显示的数据
unsigned char n; 
unsigned char d[4];

//定义全局变量用于存放计算值
unsigned int count;

unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};  //数码管显示选择
unsigned char code tab[16]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,
                            7,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};  					 
                                              //显示0--9;a--f;

/********十进制到bcd码转换************/
void hextobcd (unsigned int hexs)	   
{
d[0]=hexs/1000;
hexs=hexs%1000;
d[1]=hexs/100;
hexs=hexs%100;
d[2]=hexs/10;
hexs=hexs%10;
d[3]=hexs;
}


/********延时子程序***********/
 void delay(unsigned char dy)
 {
 while(--dy);
 }

/*******定时器初始化**********/
void Init_Timer (void)
{
 TMOD=0x12;  //设定定时器的工作模式  定时器1工作在16位定时状态
 		     //设定定时器0工作在8位自动重装方式
 TH1=(65536-23040)/256;  //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
 TL1=(65536-23040)%256;
 TH0=(256-92);  //设定定时常数,定时100us
 TL0=(256-92);
 EA=1;     //cpu开中断
 ET1=1;    //定时器1开中断
 ET0=1;    //定时器0开中断
 TR1=1;   //启动定时器1
}

/*********定时器1中断服务程序************/
void timer1 (void) interrupt 3
{
// TR1=0;						//停定时器1
 TH1=(65536-23040)/256;  //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
 TL1=(65536-23040)%256;
 led=!led;                	//输出去反
// TR1=1;						//启动定时器1
}

/*********定时器0中断服务程序**************/
/*********定时2毫秒*********/
void timer0 (void) interrupt 1
{ 
 count++; //计数
}


/*******非中断的数码管显示子程序***********/
//由于这里中断用完了,所以
/******************************************/
void display()
{
 unsigned char m;
 for(m=0;m<4;m++)
   {
    P2=digit[m]; P0=tab[d[m]];  
	delay(250);
    P0=0;
   }
}

/****************主函数main****************/
/*****实现P1^0输出周期50ms方波,P1^1输入该方波..****/ 
/**..因为这俩个脚比较靠近所以选择这两个引脚****/
/*..我们可以用金属线连接两个引脚,....*/
/**..从而可以实现本机产生本机测量************/
/***数码管显示方波的周期:单位ms**/
/***定时器0产生100us中断,定时器1产生25ms中断*****/
/***基本思路:****/
/**用计算一个脉冲周期内定时器0中断了多少次..***/
/***再用定时器的定时间隔乘以次数就能得到总的时间****/
//测试结果:数码管在 49-50 之间跳动
/************/
/*****************************/

main()
{
unsigned char i;
unsigned int snumber=0;  //周期: 单位ms
Init_Timer();
while(1)
	{
		snumber=0;	  	//先给个初值0,他用于累加十次测量值,..
						//..最后再除以10就可以了。
		for(i=0;i<10;i++)	  //累加十次测量结果
		{
			count=0;
			while(int0==0) ; 	//测周期长度 //先等待上升沿..
			TR0=1;              //..启动定时器0..
			while(int0==1) display();    //..等待下降沿..
			while(int0==0) display();    //..再等待上升沿..
			TR0=0;              //同时停止定时器0
			TH0=(256-92);  //设定定时常数,定时100us
 			TL0=(256-92);
			snumber=count+snumber;   //计算出有几个0.1ms,除以10即可后得到周期。
		}
		hextobcd(snumber/100);
	}
}


⌨️ 快捷键说明

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