请教,我做了一个测转速的程序,可是由于本人刚学不常时间有好多问题还不是很明白,请教高手指点!
我的思路是测一个脉冲的宽度,然后用time0测出时间,再倒成转速…… 可是它不显示!请教高手指点问题在哪里?
/***************************************************************/
/* */
/* 转速表 */
/* */
/***************************************************************/
#pragma DEBUG CODE
#include
sbit CS1 = P3^7;
sbit CS2 = P3^3;
sbit CS3 = P3^2;
sbit pin_SpeedSenser = P3^5; //速度接在P3^5上
#define TIME_CYLC 300 //12M晶振,定时器10ms 中断一次 我们3秒计算一次转速
// 3000ms/10ms = 300
#define K 1 //校准系数
unsigned char code seven_seg[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x71};
// 0 1 2 3 4 5 6 7 8 9 F
unsigned char data Disbuf[3]={0,0,0};// 显示缓冲区
unsigned int Tcounter = 0; //时间计数器
bit Flag_Fresh = 0; // 刷新标志
bit Flag_count = 0; //计算转速标志
bit Flag_Err = 0; //超量程标志
void Display(); //在数码管上显示一个三位数
void CountSpeed(); //计算转速,并把结果放入数码管缓冲区
void init_timer0(); //初始化定时器T0
void init_timer1(); //初始化定时器T1
void period(); //计算一个脉冲的周期
/**************************** 延时函数 ***********************************/
void Delay()
{
unsigned char i,j;
for(i=0;i<50;i++)
for(j=0;j<50;j++);
}
/**************************** 定时器T0中断 *******************************/
void it_timer0() interrupt 1
{
TF0 = 0; // 定时器T0 用于数码管的动态刷新
TH0 = 0xC0;
TL0 = 0x00;
Flag_Fresh = 1;
}
/**************************** 计数器T1中断 *********************************/
/*void it_timer1() interrupt 3
{
TF1 = 0;
Flag_Err = 1;
}
/*************************** 主函数 ****************************************/
void main(void)
{
init_timer0();
init_timer1();
while(1)
{
if(Flag_Fresh)
{
Flag_Fresh = 0;
Display(); // 定时刷新数码管显示
}; // 定时刷新数码管显示
period();
if(Flag_count)
{
Flag_count = 0;
CountSpeed(); //计算转速,并把结果放入数码管缓冲区
TH0=TL0 = 0x00;
}
if(Flag_Err) //超量程处理
{
Disbuf[0] = 0x71;
Disbuf[1] = 0x71;
Disbuf[2] = 0x71;
while(1)
{
Display();//不再测速 等待复位i
}
}
}
}
/***********************在数码管上显示一个三位数**************************/
void Display()
{
unsigned int i;
for(i=0;i<3;i++)
{
switch(i)
{
case 0: CS1=0;CS2=1;CS3=1;break;
case 1: CS1=1;CS2=0;CS3=1;break;
case 2: CS1=1;CS2=1;CS3=0;
}
P1=seven_seg[Disbuf];
Delay();
}
}
/******************计算转速,并把结果放入数码管缓冲区*************************/
void CountSpeed()
{
unsigned int period;
unsigned int speed ;
period = TH0*256 + TL0;
speed = (K/period)*(1E6);//K是时间系数
Disbuf[0] = speed/100;
Disbuf[1] = (speed-Disbuf[0]*100)/10;
Disbuf[2] = speed-Disbuf[0]*100-Disbuf[1]*10;
}
/***************************** 初始化定时器T0 *******************************/
void init_timer0()
{
// TMOD &= 0xD8;
// TMOD |= 0xF0; /* GATE0=0; C/T0#=0; M10=0; M00=1; */
TMOD |= 0x01;
TH0 = 0x00;
TL0 = 0x00;
ET0=1;
TR0=1;
EA=1;
}
/************************ 初始化定时器T1 **********************************/
void init_timer1()
{
TMOD=0x90; /* GATE0=0; C/T0#=1; M10=0; M00=1; */
TH1 = 0x00;
TL1 = 0x00;
ET1=1;
TR1=0;
EA=1;
}
/************************ 初始化定时器T1 **********************************/
void period(void)
{
//定时器/计数器1为方式1,GATE=1
TL1=0x00;
TH1=0x00;
while (pin_SpeedSenser==1); //等待低脉冲的到来
TR1=1; //GATE=1,TR1=1,当P3_7(INT1)=1开始计数
while (pin_SpeedSenser==0); //等待正脉冲的到来
while (pin_SpeedSenser==1);
TR1=0;
Flag_count = 1;
}
1、满足香农原理
2、其实你可以读取电平值,然后异或累加就可以实现测速
你这个方法不是很好