设计与开发

单片机自行车测速 项目实战:51单片机霍尔自行车里程测速仪设计项目 原理图 程序

小编 2024-10-06 设计与开发 23 0

项目实战:51单片机霍尔自行车里程测速仪设计项目 原理图 程序

最近后台有小伙伴私信我说,我讲得都太基础了,有没有做过单片机霍尔传感器测速度相关的项目,我现在就把以前做的一个单片机霍尔自行车里程测速仪项目分享给大家。

这个也是我以前做过的一个项目,现在拿出来分享给大家,大家不用觉得难,不过就是硬件做基础,然后用软件代码去控制而已,只要按照教程一步步来做你就会发现其实很简单。

好了,针对此项目下面有几点说明

1、单片机是通用的无论51还是52、无论stc还是at都一样,引脚功能都一样。

程序也是一样的。

2、原理图中的.ddb、.Bkp等格式是要用protel打开的,没有软件的不要紧,

3、程序中的.c文件可以用记事本(文本文档)打开,就是程序了。其他的是写程序是自动生成的,没什么用的。

4、可以按照正面布局,不要按照实物的背面焊接,要按照原理图焊接。

数码管脚位排布说明:

正面朝自己,秒点在下,左下为1脚,逆时针排布,左上为最后一个脚!请坛友焊接前弄清脚位排布再焊接!祝你们成功!

废话不多说,直接上实物图:

霍尔自行车测速电路原理图:

元器件列表

单片机霍尔自行车里程测速仪参考源程序:

//说明1:P00—P07:a-----dp P27—P24:com1-----com4 P34切换显示 P32—INT0 一个磁钢

//说明2:此程序针对车轮周长为207cm,其他型号周长,可改变参数就行

//说明3:数码管从左至右 高------低

#include<reg51.h>

#include"juxun001.h"

//主函数=====================

void main()

{

time0_int0_init();//定时器0和外部中断0的初始化

while(!TR0) //上电一直未切割时就显示 0.0.0.0

{

init_display();

}

while(1)

{

if(!change)//按下切换按键显示里程

{

delay1m(5);

if(!change)

{

flag = ~flag;

}

while(!change);

}

}

}

//==定时器0中断函数

void time0_interrupt()interrupt 1

{

TL0 = (65536 - 5000) % 256;// 12M晶振,5ms定时

TH0 = (65536 - 5000) / 256;

display_function();

time_counter++;

time_counter8++;

if(time_counter8 >= 1600)//大于8s没切割,车子视为停下了,速度为:0,但里程还记着

{

time_counter8 = 0;

speed = 0;//速度为 0

point1 = 0;

buf1[3] = speed%10;buf1[2] = speed/10%10;

buf1[1] = speed/100%10;buf1[0] = speed/1000%10;

}

}

//==========外部中断0中断函数=

void int0_interrupt()interrupt 0

{

external_counter++;

if(external_counter ==1 )TR0 = ~TR0;//第一次切割打开定时器0

if(external_counter == 65535)external_counter = 0;

time_counter8 = 0; //只要8秒内有切割,车子就仍在运行

if(external_counter % 2 == 0)//切割2次 更新下速度

{ //*5是因为中断一次是5MS

if(flag10){speed =((ulong)(36000)*zhouchang)/(time_counter * 5);flag1=1;}

else if(flag11){speed =((ulong)(36000)2zhouchang)/(time_counter * 5);}//速度:单位为 m/h ,*1000的目的是不出现浮点数

if((speed >= 100)&&(speed < 1000)) //100 ---- 1000 3位整数

{

point1 = 1;buf1[3] = speed%10;buf1[2] = speed/10%10;

buf1[1] = speed/100%10;buf1[0] = 0;}

else if((speed >= 1000)&&(speed < 10000)) //1000 ---- 10000 4位整数

{

point1 = 1;speed = (uint)speed;

buf1[3] = speed%10;buf1[2] = speed/10%10;

buf1[1] = speed/100%10;buf1[0] = speed/1000%10;}

else if((speed >= 10000)&&(speed < 100000)) //10000 ----- 100000 5位整数

{

point1 = 2;

buf1[3] = speed/10%10;buf1[2] = speed/100%10;

buf1[1] = speed/1000%10;buf1[0] = speed/10000%10;}

else if((speed >= 100000)&&(speed < 1000000)) //100000 ------ 1000000 6位整数

{

point1 = 3;

buf1[3] = speed/100%10;buf1[2] = speed/1000%10;

buf1[1] = speed/10000%10;buf1[0] = speed/100000%10;}

time_counter = 0;

}

if(external_counter % 8 == 0)//每切割8次 更新下里程

{

s = (ulong)external_counter * zhouchang; //里程:单位为 cm

if((s >= 1000)&&(s < 10000))

{

point2 = 1; // 0.012 001212

buf2[3] = s/100%10;buf2[2] = s/1000%10;

buf2[1] = 0;buf2[0] = 0;}// 4位整数

else if((s >= 10000)&&(s < 100000))

{

point2 = 1;

buf2[3] = s/100%10;buf2[2] = s/1000%10;

buf2[1] = s/10000%10;buf2[0] = 0;}// 5位整数 0.123 012345

else if((s >= 100000)&&(s < 1000000))

{

point2 = 1;

buf2[3] = s/100%10;buf2[2] = s/1000%10;

buf2[1] = s/10000%10;buf2[0] = s/100000%10;} // 6位整数 1.234 1234 56

else if((s >= 1000000)&&(s < 10000000))

{

point2 = 2;

buf2[3] = s/1000%10;buf2[2] = s/10000%10;

buf2[1] = s/100000%10;buf2[0] = s/1000000%10;}// 7位整数 1234 567

else if((s >= 10000000)&&(s < 100000000))

{

point2 = 3;

buf2[3] = s/10000%10;buf2[2] = s/100000%10;

buf2[1] = s/1000000%10;buf2[0] = s/10000000%10;} // 8位整数 1234 5678

}

}

