找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 52427|回复: 73
打印 上一主题 下一主题
收起左侧

完整的单片机霍尔测速程序+原理图

  [复制链接]
跳转到指定楼层
楼主
ID:81140 发表于 2016-6-30 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经本人编写的正确的霍尔测速程序以及正确的原理图
  1. /************霍尔测速仪******************/
  2. /****************************************/
  3. /****************************************/
  4. /**编写人:刘梦宇**/
  5. /**主控芯片:STC89C52RC**/
  6. /**晶振12MHZ**/
  7. #include<reg52.h>
  8. #include<intrins.h>
  9. #define uint8 unsigned char
  10. #define uint16 unsigned int
  11. #define CMD 0x00
  12. #define DAT 0x01
  13. #define DataPort P0//LCD数据口
  14. sbit RW=P2^6;         
  15. sbit RS=P2^5;
  16. sbit E=P2^7;
  17. uint16 N=0;
  18. uint8 C_50ms;
  19. uint8 Z=0;
  20. uint8 count=0;
  21. bit flag_1s=0;
  22. /**ms级延时子程序**/
  23. void delay(uint16 t)
  24. {
  25.         uint16 a;
  26.         for(;t>0;t--)
  27.                 for(a=123;a>0;a--);
  28. }
  29. /**LCD时序**/
  30. void write_LCD(uint8 dat,bit rs)
  31. {
  32.         E=0;
  33.         RW=0;
  34.         RS=rs;//选择指令or数据
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.         E=1;
  39.         _nop_();//delay(1);
  40.         _nop_();
  41.         _nop_();
  42.         DataPort=dat;//将数据送到LCD数据口
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         E=0;
  47.         delay(1);
  48. }
  49. /**LCD选择显示位置子函数**/
  50. void SetXY(uint8 x,uint8 y)
  51. {
  52.         x=x&0x0f;//防止X、Y        超过量程
  53.         y=y&0x01;
  54.         if(y)
  55.         {
  56.                 write_LCD(0x80+x,CMD);
  57.         }
  58.         else
  59.         {
  60.                 write_LCD(0xc0+x,CMD);
  61.         }
  62. }
  63. /**转速数值转换子函数**/
  64. void disload(uint16 a)
  65. {
  66.         SetXY(4,0);
  67.         write_LCD(a/1000+'0',DAT);
  68.         write_LCD(a%1000/100+'0',DAT);
  69.         write_LCD(a%100/10+'0',DAT);
  70.         write_LCD(a%10+'0',DAT);
  71.         write_LCD('r',DAT);
  72.         write_LCD('/',DAT);
  73.         write_LCD('m',DAT);
  74.         write_LCD('i',DAT);
  75.         write_LCD('n',DAT);
  76. }
  77. /**LCD字符指针函数**/
  78. void LCD_wrstr(uint8*str)
  79. {
  80.         while(*str!='\0')
  81.         {
  82.                 write_LCD(*str,DAT);
  83.                 str++;
  84.         }
  85. }
  86. /**初始化子程序**/
  87. void All_init()
  88. {
  89.         delay(500);
  90.         write_LCD(0x38,CMD);
  91.         write_LCD(0x38,CMD);
  92.         write_LCD(0x0c,CMD);
  93.         write_LCD(0x01,CMD);
  94.         delay(10);

  95.         SetXY(0,1);//设置标题显示位置
  96.         LCD_wrstr("Tachometer:");
  97.        
  98.         TMOD=0x01;//设置T0位工作方式1——作为16位定时器
  99.         ET0=1;//打开定时器0的中断
  100.         TR0=1;//打开定时器0
  101.         TH0=(65536-50000)/256;//装入初值
  102.         TL0=(65536-50000)%256;
  103.         IT0=1;//外部中断0为下降沿中断
  104.         EX0=1;//打开外部中断               
  105.         EA=1;//打开总中断
  106. }
  107. void main()
  108. {
  109.         All_init();//先进行初始化
  110.         while(1)
  111.         {
  112.                 if(flag_1s==1)
  113.                 {
  114.                         flag_1s=0;//1s标志位清零
  115.                         disload(N);
  116.                 }
  117.         }

  118. }
  119. /**定时器0中断服务子程序**/                                          
  120. void timer0() interrupt 1
  121. {
  122.         TH0=(65536-50000)/256;
  123.         TL0=(65536-50000)%256;
  124.         if(++C_50ms>19)
  125.         {
  126.                 EX0=0;//关闭外部中断0
  127.                 C_50ms=0;//定时1s之后C_50ms清零
  128.                 N=60*Z;//计算转速
  129.                 Z=0;//初始化圈数
  130.                 flag_1s=1;//1s标志位置1
  131.                 TH0=0x3c;//重新赋值
  132.                 TL0=0xb0;               
  133.                 EX0=1;//打开外部中断0,开始计数。
  134.         }
  135. }
  136. void wai0() interrupt 0
  137. {
  138.         count++;
  139.         if(count==2) //两次外部脉冲,电机转一圈。
  140.         {
  141.                 Z++;//转圈+1
  142.                 count=0;//初始计数值
  143.         }
  144.        
  145. }
