用单片机C51中的计数器来测霍尔传感器转一圈的时间程序

请求大神们尽量给出详细程序,

#include<reg52.h>

#include<Star1602.h>

#define CIRCLE 1.8 //宏定义 车轮的周长(这个要根据实际的车轮进行设置)

sbit Signal = P1^0; //这里的Signal表示的是霍尔传感器的信号引脚

int m_second=0; //定义变量m_second,用来记录时间(以毫秒为单位)

float speed=0.0 ; //定义速度变量

float length=0.0 ;//定义路程变量

void main()

{

lcd_init(); //初始化液晶函数

TMOD = 0x01; //打开定时器0,并设定其工作方式为16位定时模式。

TH0=(65536-10000)/ 256;

TL0=(65536-10000)% 256; //设定定时器的初值,使得没10ms中断一次

EA = 1; //允许总中断

ET0 = 1; //允许定时器0终端

TR0 = 1; //启动定时器0

while(1) //大循环

{

while(Signal); //等待霍尔传感器信号线拉低;

speed = CIRCLE *1000 / m_second ; //计算速度。

m_second = 0; //计时清零

length += CIRCLE ; //路程加一个车轮周期

//第一行,显示速度

lcd_pos(0x0); //设定液晶的写入位置为第一行第一格

lcd_wdat(‘S’);

lcd_wdat(‘p’);

lcd_wdat(‘e’);

lcd_wdat(‘e’);

lcd_wdat(‘d’);

lcd_wdat(‘:’);

lcd_wdat( (int)speed%10 ); //显示速度的整数部分

lcd_wdat( (int)(speed*10)%10 ); //显示速度的小数第一位

lcd_wdat( (int)(speed*100)%10 ); //显示速度的小数第二位

lcd_wdat(‘m’);

lcd_wdat(‘/’);

lcd_wdat(‘s’);

//第二行,显示里程

lcd_pos(0x80); //设定液晶的写入位置为第二行第一格

lcd_wdat(‘L’);

lcd_wdat(‘e’);

lcd_wdat(‘n’);

lcd_wdat(‘g’);

lcd_wdat(‘t’);

lcd_wdat(‘h’);

lcd_wdat(‘:’);

lcd_wdat(length /10000+0x30); //显示里程的万位;

lcd_wdat(length %10000/1000+0x30); //显示里程的千位;

lcd_wdat(length %1000/100+0x30); //显示里程的百位;

lcd_wdat(length %100/10+0x30); //显示里程的十位;

lcd_wdat(length %10+0x30); //显示里程的个位;

lcd_wdat(‘m’);

}

}

void timer0_intt() interrupt 1 //

{

TH0=(65536-10000)/ 256;

TL0=(65536-10000)% 256; //设定定时器的初值,使得没10ms中断一次

m_second += 10; //因为中断每10毫秒一次,所以这里每次加10;

}

附件1 Star1602.h
#ifndef __STAR1602_H__

#define __STAR1602_H__

sbit rs= P2^0; //

sbit rw = P2^1; //

sbit ep = P2^2; //

void lcd_init(); //液晶初始化函数

void lcd_pos(unsigned char pos); //设定液晶的显示位置函数

void lcd_wdat(unsigned char dat); //液晶写入字符

void lcd_write_int(unsigned int x); //液晶显示一个整形变量

#endif

附件2 Star1602.c
#include <reg52.h>

#include "1602.h"

/*****************************************************************************

函数功能:LCD延时子程序

入口参数:ms

出口参数:

*****************************************************************************/

static void delay(unsigned char ms)

{

unsigned char i;

while(ms--)

{

for(i = 0; i< 5; i++);

}

}

/*****************************************************************************

函数功能:测试LCD忙碌状态

入口参数:

出口参数:result

*****************************************************************************/

static bit lcd_bz()

{

bit result;

rs = 0;

rw = 1;

ep = 1;

delay(5);

result = (bit)(P0 & 0x80);

ep = 0;

return result;

}

/*****************************************************************************

函数功能:写指令数据到LCD子程序

入口参数:cmd

出口参数:

*****************************************************************************/

static void lcd_wcmd(unsigned char cmd)

{

while(lcd_bz()); //判断LCD是否忙碌

rs = 0;

rw = 0;

ep = 0;

delay(5);

P0 = cmd;

delay(5);

ep = 1;

delay(5);

ep = 0;

}

/*****************************************************************************

函数功能:设定显示位置子程序

入口参数:pos

出口参数:

*****************************************************************************/

void lcd_pos(unsigned char pos)

{

lcd_wcmd(pos | 0x80);

}

/*****************************************************************************

函数功能:写入显示数据到LCD子程序

入口参数:dat

出口参数:

*****************************************************************************/

void lcd_wdat(unsigned char dat)

{

while(lcd_bz()); //判断LCD是否忙碌

rs = 1;

rw = 0;

ep = 0;

P0 = dat;

delay(5);

ep = 1;

delay(5);

ep = 0;

}

/*****************************************************************************

函数功能:LCD初始化子程序

入口参数:

出口参数:

*****************************************************************************/

void lcd_init()

{

lcd_wcmd(0x38);

delay(100);

lcd_wcmd(0x0c);

delay(100);

lcd_wcmd(0x06);

delay(100);

lcd_wcmd(0x01);

delay(100);

}

/*****************************************************************************

函数功能:LCD写入一个整形数据

入口参数:int x

*****************************************************************************/

void lcd_write_int(unsigned int x);

{

unsigned char x1,x2,x3,x4,x5;

x1 = x/10000;

x2=x%10000/1000;

x3=x%1000/100;

x4=x%100/10;

x5=x%10;
lcd_wdat(x1+0x30);

lcd_wdat(x2+0x30);

lcd_wdat(x3+0x30);

lcd_wdat(x4+0x30);

lcd_wdat(x5+0x30);

}追问

大神你给的资料很全,本来我想要简单的,就是霍尔扫描到磁片产生的脉冲,当扫描到第一次,通过单片机来开始计时,当脉冲第二次扫描到时,计算出其转一圈的时间,并清零继续测时间。意思就是计算出脉冲一周期的时间。
如果大神会的话,能改改更好。现在我先采纳吧,

温馨提示:答案为网友推荐,仅供参考
相似回答