标题: 单片机霍尔自行车里程测速仪设计 论文 原理图 程序 PPT 制作详解都有 [打印本页]

作者: 51黑电子迷    时间: 2017-2-11 23:37
标题: 单片机霍尔自行车里程测速仪设计 论文 原理图 程序 PPT 制作详解都有
给51黑电子论坛的朋友们分享一个51单片机做的霍尔自行车里程测速仪,资料很全 程序 设计论文都有.

1、单片机是通用的无论51还是52、无论stc还是at都一样,引脚功能都一样。
   程序也是一样的。
2、原理图中的.ddb、.Bkp等格式是要用protelse打开的,没有软件的不要紧,
   我已帮您转换成word格式和pdf格式的了。
3、程序中的.c文件可以用记事本(文本文档)打开,就是程序了。其他的是写程序是自动
   生成的,没什么用的。
4、可以按照正面布局,不要按照实物的背面焊接,要按照原理图焊接。

数码管脚位排布说明:

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

视频密码:1234


http://player.youku.com/player.php/sid/XMTQxMzA0MzEwOA==/v.swf



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






单片机霍尔里程测速仪制作的ppt文档:



名称         参数          数量
电阻           3k              4
               10k             3
               360Ω           9
排阻           4k7            1
电位器         50k             1
电解电容       10uf            1

瓷片电容       30pf            2
               104pf           3
晶振           12m            1
三极管         8550            4
按键           按键            2
电源座子       电源座子        1
霍尔元件       3144            1
比较器         lm393           1
8IC                       1
LED           发光二极管      1
数码管         四位共阳        1
单片机         at89s52          1
40IC                      1
9*15cm          万用板          1
自锁开关                         1
Usb电源线                       1
磁铁                            1


霍尔自行车里程测速仪设计论文:


单片机霍尔自行车里程测速仪源程序:
  1. //时间:4月7日15:22:04
  2. //目的:学习编程
  3. //说明1:P00---P07:a-----dp   P27---P24:com1-----com4   P34切换显示   P32---INT0   一个磁钢
  4. //说明2:此程序针对车轮周长为207cm,其他型号周长,可改变参数就行
  5. //说明3:数码管从左至右  高------低
  6. #include<reg51.h>
  7. #include"juxun001.h"
  8. //====================================主函数=========================================================
  9. void main()
  10. {
  11.         time0_int0_init();//定时器0和外部中断0的初始化
  12.         while(!TR0)        //上电一直未切割时就显示  0.0.0.0
  13.         {
  14.                 init_display();
  15.         }
  16.         while(1)
  17.         {
  18.                 if(!change)//按下切换按键显示里程
  19.                 {
  20.                         delay1m(5);
  21.                         if(!change)
  22.                         {
  23.                                 flag = ~flag;
  24.                         }
  25.                         while(!change);               
  26.                 }
  27.          
  28.         }
  29. }

  30. //==================================定时器0中断函数================================
  31. void time0_interrupt()interrupt 1
  32. {
  33.         TL0 = (65536 - 5000) % 256;// 12M晶振,5ms定时
  34.         TH0 = (65536 - 5000) / 256;
  35.         display_function();
  36.         time_counter++;
  37.         time_counter8++;
  38.         if(time_counter8 >= 1600)//大于8s没切割,车子视为停下了,速度为:0,但里程还记着
  39.         {
  40.                 time_counter8 = 0;
  41.                 speed = 0;//速度为 0
  42.                 point1 = 0;
  43.                 buf1[3] = speed%10;buf1[2] = speed/10%10;
  44.                 buf1[1] = speed/100%10;buf1[0] = speed/1000%10;
  45.         }
  46. }
  47. //==================================外部中断0中断函数=========================
  48. void int0_interrupt()interrupt 0
  49. {        
  50.         
  51.         external_counter++;
  52.         if(external_counter ==1 )TR0 = ~TR0;//第一次切割打开定时器0
  53.         if(external_counter == 65535)external_counter = 0;
  54.         time_counter8 = 0; //只要8秒内有切割,车子就任在运行
  55.         
  56.         if(external_counter % 2 == 0)//切割2次 更新下速度
  57.         {                                                                         //*5是因为中断一次是5MS
  58.                  if(flag1==0){speed =((ulong)(36000)*zhouchang)/(time_counter * 5);flag1=1;}
  59.                 else if(flag1==1){speed =((ulong)(36000)*2*zhouchang)/(time_counter * 5);}//速度:单位为 m/h ,*1000的目的是不出现浮点数
  60.                
  61.                 if((speed >= 100)&&(speed < 1000))         //100 ---- 1000       3位整数
  62.                 {
  63.                         point1 = 1;buf1[3] = speed%10;buf1[2] = speed/10%10;
  64.                         buf1[1] = speed/100%10;buf1[0] = 0;}
  65.                 else if((speed >= 1000)&&(speed < 10000))   //1000 ---- 10000        4位整数
  66.                 {
  67.                         point1 = 1;speed = (uint)speed;
  68.                         buf1[3] = speed%10;buf1[2] = speed/10%10;
  69.                         buf1[1] = speed/100%10;buf1[0] = speed/1000%10;}
  70.                 else if((speed >= 10000)&&(speed < 100000))          //10000 ----- 100000      5位整数
  71.                 {
  72.                         point1 = 2;
  73.                         buf1[3] = speed/10%10;buf1[2] = speed/100%10;
  74.                         buf1[1] = speed/1000%10;buf1[0] = speed/10000%10;}
  75.                 else if((speed >= 100000)&&(speed < 1000000))  //100000 ------ 1000000    6位整数
  76.                 {
  77.                         point1 = 3;
  78.                         buf1[3] = speed/100%10;buf1[2] = speed/1000%10;
  79.                         buf1[1] = speed/10000%10;buf1[0] = speed/100000%10;}
  80.                 time_counter = 0;
  81.         }
  82.         if(external_counter % 8 == 0)//每切割8次 更新下里程
  83.         {
  84.                  s = (ulong)external_counter * zhouchang;  //里程:单位为   cm
  85.                 if((s >= 1000)&&(s < 10000))
  86.                 {
  87.                         point2 = 1;                                                                                                   //  0.012    001212
  88.                         buf2[3] = s/100%10;buf2[2] = s/1000%10;
  89.                         buf2[1] = 0;buf2[0] = 0;}//   4位整数
  90.                 else if((s >= 10000)&&(s < 100000))
  91.                 {
  92.                         point2 = 1;
  93.                         buf2[3] = s/100%10;buf2[2] = s/1000%10;
  94.                         buf2[1] = s/10000%10;buf2[0] = 0;}//     5位整数           0.123         012345
  95.                 else if((s >= 100000)&&(s < 1000000))
  96.                 {
  97.                         point2 = 1;
  98.                         buf2[3] = s/100%10;buf2[2] = s/1000%10;
  99.                         buf2[1] = s/10000%10;buf2[0] = s/100000%10;} //    6位整数         1.234    1234 56
  100.             else if((s >= 1000000)&&(s < 10000000))
  101.                 {
  102.                         point2 = 2;
  103.                         buf2[3] = s/1000%10;buf2[2] = s/10000%10;
  104.                         buf2[1] = s/100000%10;buf2[0] = s/1000000%10;}//     7位整数          1234 567
  105.                 else if((s >= 10000000)&&(s < 100000000))
  106.                 {
  107.                         point2 = 3;
  108.                         buf2[3] = s/10000%10;buf2[2] = s/100000%10;
  109.                         buf2[1] = s/1000000%10;buf2[0] = s/10000000%10;} //     8位整数                 1234 5678
  110.         }
  111. }
  112. //==================================开电源就显示的数据,初始显示速度========================
  113. void init_display()
  114. {
  115.         uchar i;
  116.         for(i = 0;i < 4;i++)         
  117.         {
  118.                 wei = bitcode[num - 1];
  119.                 led = display1[buf1[num--]];
  120.                 delay1m(4);
  121.                 if(num == 0)num = 4;
  122.         }
  123. }
  124. //====================================显示函数===================================
  125. void display_function()
  126. {
  127.         if(flag == 0)//显示速度
  128.         {
  129.                 switch(point1)
  130.                 {
  131.                         case 0:wei = bitcode[num-1];led = display1[buf1[num-1]];num--;break;//速度显示 0
  132.                         case 1:if(num == 1){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num--;}
  133.                                    else { wei = bitcode[num-1];led = display1[buf1[num-1]];num--;}break;//最高位小数点亮
  134.                         
  135.                         case 2:if(num == 2){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num--;}
  136.                                    else { wei = bitcode[num-1];led = display1[buf1[num-1]];num--;}break;//第二高位小数点亮
  137.                         
  138.                         case 3:if(num == 3){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num--;}
  139.                                    else { wei = bitcode[num-1];led = display1[buf1[num-1]];num--;}break;//第三高位小数点亮
  140.                         default:break;        
  141.                         
  142.                 }
  143.                 if(num == 0)num = 4;
  144.          }
  145.         else if(flag == 1)//显示里程
  146.    {
  147.                 switch(point2)
  148.                 {
  149.                         case 0:wei = bitcode[num-1];led = display1[buf2[num-1]];num--;break;//里程显示 0
  150.                         
  151.                         case 1:if(num == 1){ wei = bitcode[num-1];led = 0x7f&display1[buf2[num-1]];num--;}
  152.                                    else { wei = bitcode[num-1];led = display1[buf2[num-1]];num--;}break;//最高位小数点亮
  153.                         
  154.                         case 2:if(num == 2){ wei = bitcode[num-1];led = 0x7f&display1[buf2[num-1]];num--;}
  155.                                    else { wei = bitcode[num-1];led = display1[buf2[num-1]];num--;}break;//第二高位小数点亮
  156.                
  157.                         case 3:if(num == 3){ wei = bitcode[num-1];led = 0x7f&display1[buf2[num-1]];num--;}
  158.                                    else { wei = bitcode[num-1];led = display1[buf2[num-1]];num--;}break;//第三高位小数点亮
  159.                         default:break;        
  160.                         
  161.                 }
  162.                 if(num == 0)num = 4;
  163.    }
  164. }
  165. //=================================定时器0和外部中断0的初始化函数=================
  166. void time0_int0_init()
  167. {
  168.         TMOD |= 0x01;
  169.         TMOD &= 0xfd;//定时器0工作于方式1
  170.         TL0 = (65536 - 5000) % 256;//12M晶振,5ms定时
  171.         TH0 = (65536 - 5000) / 256;
  172.         IT0 = 1;//外部中断0,负跳变触发方式
  173.         TR0 = 0;
  174.         ET0 = 1;
  175.         EX0 = 1;
  176.         EA = 1;
  177. }
  178. //====================================ms 级延时函数===========================
  179. void delay1m(uchar x)
  180. {
  181.     uchar i,j;
  182.     for(i=0;i<x;i++)      //连数x次,约 x ms
  183.               for(j=0;j<120;j++);   //数120 次,约1 ms
  184. }