复制代码

霍尔测速仪.pdf

176.55 KB, 下载次数: 544, 下载积分: 黑币 -5

原理图

正确的霍尔测速程序.doc

36.5 KB, 下载次数: 581, 下载积分: 黑币 -5

程序

评分

参与人数 5黑币 +68 收起 理由
sky日耀 + 4 很给力!
北冥2017 + 1 赞一个!
哎哟喂,懂了! + 8 共享资料的黑币奖励!
xinwuwobu + 5 正在学习这个感谢分享
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏40 分享淘帖 顶6 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-7-1 00:35 | 只看该作者
霍尔测速的好东东,对初学者很有帮助,51黑有你更精彩!!
回复

使用道具 举报

板凳
ID:105804 发表于 2016-7-1 07:01 | 只看该作者
为什么电阻没阻值?还有各元件的名称?
回复

使用道具 举报

地板
ID:81140 发表于 2016-7-5 08:55 | 只看该作者
奥斯特洛夫斯基 发表于 2016-7-1 07:01
为什么电阻没阻值?还有各元件的名称?

R4  470
R2、R3、R5  10K
电位器 104
忘标了  抱歉
回复

使用道具 举报

5#
ID:134543 发表于 2016-11-2 23:35 | 只看该作者
为什么程序是要弄到显示屏显示,觉得用串口打印出来显示可能更好便于调试吧!
不过还是不太懂霍尔传感器,霍尔传感器的接线是怎么接的?
回复

使用道具 举报

6#
ID:150203 发表于 2016-12-6 22:58 | 只看该作者
谢谢,感谢分享!
回复

使用道具 举报

7#
ID:170846 发表于 2017-3-15 11:15 | 只看该作者
确实很简洁,又实现了测速功能
回复

使用道具 举报

8#
ID:186742 发表于 2017-4-7 15:06 | 只看该作者
怎么仿真的时候一直是0000
回复

使用道具 举报

9#
ID:47286 发表于 2017-4-7 15:43 | 只看该作者
本帖最后由 dzbj 于 2017-4-7 15:47 编辑

现在常用的霍尔开关基本上是直接输出电位 不需要用三极管开关一下 片子可以直接采集脉冲

在初始化时钟时 开外部中断 然后设置成下降沿触发

void Chk_Rate()                //*转速检测
{
        if(num_ES>=20)                                        //如果 到达设定值(每5ms一个中断 总计100ms)
        {
                SD[6]=Rate_num;                                        //赋值 系统缓冲区位6值为当前采集到的int1触发次数
                Rate_num=0;                                                //频率采集计数器清零
                num_ES=0;                                                //计时器ES清零
        }
}