//==========开电源就显示的数据,初始显示速度

void init_display()

{

uchar i;

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

{

wei = bitcode[num - 1];

led = display1[buf1[num–]];

delay1m(4);

if(num == 0)num = 4;

}

}

//==显示函数=

void display_function()

{

if(flag == 0)//显示速度

{

switch(point1)

{

case 0:wei = bitcode[num-1];led = display1[buf1[num-1]];num–;break;//速度显示 0

case 1:if(num == 1){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num–;}

else { wei = bitcode[num-1];led = display1[buf1[num-1]];num–;}break;//最高位小数点亮

case 2:if(num == 2){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num–;}

else { wei = bitcode[num-1];led = display1[buf1[num-1]];num–;}break;//第二高位小数点亮

case 3:if(num == 3){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num–;}

else { wei = bitcode[num-1];led = display1[buf1[num-1]];num–;}break;//第三高位小数点亮

default:break;

}

if(num == 0)num = 4;

}

else if(flag == 1)//显示里程

{

switch(point2)

{

case 0:wei = bitcode[num-1];led = display1[buf2[num-1]];num–;break;//里程显示 0

case 1:if(num == 1){ wei = bitcode[num-1];led = 0x7f&display1[buf2[num-1]];num–;}

else { wei = bitcode[num-1];led = display1[buf2[num-1]];num–;}break;//最高位小数点亮

case 2:if(num == 2){ wei = bitcode[num-1];led = 0x7f&display1[buf2[num-1]];num–;}

else { wei = bitcode[num-1];led = display1[buf2[num-1]];num–;}break;//第二高位小数点亮

case 3:if(num == 3){ wei = bitcode[num-1];led = 0x7f&display1[buf2[num-1]];num–;}

else { wei = bitcode[num-1];led = display1[buf2[num-1]];num–;}break;//第三高位小数点亮

default:break;

}

if(num == 0)num = 4;

}

}

//=================定时器0和外部中断0的初始化函数=

void time0_int0_init()

{

TMOD |= 0x01;

TMOD &= 0xfd;//定时器0工作于方式1

TL0 = (65536 - 5000) % 256;//12M晶振,5ms定时

TH0 = (65536 - 5000) / 256;

IT0 = 1;//外部中断0,负跳变触发方式

TR0 = 0;

ET0 = 1;

EX0 = 1;

EA = 1;

}

//==========ms 级延时函数=

void delay1m(uchar x)

{

uchar i,j;

for(i=0;i<x;i++) //连数x次,约 x ms

for(j=0;j<120;j++); //数120 次,约1 ms

}

好了,以上就是这个项目的全部内容了。

最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,鉴于无法上传附件,如果需要完整代码或设计文件,请留言或私信我,看到后会第一时间回复。

谢谢!

51单片机直流电机测速Proteus仿真

今天准备分享的仿真是基于51单片机的直流电机测速Proteus仿真。仿真是在Proteus7.7软件下创建的,有需要的小伙伴下载后可以使用比7.7高的版本打开仿真源文件。

接下来上仿真静态图。

仿真电路图