复制代码


51单片机霍尔自行车里程测速仪设计全部资料下载(包含完整的论文):
基于单片机霍尔自行车里程测速仪.zip (4.82 MB, 下载次数: 696)


作者: mllwj    时间: 2017-3-6 14:26
非常感谢,学习了!
作者: faridzled    时间: 2017-3-6 19:15
thanks for sharing
作者: plj213    时间: 2017-3-8 13:48
非常感谢,学习了!
作者: imxuheng    时间: 2017-3-8 21:40
用霍尔元件测速时最好还是用几个霍尔元件并联,这样的信号响应更好
作者: ryang    时间: 2017-4-1 17:56
支持下楼主
作者: kevintang    时间: 2017-4-12 20:31

 非常感谢,学习了!
作者: 524559515    时间: 2017-4-16 21:20
厉害了
作者: dianqi    时间: 2017-4-25 16:10
学习了
作者: duanyun    时间: 2017-4-25 17:38
更合适的佛皮革及哦啊饿哦几个囧事日两个案件时光
作者: linnyshow    时间: 2017-4-26 19:11
很不错的。。。很好。
作者: a15566    时间: 2017-6-26 16:42
非常感谢,学习了!
作者: linnyshow    时间: 2017-6-28 18:31
内容挺多的。
作者: 15060517106    时间: 2017-7-2 12:17
谢谢!!!!!!!!!!!!!!!!!
作者: 寻隐者    时间: 2017-9-13 19:24
谢谢
作者: midas    时间: 2017-9-15 04:04
非常感谢,正好在做相关的东西,受教!
作者: 窝咔咔咔    时间: 2017-10-29 11:36
谢谢,学习啦