void Server_Int1() interrupt 2        //服务 外部中断1
{
        Rate_num++;                //频率计数器自加
}

然后处理SD[6]里的数据就可以了 我用100ms踩一次是为了兼容最大转速 一圈用12个磁点 最高转速7000/分 在一个8位下能满足最高转速的间隔也就100ms左右
实际显示时刷屏的间隔远大于100ms 不需要不断的刷新 小于200ms的刷新速率看着就有点别扭了 一般1s刷一次就可以 不需要采集转速时不调用"Chk_Rate()"函数 让它自己溢出 调用的时候 SD[6]每100ms被更新一次 到需要显示的时候肯定是准确的 而不是溢出后重新计入的
回复

使用道具 举报

10#
ID:171735 发表于 2017-4-9 13:24 | 只看该作者
学习一下,用来做小车测速!谢谢分享!
回复

使用道具 举报

11#
ID:171735 发表于 2017-4-10 18:27 | 只看该作者
洛水神仙 发表于 2017-4-10 15:23
真的帮上我的忙啦,拜谢楼主

能用吗?我试了下怎么都是整数的转速,60 12 180这些的。我使用开关型霍尔器件,VCC,GND,D0,A0这几个接口的,然后接到D0
回复

使用道具 举报

12#
ID:186410 发表于 2017-4-17 12:10 来自手机 | 只看该作者
哥,那个地方N=60*Z,可不可以给我解释为啥要乘60
回复

使用道具 举报

13#
ID:198621 发表于 2017-5-10 09:23 | 只看该作者
谢谢,正在学习了测速功能。
回复

使用道具 举报

14#
ID:203847 发表于 2017-6-7 15:39 | 只看该作者
我正在以这个学习测四路速度信号,结果改瞎了,还是没出来!!
回复

使用道具 举报

15#
ID:227565 发表于 2017-9-13 16:11 | 只看该作者
60hz 最高每分钟360转?
回复

使用道具 举报

16#
ID:130345 发表于 2017-9-21 19:18 | 只看该作者
试着做个玩玩
回复

使用道具 举报

17#
ID:89286 发表于 2017-9-22 07:29 | 只看该作者
thanks for sharing
回复

使用道具 举报

18#
ID:234574 发表于 2017-9-23 10:35 | 只看该作者
看下,自己写的出问题了,实际应用不过关
回复

使用道具 举报

19#
ID:238175 发表于 2017-10-10 03:00 | 只看该作者
可以搞个转速表
回复

使用道具 举报

20#
ID:227565 发表于 2017-10-25 15:25 | 只看该作者
柔情岁月 发表于 2017-9-13 16:15
60Hz 最高360一分钟?

后来重新测试了没问题!!!
回复

使用道具 举报

21#
ID:252315 发表于 2017-11-22 16:13 | 只看该作者
请问一下,这个霍尔元件型号是?
回复

使用道具 举报

22#
ID:260355 发表于 2017-12-11 20:48 | 只看该作者
现在就缺这个,能不能做个电动机测速表
回复

使用道具 举报

23#
ID:146834 发表于 2017-12-25 21:57 | 只看该作者
这是楼主程序仿真,

2017-12-25_215042.jpg (246.44 KB, 下载次数: 152)

2017-12-25_215042.jpg
回复

使用道具 举报

24#
ID:146834 发表于 2018-1-1 11:03 | 只看该作者
楼主的程序实物来了。测速是60    60 的跳,

IMG_20180101_102840.jpg (672.7 KB, 下载次数: 135)

IMG_20180101_102840.jpg

IMG_20180101_102722.jpg (701.2 KB, 下载次数: 124)

IMG_20180101_102722.jpg

IMG_20180101_102714.jpg (690.57 KB, 下载次数: 130)

IMG_20180101_102714.jpg

IMG_20180101_102923.jpg (632.07 KB, 下载次数: 143)