老规矩首先还是分析一下电路。该仿真使用L298来驱动直流电机。L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。L298N的实物图是长这个样子的。

L298N

从仿真中具有电机驱动芯片可以看出来,这个仿真不但可以测速,还可以控制电机的转速。那剩下的部分就是人机交互接口了。显示部分使用的是PG160128A,液晶显示点阵是160X128的,可以显示更加丰富的内容。仿真中的输入设备为4X4矩阵键盘。剩下的就是虚拟示波器等测量工具。仿真电路很简单,接下来运行仿真看一下动态效果。

动态仿真

上电以后显示屏上介绍了该如何操作仿真进行测量。

显示器显示内容

仿真驱动部分

仿真可以控制电机正反转及PWM调速。这一部分使用的是单片机的P1.0和P1.1引脚。其中P1.0引脚主要作用是控制直流电机的正反转。仿真中P1.0引脚与L298的一个输入端口相连,同时该引脚经过反相器后去另外一个输入引脚相连,与输入引脚相对应的输出引脚直接与电机的电源相连,这样通过改变P1.0的状态就可以实现直流电机正反转的控制。而P1.1脚L298的A通道使能端口相连,该仿真中通过对P1.1引脚进行通断控制实现直流电机的调速。

仿真中将直流电机的脉冲输出端口与单片机的P3.4引脚相连,该引脚是定时器0的外部输入引脚。显示软件部分是使用定时器0完成的计数功能。仿真测得的转速与实际转速还是比较接近的。整理来说仿真效果还是不错的,仿真运行也是比较流畅的。

最后贴一下程序截图。程序使用的是KEIL C51UV2创建的工程,可以使用高一点的版本打开。主要包括两个部分,一个是主程序部分,一个是显示驱动部分。程序比较简单,不复杂,但是注释部分较少,有需要的小伙伴可以下载参考。

部分程序

如果有需要该仿真和程序的朋友可私信。该仿真源于网络。

相关问答

霍尔传感器怎么样来 测速 ,并如何连接 单片机 ?

霍尔传感器分为两类,1是开关型的,2是线性的,分别叫做开关霍尔和线性霍尔器件,与单片机连接要看你采集的是什么样的信号,如果你只需要开关信号的话,就用开关...

而是成为人们娱乐、休闲、锻炼的首选. 自行车测速 _作业帮

[最佳回答]Aspeople'slivingstandardsimprove,people'srequirementsforqualityoflifeincreasing,...

智能小车电路原理?

随着科技的不断进步,智能电子产品发展步骤不断加快,各种应用层次的机器人等大量出现,目前应用在智能小车或机器人的微控制器主要是8/16单片机或ARM和数字信号...

太阳能灯遥控器上的auto是什么开关_车坛

1、随机设置同时照明、分时照明、分时计时等多种工作模式,具有负载过流、短路保护。2、基于单片机的太阳能路灯控制器的设计可以实现12V和24V电池的...

霍尔传感器 测速 直流电机时,三个引脚该怎么接线?

他由启动电阻和工作电阻俩部分线圈组成一根接火线,一根接零线,还有一根通过电容和火线相连接的而一般我们看到的直流电机只有俩个线那是因为电容已经接好了...

ICS-14电子皮带秤原理是什么?

[回答]电子皮带秤由四个部分组成:1.称重桥架1套2.称重控制器(仪表)1台(含有4-20MA输出)3.称重传感器2只(知名专业厂家)测速传感器及测速辊筒1个结构特征:...

怎样制作5v脉冲信号

一.电机调速模块.我们的设计思路是先产生占空比可调的方波(方法有多种,一是用555构成多谐振荡器.二可以利用单片机产生PWM方波)+4功率器件构成的H...

如何让硬盘电机转起来,用什么驱动,硬盘是无刷电机,三根线的,我想用它电机做个陀螺仪?

线圈连接方式为星形。3根线的是将中性线封闭在电机里面不用的。4根线的就用到这个中性线。而且这种电机是无霍尔的,靠U,V,W3个线圈的涌浪来测速和自检相位的。...

三防设计指的是哪三方面-ZOL问答

单片机的汇编语言与PLC语言基本上差不多。能搞定一个,另一个就快了。PLC实现百日倒计时系统的设计基于PLC的音乐喷泉的设计基于单片机的电子密码锁设计基于...

修理测试设备哪家好-?

[回答]修理测试设备哪家好-?修理测试设备单片机的基础理论:单片机属于数字电路,其概念、术语、硬件结构和原理都源自数字电路,如果数字电路基础扎实,对复...

猜你喜欢