作者: 窝咔咔咔    时间: 2017-10-29 12:21
谢谢。真的需要
作者: 练氏    时间: 2017-10-29 14:56
请问,测速的原理是?霍尔传感器在这边起到什么作用?是通过什么来感知速度大小的?
作者: WHALE39    时间: 2017-11-17 17:39
请问如果需要多个按键可以吗?霍尔元件在proteus里面是不是可以用clock来替代?
作者: 1773506379    时间: 2017-11-20 15:17
牛死了
作者: 急不可待    时间: 2017-12-11 22:33
谢谢分享,               
作者: nanning321    时间: 2018-1-14 13:26
学习学习
作者: xpxh    时间: 2018-3-6 14:55
感谢分享
作者: 17347363162    时间: 2018-4-14 10:20
谢谢分享
作者: yaq1993    时间: 2018-4-18 20:04
很不错 学习了
作者: tieq1952    时间: 2018-4-20 07:29
正需要。新近买了一辆电动自行车,无里程表和测速器,准备自制。这个帖子正好满足需要,就不用自己再设计了。
作者: yy960901    时间: 2018-6-11 16:37
练氏 发表于 2017-10-29 14:56
请问,测速的原理是?霍尔传感器在这边起到什么作用?是通过什么来感知速度大小的?

胡尔传感器用来测转数

作者: yy960901    时间: 2018-6-11 18:16
楼主很厉害

作者: yzk123    时间: 2018-6-14 09:19
赞一个
作者: cx64567554    时间: 2018-10-7 15:55
学到了学到了 非常感谢
作者: 一片微笑海ぐ    时间: 2018-11-13 08:47
厉害  支持
作者: 核芯    时间: 2018-11-13 12:36
谢谢!学习了!
作者: ky2020    时间: 2018-12-10 09:24
楼主非常感谢,我正需要这个资料
作者: ky2020    时间: 2018-12-29 16:03
这个霍尔传感器在proteus中怎么仿真,在哪个引脚
作者: zhangkunjn    时间: 2018-12-30 10:18
只有89C2051,看来要改电路和程序,参考下,谢谢
作者: bg3irm    时间: 2018-12-30 10:55
收藏了,学习学习。
作者: a5863959    时间: 2019-1-5 13:17
正在做相关课程设计,赞一个
作者: sioo    时间: 2019-1-6 19:54
非常感谢,学习了!
作者: 峙友    时间: 2019-3-31 13:16
感谢分享!
作者: hello8520    时间: 2019-4-7 08:59
请求帮助,感谢分享!
作者: hello8520    时间: 2019-4-7 13:58
大神,我要继续学习
作者: taQ    时间: 2019-4-16 23:00
攒一个
作者: 陈兜枕    时间: 2019-5-21 11:35
楼主好人
作者: 1112222545    时间: 2019-5-26 16:36
感谢分享
作者: zhangxiaohua    时间: 2019-5-26 16:59
很不错,新手上路
作者: 995695001    时间: 2019-5-31 15:27
受用了
作者: green小草莓    时间: 2019-10-21 17:56
超速报吗
作者: wshengxx    时间: 2019-10-29 16:49
很详细
作者: daiya    时间: 2019-11-15 11:16
非常感谢,愿好人一生平安!
作者: Gaa    时间: 2020-3-17 14:57
正好需要,感谢
作者: 精神小伙丿    时间: 2020-4-4 15:04
感谢楼主分享
作者: 双赢电子    时间: 2020-4-4 19:46
早就想做一个这样的测试仪表,就是没时间设计,楼主分享了成品,多谢楼主了,下载了,有时间做一个安在车上。再次感谢
作者: zxopenljx    时间: 2020-5-6 16:13
感谢楼主分享
作者: dilongking    时间: 2020-9-28 15:13
这用AT的单片机可以吗?为什么都是在用的STC的?
作者: 873113058    时间: 2020-11-19 13:57
遇到这个情况怎么办呀

51hei截图20201119135644.png (152.73 KB, 下载次数: 196)

51hei截图20201119135644.png

作者: 51hei团团    时间: 2020-11-19 15:51
873113058 发表于 2020-11-19 13:57
遇到这个情况怎么办呀



电路原理图sch文件要用AD打开

作者: 873113058    时间: 2020-11-20 13:01
51hei团团 发表于 2020-11-19 15:51
电路原理图sch文件要用AD打开

好的谢谢 有用啦

作者: 873113058    时间: 2020-11-25 10:44
有仿真文件吗





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1