IMG_20180101_102923.jpg

IMG_20180101_102909.jpg (579.32 KB, 下载次数: 128)

IMG_20180101_102909.jpg
回复

使用道具 举报

25#
ID:270252 发表于 2018-1-2 20:15 | 只看该作者
这个程序导入单片机后显示0000,怎样能使数据变动
回复

使用道具 举报

26#
ID:270252 发表于 2018-1-2 20:18 | 只看该作者
急不可待 发表于 2018-1-1 11:03
楼主的程序实物来了。测速是60    60 的跳,

怎样让数据跳动起来
回复

使用道具 举报

27#
ID:146834 发表于 2018-1-2 22:24 | 只看该作者
1367826804 发表于 2018-1-2 20:15
这个程序导入单片机后显示0000,怎样能使数据变动

这个是测速软件。需要有转速,
回复

使用道具 举报

28#
ID:270252 发表于 2018-1-3 13:35 | 只看该作者
急不可待 发表于 2018-1-2 22:24
这个是测速软件。需要有转速,

测速怎样加,在单片机上加入线性霍尔传感器后,显示0000r/min,然后拿磁铁靠近时显示b/min
回复

使用道具 举报

29#
ID:138571 发表于 2018-1-3 15:07 | 只看该作者
下载下来,参考一下
回复

使用道具 举报

30#
ID:270252 发表于 2018-1-3 20:06 | 只看该作者
急不可待 发表于 2018-1-2 22:24
这个是测速软件。需要有转速,

这是线性霍尔传感器还是模拟霍尔传感器
回复

使用道具 举报

31#
ID:270252 发表于 2018-1-3 21:50 | 只看该作者
急不可待 发表于 2017-12-25 21:57
这是楼主程序仿真,

可以把这个仿真发我一份么
回复

使用道具 举报

32#
ID:146834 发表于 2018-1-4 22:20 | 只看该作者
仿真               

霍尔测速仿真1.zip

1.43 MB, 下载次数: 49, 下载积分: 黑币 -5

回复

使用道具 举报

33#
ID:308395 发表于 2018-4-21 16:10 | 只看该作者
1593275953 发表于 2017-5-24 10:28
**** 作者被禁止或删除 内容自动屏蔽 ****

是LCD显示
回复

使用道具 举报

34#
ID:313359 发表于 2018-4-21 21:11 | 只看该作者
谢谢楼主分享 学习了
回复

使用道具 举报

35#
ID:308395 发表于 2018-5-1 15:11 | 只看该作者
楼主,有PROTEUS仿真吗?
回复

使用道具 举报

36#
ID:308395 发表于 2018-5-4 08:47 | 只看该作者

你的压缩包里没有仿真图,只有.c文件
回复

使用道具 举报

37#
ID:322643 发表于 2018-5-5 10:57 | 只看该作者
急不可待 发表于 2017-12-25 21:57
这是楼主程序仿真,

楼主右下角 中断源是怎么搞的  模拟霍尔元件吗?
回复

使用道具 举报

38#
ID:261725 发表于 2018-5-30 22:17 | 只看该作者
楼主,如果我想直接用你的例程,但是原理图接口不一样,那我应该改哪些数据才能正确运行在我的开发板上啊?抱歉,我是新手,可能问了一个十分愚蠢的问题。

1.JPG (73.78 KB, 下载次数: 119)

52

52

2.JPG (23.7 KB, 下载次数: 114)

LCD

LCD

3.JPG (43.97 KB, 下载次数: 116)

模数

模数

4.JPG (40.91 KB, 下载次数: 120)

串行口

串行口
回复

使用道具 举报

39#
ID:110278 发表于 2018-5-31 20:01 | 只看该作者
材料很完整。。。
回复

使用道具 举报

40#
ID:357157 发表于 2018-6-24 10:40 | 只看该作者
看了这个之后很有启发。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表