硬件方案
以 51 单片机为核心,A44E 霍尔传感器测转数,实现对自行车里程/速度的测量统计,采用 数码管实时显示自行车的里程数及速度。利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。
整体电路主要由51单片机最小系统,霍尔传感器电路,数码管显示电路,lm393比较电路,LED指示灯模块,按键电路;原理图如图:

设计功能
- 51单片机作为控制核心,驱动显示模块,驱动按键模块等,并利用霍尔传感器与磁铁获取脉冲信号。
- 4位共阳数码管为速度,距离显示模块,速度单位为 km/h,距离单位是 km。
- 设有一个按键来切换显示速度和距离。
主程序源码
//====================================主函数=========================================================
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(flag1==0){speed =((ulong)(36000)*zhouchang)/(time_counter * 5);flag1=1;}
else if(flag1==1){speed =((ulong)(36000)*2*zhouchang)/(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
}
}
资料链接:https://pan.baidu.com/s/1KYMELeBD3SB86bnx_GpLzQ?pwd=srsu
提取码:srsu

2万+

被折叠的 条评论
为什么被折叠?



