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

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

#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 = 0i<5i++)

}

}

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

函数功能:测试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)

}

霍尔电流电压传感器的工作原理

原边电流Ip产生的磁通量聚集在磁路中,并由霍尔器件检测出霍尔电压信号,经过放大器放大,该电压信号精确地反映原边电流。 磁平衡霍尔电流传感器 原边电流Ip产生的磁通量与霍尔电压经放大产生的副边电流Is通过副边线圈所产生的磁通量相平衡。副边电流Is精确地反映原边电流。 磁平衡霍尔电压传感器 原边电压Vp通过原边电阻R1转换为原边电流Ip,Ip产生的磁通量与霍尔电压经放大产生的副边电流Is通过副边线圈产生的磁通量相平衡。副边电流Is精确地反映原边电压。 霍尔电流电压传感器特点》》》 ◎直测式霍尔电流传感器(50A……10000A) Ⅰ、测量频率: 0……50KHz Ⅱ、反应时间: <7uS Ⅲ、线性度: 1% Ⅳ、电源耗电少 ◎磁平衡霍尔电流传感器(1A……1000A) Ⅰ、测量频率: 0……150KHz Ⅱ、精度: 0.2% Ⅲ、反应时间: <1uS Ⅳ、线性度好: 0.1% ◎ 磁平衡霍尔电压传感器 Ⅰ、测量频率: 0……20KHz Ⅱ、线性度好: 0.1% Ⅲ、反应时间: 40uS 使用传感器模块注意事项》》》 ◎传感器模块在使用时,应先接通副边电源,再接通原边电流或电压。 ◎在选用传感器模块时,要根据测量范围、精度、反应时间及接线方式等参数,选用不同型号的传感器。 ◎测量电流时,最好使用单根导线充满传感器模块孔径,以便得到最佳的动态性能和灵敏度。 ◎传感器模块的最佳测量精度是额定值下测得的,当测量值低于额定值时,原边用多匝绕线,使总的安匝数接近额定值,从而获得最佳测量精度。 ◎电流母线温度不得超过100度。

void disp_count(void)

{

//-------------------------------------数值转换:

r = 50

//zhuan = zhuan * 2 * 314 * r *36 //数值过大,会溢出

zhuan = zhuan * 1130400 //简化写法,数字过大,会溢出

//-------------------------------------下面的不用变:

display[9]=(zhuan/1000+'0')//转换转速的千位

display[10]=(zhuan/100%10+'0')//转换转速的百位

display[11]=(zhuan/10%10+'0')//转换转速的十位

display[12]=(zhuan%10+'0') //转换转速的个位

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11208985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存